Платформа разработки zigbee Internet of Things (Промышленный Интернет вещей)
Платформа разработки zigbee Internet of Things (Промышленный Интернет вещей)

Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.

1. Обзор Тогда какZigBeeтехнология, подходящая дляданныеОсобенности системы сбора, Предложил проект системы сбора данных на базе ZigBee. Сосредоточьтесь на аппаратном обеспечении и сетевом дизайне узлов ZigBee. И подробно рассмотрена аппаратная схема узла сбора данных на базе микросхемы CC2530, При проектировании сети координатор устанавливает сеть, и узлы присоединяются к сети. и методы разработки программного обеспечения для систем сбора данных. Наконец, благодаря эксперименту по сбору данных с датчиков сети ZigBee, Доказано, что данная схема позволяет добиться хорошего коммуникационного эффекта. 1.1 Описание системы Используйте сенсорную сеть, шлюз и сервер ZigBee для реализации простой системы сбора данных. В проекте используются три типа датчиков: датчик температуры и влажности, датчик дыма и датчик освещенности. После того, как датчик терминального узла соберет данные и отправит их координатору, координатор отправляет данные компьютерному клиенту через последовательный порт. Наконец, компьютерный клиент использует сокет для инкапсуляции данных датчика, отправленных из последовательного порта, в формат http. а затем использует метод post. Отправляется на сервер и сохраняется в базе данных. Клиент обращается к серверу для получения данных и их отображения. 1.2 Введение в структуру системы


Рис. 1. Структурная схема системы. Как показано на рисунке 1, эта система в основном состоит из четырех частей: сенсорного узла, координатора, шлюза, сервера и клиента. Сенсорная часть собирает данные о температуре, влажности, горючем газе и освещенности. Сеть сенсорного узла Zigbee осуществляется с использованием стека протоколов Zstack, а язык C используется для управления портом ввода-вывода терминального узла Zigbee для сбора данных датчиков, а затем координатор загружает данные в шлюз через последовательный порт. Часть шлюза получает данные датчиков от координатора через последовательный порт, анализирует данные, полученные из последовательного порта, и инкапсулирует данные в формат http для удаленной отправки данных на сервер по почте. Клиент использует Python для получения данных с сервера и разрабатывает графический интерфейс для отображения данных. 1.3 Платформа разработки программного и аппаратного обеспечения программное обеспечение: VMware Workstation(linux OS) TCP&UDPИнструмент тестирования(тест) Configure Virtual Serial Port Водитель (тест) IAR Embedded Workbench(CC2530 датчик) sublime(C шлюз) IntelliJ IDEA 2017.1.1(JAVA сервер) JetBrains CLion 2016.3.4(Python показывать) xampp (база данных) Помощник по отладке последовательного порта (тест) Аппаратное обеспечение: датчик температуры и влажности, датчик освещенности, датчик горючих газов, макетная плата CC2530*4. 1.4 Реализовать функцию Собирайте данные об окружающей среде с помощью датчиков, обрабатывайте собранные данные и отображайте их клиенту. Клиент может запросить изменения данных в определенный день. 2 План проектирования системы Формат данных: • FF00 01 0600 1A 27 • FF00: сумка с логотипом 2Byte • 01: Тип датчика 1Byte • 0600: короткий адрес 2Byte • 1A27: данные датчика 1А: Температура 26 27: Влажность 39 • Тип датчикаданныеразмер • Температура и влажность PACKET_DHT11_DATA_SIZE 2byte • Светочувствительный PACKET_PHOTORESUSTANCE_DATA_SIZE 1byte • горючий газ PACKET_COMBUSTIBLEGAS_DATA_SIZE 1byte 3 Системная реализация (Общие детали реализации проекта, процессы каждого модуля и ключевые коды) Сенсорная часть: Общий процесс:

Сенсорный узел подключен к сети координатора и инкапсулирует данные. датчика

Язык кода:javascript
копировать
 if ( event & MY_REPORT_EVT )      // Обработка триггера события MY_REPORT_EVT
  {
    if ( appState == APP_REPORT ) 
    {
      pData[PACKET_FLAG_OFFSET] = PACKET_L_FLAG;
      pData[PACKET_FLAG_OFFSET + 1] = PACKET_H_FLAG;
      pData[PACKET_SENSOR_SHORT_ADDR_OFFSET] = (NLME_GetShortAddr() & 0xff);
      pData[PACKET_SENSOR_SHORT_ADDR_OFFSET + 1] = (NLME_GetShortAddr() >> 8);
#if PACKET_SENSOR_TYPE == PACKET_DHT11
    dht11_update(); 
    pData[PACKET_SENSOR_TYPE_OFFSET] = PACKET_DHT11;
    pData[PACKET_SENSOR_DATA_OFFSET] = dht11_temp();
    pData[PACKET_SENSOR_DATA_OFFSET + 1] = dht11_humidity();
#elif PACKET_SENSOR_TYPE == PACKET_PHOTORESUSTANCE
    pData[PACKET_SENSOR_TYPE_OFFSET] = PACKET_PHOTORESUSTANCE;
    pData[PACKET_SENSOR_DATA_OFFSET] = HalAdcRead (HAL_ADC_CHN_AIN1,HAL_ADC_RESOLUTION_8);
#else
    pData[PACKET_SENSOR_TYPE_OFFSET] = PACKET_COMBUSTIBLEGAS;
    pData[PACKET_SENSOR_DATA_OFFSET] = HalAdcRead (HAL_ADC_CHN_AIN1,HAL_ADC_RESOLUTION_8);

Загрузить структуру пакета 【сумка с логотипом】【Тип датчика】【короткий адрес】【данные】 сумка с логотипом 2Byte FF00 Тип датчика Температура и влажность 2byte Тип датчикасерийный номер 01 Светочувствительный 1byte Тип датчикасерийный номер 02 горючий газ 1byte Тип датчикасерийный номер 03 Отправить пакет координатору

Язык кода:javascript
копировать
#if PACKET_SENSOR_TYPE == PACKET_DHT11
      zb_SendDataRequest( 0xFFFE, SENSOR_REPORT_CMD_ID, PACKET_BASE_SIZE + PACKET_DHT11_DATA_SIZE, pData, 0, AF_TX_OPTIONS_NONE, 0 );
#elif PACKET_SENSOR_TYPE == PACKET_PHOTORESUSTANCE
      zb_SendDataRequest( 0xFFFE, SENSOR_REPORT_CMD_ID, PACKET_BASE_SIZE + PACKET_PHOTORESUSTANCE_DATA_SIZE, pData, 0, AF_TX_OPTIONS_NONE, 0 );
#else
      zb_SendDataRequest( 0xFFFE, SENSOR_REPORT_CMD_ID, PACKET_BASE_SIZE + PACKET_COMBUSTIBLEGAS_DATA_SIZE, pData, 0, AF_TX_OPTIONS_NONE, 0 );

Координатор получает пакет данных и загружает его через последовательный порт.

Язык кода:javascript
копировать
void zb_ReceiveDataIndication( uint16 source, uint16 command, uint16 len, uint8 *pData  )
{ 
  HalUARTWrite(HAL_UART_PORT_0, pData, len);
}

Координатор получает команду, отправленную шлюзом, и принимает решение о команде перед отправкой ее на сенсорный узел.

Язык кода:javascript
копировать
  while (Hal_UART_RxBufLen(port))		//Рассчитываем и возвращаем длину приемного буфера
  {
    len = HalUARTRead (port, pBuf, RX_BUF_LEN);
    HalUARTWrite (port, pBuf, len);
    if(len >= PACKET_BASE_SIZE 
       && pBuf[PACKET_FLAG_OFFSET] == PACKET_L_FLAG 
         && pBuf[PACKET_FLAG_OFFSET + 1] == PACKET_H_FLAG)
    {
      zb_SendDataRequest( *(uint16 *)(pBuf + PACKET_SENSOR_SHORT_ADDR_OFFSET), OPERATION_CMD_ID, len, pBuf, 0, AF_TX_OPTIONS_NONE, 0 );
    }
  }

Структура пакета команд 【сумка с логотипом】【Инструкции по эксплуатации】【Соответствующий датчик короткий адрес】 сумка с логотипом 2Byte FF00 Инструкции по эксплуатации 1Byte 01 Светодиод горит 02 Светодиод выключен 03 Инверсия состояния светодиода 04 светодиод мигает Соответствующий датчик короткий адрес 2Byte Сенсорный узел получает пакет данных управления координатора и анализирует его, чтобы ответить соответствующим образом.

Язык кода:javascript
копировать
void zb_ReceiveDataIndication( uint16 source, uint16 command, uint16 len, uint8 *pData  )
{
  if(len >= PACKET_BASE_SIZE 
     && pData[PACKET_FLAG_OFFSET] == PACKET_L_FLAG 
     && pData[PACKET_FLAG_OFFSET + 1] == PACKET_H_FLAG
     && *(uint16 *)(pData + PACKET_SENSOR_SHORT_ADDR_OFFSET) == NLME_GetShortAddr())
  {
    switch(pData[PACKET_OPERATION_TYPE_OFFSET])
    {
      case PACKET_ON:
        HalLedSet( HAL_LED_1, HAL_LED_MODE_ON );
        break;
      case PACKET_OFF:
        HalLedSet( HAL_LED_1, HAL_LED_MODE_OFF );
        break;
      case PACKET_TOGGLE:
        HalLedSet( HAL_LED_1, HAL_LED_MODE_TOGGLE );
        break;
      case PACKET_BLINK:
        HalLedBlink(HAL_LED_1, 0, 50, 500);
        break;
      default:
        break;
      }
  }
}

Часть шлюза: Ход программы:

Ключевой код:

Язык кода:javascript
копировать
//serial часть Последовательный порт
    	cssl_t *ser;     
    	cssl_start();
    	ser=cssl_open(dev_path,callback,0,38400,8,0,1);   
    	if (!ser){
        		printf("%s\n",cssl_geterrormsg());
    	}
    	printf("Serial connection successful, DEV = %s\n", dev_path);

//создаем сокет Установить сокет Установить Sock-соединение

Язык кода:javascript
копировать
sockfd = socket( AF_INET,SOCK_STREAM,0 );

	if ( sockfd < 0 )
	{
		fprintf( stderr, "socket:%s\n", strerror(errno));
		exit(1);		
	}
	else{
		printf("success to connect the service\n");
	}

	struct sockaddr_in sockaddr;
	//Устанавливаем структуру информации о соединении
	memset( &sockaddr,0,sizeof(sockaddr) );
	sockaddr.sin_family = AF_INET;
	sockaddr.sin_port = htons ( atoi (port) );
	inet_pton(AF_INET,ip,&sockaddr.sin_addr.s_addr);
	socklen_t len = sizeof(sockaddr);
	//Подключаемся к удаленному серверу 
	if( connect(sockfd,(struct sockaddr*)&sockaddr,len) <0 ){
		fprintf(stderr, "connect: %s\n", strerror(errno) );
		exit(1);
	}

Функция обратного вызова печатает информацию о данных, полученных последовательным портом. В этом методе данные, полученные последовательным портом, анализируются, и вызов отправляется на сервер через сокет.

Язык кода:javascript
копировать
static void callback(int id, uint8_t *buf,int length)    
{
    int i;
    char dtype[2],data[50];
    printf("the date from serial:%s\n", buf);
    printf("\nread serial success:  length = %d\n", length); 
    sprintf(dtype,"%d",buf[2]);
    switch(dtype[0]){
	case '1':
		sprintf(data,"wendu=%d&shidu=%d",buf[5],buf[6]);
		puts(data);
		sendDatawenshidu(data,strlen(data));
		break;
	case '2':
		sprintf(data,"gz=%d",buf[5]);
		puts(data);
		sendDataguangzhao(data,strlen(data));
		break;
	case '3':
		sprintf(data,"gs=%d",buf[5]);
		puts(data);
		sendDataGas(data,strlen(data));
		break;
	default:
		puts("the date is error"); 
		break;
	}
}

Инкапсулируйте данные в формат http и отправьте датчик данных по почте.

Язык кода:javascript
копировать
void sendDatawenshidu(uint8_t *buf,int length)
{
    printf("buf:%s\n",buf);
    //интерфейс
    char page[] = "addWendu";  
    char content[4096];  
    char content_page[50];  
    char content_host[50];  
    char content_len[50]; 
    //1 строка запроса
sprintf(content_page,"POST /%s HTTP/1.1\r\n",page);  

//Инкапсулируем данные в формат http и отправляем данные о значении освещения через метод post
void sendDataguangzhao(uint8_t *buf,int length)
{
    printf("buf:%s\n",buf);
    char page[] = "Guangzhao";  
    char content[4096];  
    char content_page[50];  
    char content_len[50];  
    char content_host[50]; 
    sprintf(content_page,"POST /%s HTTP/1.1\r\n",page);  
    sprintf(content_host,"HOST: %s:%d\r\n",ip,port);  
    char content_type[] = "Content-Type: application/x-www-form-urlencoded\r\n";  
    sprintf(content_len,"Content-Length: %d\r\n\r\n",strlen(buf));  
    sprintf(content,"%s%s%s%s%s",content_page,content_host,content_type,content_len,buf);  
    send(sockfd,content,strlen(content),0);  
}
//Инкапсулируем данные в формат http и отправляем горючий методом post стоимость газаданные
void sendDataGas(uint8_t *buf,int length)
{
    printf("buf:%s\n",buf);
    char page[] = "Gas";  
    char content[4096];  
    char content_page[50];  
    char content_host[50];
    char content_len[50]; 
    sprintf(content_page,"POST /%s HTTP/1.1\r\n",page);       
    sprintf(content_host,"HOST: %s:%d\r\n",ip,port);  
    char content_type[] = "Content-Type: application/x-www-form-urlencoded\r\n";   
    sprintf(content_len,"Content-Length: %d\r\n\r\n",strlen(buf));  
    sprintf(content,"%s%s%s%s%s",content_page,content_host,content_type,content_len,buf); 
    send(sockfd,content,strlen(content),0);  
}

Сообщение HTTP-запроса состоит из строки запроса (запрос строка), заголовок запроса (заголовок), пустая строка и данные запроса. На следующем рисунке показан общий формат сообщения запроса.
    /*2.Заголовок запроса
    /Host: запрошенное имя хоста, позволяющее нескольким доменным именам находиться на одном IP-адресе, то есть виртуальном хосте.
    */
    sprintf(content_host,"HOST: %s:%d\r\n",ip,port);  

 /*4.проситьданные    Данные /Запроса используются не в методе GET, а в методе POST.
    Метод /POST подходит для ситуаций, когда клиентам необходимо заполнить форму. Связано с запросом данных
    Наиболее часто используемые заголовки запроса — Content-Type и Content-Length.
    */
    char content_type[] = "Content-Type: application/x-www-form-urlencoded\r\n";  
    sprintf(content_len,"Content-Length: %d\r\n\r\n",strlen(buf));  
    sprintf(content,"%s%s%s%s%s",content_page,content_host,content_type,content_len,buf);  
    send(sockfd,content,strlen(content),0);  

}

Сервер: план дизайна Сервер использует maven для интеграции среды Springboot для создания проекта, а база данных использует MySQL. Код в основном разделен на четыре уровня: уровень POJO, уровень Dao, уровень обслуживания и уровень контроллера.

Уровень POJO. Этот уровень содержит три класса сущностей: Температура. и Класс герметизации по влажности, Класс герметизации по освещенности, горючий класс герметичности газа; Уровень Dao: отвечает за взаимодействие с базой данных и предоставление источников данных; Уровень обслуживания: этот уровень в основном отвечает за управление; Уровень контроллера, отвечающий за предоставление интерфейса данных JSON. Основной код:

Язык кода:javascript
копировать
@RequestMapping(value = "/findAllShidu")
public Map<String,Object> findAllShidu(){
    Map<String,Object> wenduMap = new HashMap<String,Object>();
    List<Wendu> list = wenduService.findAllShidu();
    wenduMap.put("data",list);
    return wenduMap;
}
@RequestMapping(value = "/addWendu")
public Map<String,Object> addWendu(Double wendu,Double shidu) {
    Map<String, Object> wenduMap = new HashMap<String, Object>();
    System.out.print(wendu);
    try {
      wenduService.saveWendu(wendu,shidu);
    } catch (Exception e) {
        wenduMap.put("status", "fail");
        return wenduMap;
    }
    wenduMap.put("status", "success");
    return wenduMap;
}

Веб-терминал Основной код:

Язык кода:javascript
копировать
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="utf-8">
        <link rel="icon" href="https://static.jianshukeji.com/highcharts/images/favicon.ico">
        <meta name="viewport"  content="width=device-width,initial-scale=1">
        <script src="https://img.hcharts.cn/jquery/jquery-1.8.3.min.js"></script>
        <script src="https://img.hcharts.cn/highcharts/highcharts.js"></script>
        <script src="https://img.hcharts.cn/highcharts/modules/exporting.js"></script>
        <script src="https://img.hcharts.cn/highcharts-plugins/highcharts-zh_CN.js"></script>
    </head>
    <body>
        <div id="container" style="min-width:400px;height:400px"></div>
        <script>
		var wendu=0;
			$(function(){
	getallRepairOrder();
	
	function getallRepairOrder(){
		$.ajax({
			url:"http://localhost:8080/findGas",
			type:"post",
			async:true,
			success:function(data){
				//oOrderContainer.text("");
				//перезвонить
				 wendu=data.data[0][0];			
				//alert(data.data[0][0]);
				}
		});
		setTimeout(getallRepairOrder, 1000);
	
	}
	});
			Highcharts.setOptions({
                global: {
                    useUTC: false
                }
            });
            function activeLastPointToolip(chart) {
                var points = chart.series[0].points;
                chart.tooltip.refresh(points[points.length -1]);
            }
            $('#container').highcharts({
                chart: {
                    type: 'spline',
                    animation: Highcharts.svg, // don't animate in old IE
                    marginRight: 10,
                    events: {
                        load: function () {
                            // set up the updating of the chart each second
                            var series = this.series[0],
                                chart = this;
                            setInterval(function () {
                                var x = (new Date()).getTime(), // current time
                                    y = wendu;
                                series.addPoint([x, y], true, true);
                                activeLastPointToolip(chart)
                            }, 1000);
                        }
                    }
                },title: {
                    text: 'горючий газв реальном времениданные'                },
                xAxis: {
                    type: 'datetime',
                    tickPixelInterval: 150
                },
                yAxis: {
                    title: {
                        text: 'горючий стоимость газа %'
                    },
                    plotLines: [{
                        value: 0,
                        width: 1,
                        color: '#808080'
                    }]
                },
                tooltip: {
                    formatter: function () {
                        return '<b>' + this.series.name + '</b><br/>' +
                            Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' +
                            Highcharts.numberFormat(this.y, 2);
                    }
                },
                legend: {
                    enabled: false
                },
                exporting: {
                    enabled: false
                },series: [{
                    name: 'исходныйданные',                    data: (function () {
                        // generate an array of random data
                        var data = [],
                            time = (new Date()).getTime(),
                            i;
                        for (i = -19; i <= 0; i += 1) {
                            data.push({
                                x: time + i * 1000,
                                y: 0
                            });
                        }
                        return data;
                    }())
                }]
            }, function(c) {
                activeLastPointToolip(c)
            });
	
        </script>
    </body>

</html>

Часть визуального дисплея клиента: Основной процесс:

Доступ к данным:

Язык кода:javascript
копировать
def get_data(url,date):
    reponse = urllib.request.urlopen(url)
    html = reponse.read().decode('utf-8')
    PullData= json.loads(html)
    DataArry = PullData['data']
    xar,yar=[],[]
    for each in DataArry:

        if len(each)>1:
            y,x=each
            x=datetime.strptime(x,'%Y-%m-%d %H:%M:%S')
            if x>date and x<(date+timedelta(days=1)):
                xar.append(x)
                yar.append(float(y)
    return xar,yar
параметр:
url: интерфейс для доступа к данным.
Инкапсулируем интерфейс:
wendu_url = 'http://localhost:8080/findAllWendu'
shidu_url = 'http://localhost:8080/findAllShidu'
gas_url = 'http://localhost:8080/findGas'
sun_url='http://localhost:8080/findGuangzhao'
data = [('температура', wendu_url), ('влажность', shidu_url), («горючий газ», gas_url),('свет',sun_url)]
Дата: фильтруйте другие даты, и вы можете запросить изменения в данных за определенную дату.
Рисунок данных:
drawPic.f.clf()
drawPic.a=drawPic.f.add_subplot(111)
x,y=get_data(url,sampleCount)
drawPic.a.set_xlim(min(x), max(x))
drawPic.a.plot(x,y,color='r',label='wendu',)
xlabels = drawPic.a.get_xticklabels()
for label in drawPic.a.xaxis.get_ticklabels():
    label.set_fontsize(5)
for label in drawPic.a.yaxis.get_ticklabels():
    label.set_fontsize(5)
for xl in xlabels:
    xl.set_rotation(45)
drawPic.a.set_title('Demo: DATA Display')
drawPic.a.set_xlabel(sampleCount.date())
drawPic.canvas.show()

Графический интерфейс:

Язык кода:javascript
копировать
drawPic.canvas = FigureCanvasTkAgg(drawPic.f, master=root)

drawPic.canvas.show()

drawPic.canvas.get_tk_widget().grid(row=0, columnspan=3)
var = StringVar()
var.set(1)
count = 0
for each in data:
    Radiobutton(root, text=each[0], variable=var, value=each[1]).grid(row=1, column=count, sticky=W)
    count += 1
Label(root,text='Пожалуйста, введите дату запроса (Г-м-д):').grid(row=2,column=0)
#Радио-кнопка, выберите, какой интерфейс можно передать
inputEntry=Entry(root)
inputEntry.grid(row=2,column=1)
inputEntry.insert(0,'2017-6-12')
Button(root,текст = 'рисовать',command=drawPic).grid(row=2,column=2,columnspan=3)
#command=drwaPic Нажмите кнопку, чтобы выполнить рисование функции drwaPic.

4 Скриншоты отладки системы и запуска тестов

На рисунке выше показан скриншот работы шлюза.

На рисунке выше показан скриншот работающего сервера.

На рисунке выше показан скриншот веб-дисплея.

Изображение выше представляет собой скриншот окна визуализации Python. 5 Заключение Предлагается система сбора данных на базе ZigBee. дизайна. В ходе эксперимента была построена сеть ZigBee для сбора данных о температуре. Хорошее общение, и реализовали функции системы. Дальность покрытия сети ZigBee обычно составляет десятки метров. Но можно подключаться к другим сетям (таким как WiFi, Ethernet) через шлюзы, Для достижения цели расширения покрытия сети или удаленного мониторинга, Это лучше отразит превосходные характеристики ZigBee, Это дает ему более широкую перспективу применения. Адрес исходного кода проекта:https://github.com/Wlain/Environment-Data-Acquisition-System-of-Internet-of-Things-Based-on-ZigBee.git

Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/127842.html Исходная ссылка: https://javaforall.cn

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose