[ESP32]mqtt onenet
2026/6/6 10:44:08 网站建设 项目流程

一、参数配置

1.1 wifi配置

改为自己的wifi用户名和密码

#defineWIFI_SSID"Jermo"#defineWIFI_PASS"zj95270123"

1.2 ONENET服务器配置

#defineONENET_SERVER"mqtt://mqtts.heclouds.com"#defineONENET_PORT1883

服务器网址如何得到的,可查看

1.3 ONENET设备信息

具体如下图所示:

////////////////////////////////////////////////////////////////////////////////////////////////////对应下图字条#defineONENET_DEVICE_ID"esp32_device"//按键Generate可生成#defineONENET_API_KEY"version=2018-10-31&res=products%2FaPqTF98Pfu%2Fdevices%2Fesp32_device&et=1810718710&method=md5&sign=mLkhAfxAEHajMUOhgZ6obw%3D%3D"//产品信息->产品ID#defineONENET_PRODUCT_ID"aPqTF98Pfu"////////////////////////////////////////////////////////////////////////////////////////////////////res格式 :products/{ONENET_PRODUCT_ID}/devices/{ONENET_DEVICE_ID}//et :访问过期的格林时间//key :设备信息->设备密匙//method:md5 version:2018-10-31//////////////////////////////////////////////////////////////////////////////////////////////////

1.4 发布与订阅话题

#defineMQTT_TOPIC_PUB"$sys/u2BQj54Axu/esp32_temper_humi/thing/property/post"#defineMQTT_TOPIC_SUB"$sys/u2BQj54Axu/esp32_temper_humi/thing/property/post/reply"#defineMQTT_TOPIC_PUB_SET"$sys/u2BQj54Axu/esp32_temper_humi/thing/property/set_reply"#defineMQTT_TOPIC_SUB_SET"$sys/u2BQj54Axu/esp32_temper_humi/thing/property/set"

二、源码

#include<stdio.h>#include<time.h>#include<string.h>#include"driver/i2c.h"#include"driver/gpio.h"#include"freertos/FreeRTOS.h"#include"freertos/task.h"#include"freertos/event_groups.h"#include"esp_timer.h"#include"esp_rom_sys.h"#include"esp_wifi.h"#include"esp_event.h"#include"esp_log.h"#include"nvs_flash.h"#include"mqtt_client.h"#include"cJSON.h"#include"driver/uart.h"// WiFi configuration#defineWIFI_SSID"Jermo"#defineWIFI_PASS"zj95279527"// #define WIFI_SSID "kt"// #define WIFI_PASS "12345678"// OneNet configuration#defineONENET_SERVER"mqtt://mqtts.heclouds.com"#defineONENET_PORT1883#defineONENET_DEVICE_ID"esp32_temper_humi"#defineONENET_API_KEY"version=2018-10-31&res=products%2Fu2BQj54Axu%2Fdevices%2Fesp32_temper_humi&et=1905580383&method=md5&sign=Lz6TS8nYlUnHn6qSkx7ZEg%3D%3D"#defineONENET_PRODUCT_ID"u2BQj54Axu"uint32_treal_time=1000;int16_ttemperature=25;#defineMQTT_TOPIC_PUB"$sys/u2BQj54Axu/esp32_temper_humi/thing/property/post"#defineMQTT_TOPIC_SUB"$sys/u2BQj54Axu/esp32_temper_humi/thing/property/post/reply"#defineMQTT_TOPIC_PUB_SET"$sys/u2BQj54Axu/esp32_temper_humi/thing/property/set_reply"#defineMQTT_TOPIC_SUB_SET"$sys/u2BQj54Axu/esp32_temper_humi/thing/property/set"// Event group bits#defineWIFI_CONNECTED_BITBIT0#defineMQTT_CONNECTED_BITBIT1staticconstchar*TAG="ONENET_MQTT";staticEventGroupHandle_t s_wifi_event_group;staticesp_mqtt_client_handle_tmqtt_client=NULL;staticbool switch_state=false;bool is_connect=false;// 是否连接上OneNet// WiFi event handlerstaticvoidwifi_event_handler(void*arg,esp_event_base_tevent_base,int32_tevent_id,void*event_data){if(event_base==WIFI_EVENT&&event_id==WIFI_EVENT_STA_START){ESP_LOGI(TAG,"WiFi connecting...");esp_wifi_connect();}elseif(event_base==WIFI_EVENT&&event_id==WIFI_EVENT_STA_DISCONNECTED){ESP_LOGI(TAG,"WiFi disconnected, reconnecting...");esp_wifi_connect();xEventGroupClearBits(s_wifi_event_group,WIFI_CONNECTED_BIT);}elseif(event_base==IP_EVENT&&event_id==IP_EVENT_STA_GOT_IP){ESP_LOGI(TAG,"WiFi connected, IP obtained");xEventGroupSetBits(s_wifi_event_group,WIFI_CONNECTED_BIT);}}voidmqtt_cjson_parse(esp_mqtt_client_handle_tclient,cJSON*params){cJSON*value=cJSON_GetObjectItem(params,"maxhum_set");if(value){ESP_LOGI(TAG,"string: %s",value->string);if(value&&cJSON_IsNumber(value)){int16_tdown_value=value->valueint;ESP_LOGI(TAG,"maxhum_set: %d",down_value);// Publish state updatechar*pub_data=malloc(100);snprintf(pub_data,100,"{\"maxhum_set\":%d}",down_value);esp_mqtt_client_publish(client,MQTT_TOPIC_PUB_SET,pub_data,strlen(pub_data),0,0);ESP_LOGI(TAG,"Publish state update: %s",pub_data);free(pub_data);}}}// MQTT event handlervoidmqtt_event_handler(void*handler_args,esp_event_base_tbase,int32_tevent_id,void*event_data){esp_mqtt_event_handle_tevent=event_data;esp_mqtt_client_handle_tclient=event->client;intmsg_id;switch(event->event_id){caseMQTT_EVENT_CONNECTED:{ESP_LOGI(TAG,"MQTT connected");xEventGroupSetBits(s_wifi_event_group,MQTT_CONNECTED_BIT);msg_id=esp_mqtt_client_subscribe(client,MQTT_TOPIC_SUB,0);ESP_LOGI(TAG,"MQTT subscribed successfully, msg_id=%d",msg_id);msg_id=esp_mqtt_client_subscribe(client,MQTT_TOPIC_SUB_SET,0);ESP_LOGI(TAG,"MQTT subscribed successfully, msg_id=%d",msg_id);is_connect=true;}break;caseMQTT_EVENT_DISCONNECTED:{ESP_LOGI(TAG,"MQTT disconnected");xEventGroupClearBits(s_wifi_event_group,MQTT_CONNECTED_BIT);is_connect=false;}break;caseMQTT_EVENT_ERROR:{ESP_LOGE(TAG,"MQTT error");xEventGroupClearBits(s_wifi_event_group,MQTT_CONNECTED_BIT);}break;caseMQTT_EVENT_DATA:{ESP_LOGI(TAG,"MQTT data received, length: %d",event->data_len);if(event->data_len>0){char*data=malloc(event->data_len+1);memcpy(data,event->data,event->data_len);data[event->data_len]=0;ESP_LOGI(TAG,"Data received: %s",data);// Parse JSON datacJSON*root=cJSON_Parse(data);if(root){uint16_tid=0;cJSON*id_params=cJSON_GetObjectItem(root,"id");if(id_params)// && cJSON_IsNumber(id_params)){id=atoi(id_params->valuestring);ESP_LOGI(TAG,"%s: %d",id_params->string,id);// ESP_LOGI(TAG, "%s: %s", id_params->string , id_params->valuestring);}cJSON*params=cJSON_GetObjectItem(root,"params");if(params!=0){cJSON*value=cJSON_GetObjectItem(params,"maxhum_set");if(value){ESP_LOGI(TAG,"string: %s",value->string);if(value&&cJSON_IsNumber(value)){int16_tdown_value=value->valueint;ESP_LOGI(TAG,"maxhum_set: %d",down_value);// Publish state updatechar*pub_data=malloc(140);// snprintf(pub_data, 100, "{\"maxhum_set\":%d}", down_value);snprintf(pub_data,100,"{\"id\":\"%lu\",\"code\":200,\"msg\":\"success\"}",(unsignedlong)id);esp_mqtt_client_publish(client,MQTT_TOPIC_PUB_SET,pub_data,strlen(pub_data),0,0);ESP_LOGI(TAG,"Publish state update: %s",pub_data);free(pub_data);}}}cJSON_Delete(root);}free(data);}}break;caseMQTT_EVENT_PUBLISHED:{ESP_LOGI(TAG,"MQTT message published, msg_id=%d",event->msg_id);}break;caseMQTT_EVENT_SUBSCRIBED:{ESP_LOGI(TAG,"MQTT message subcribed, msg_id=%d",event->msg_id);}break;default:ESP_LOGI(TAG,"Other MQTT event: %d",event->event_id);break;}}// Initialize WiFivoidwifi_init(void){ESP_LOGI(TAG,"Initializing WiFi...");s_wifi_event_group=xEventGroupCreate();ESP_ERROR_CHECK(esp_netif_init());ESP_ERROR_CHECK(esp_event_loop_create_default());esp_netif_create_default_wifi_sta();wifi_init_config_tcfg=WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));esp_event_handler_instance_tinstance_any_id;esp_event_handler_instance_tinstance_got_ip;ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,ESP_EVENT_ANY_ID,&wifi_event_handler,NULL,&instance_any_id));ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,IP_EVENT_STA_GOT_IP,&wifi_event_handler,NULL,&instance_got_ip));wifi_config_twifi_config={.sta={.ssid=WIFI_SSID,.password=WIFI_PASS,},};ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA,&wifi_config));ESP_ERROR_CHECK(esp_wifi_start());ESP_LOGI(TAG,"WiFi initialized, SSID: %s",WIFI_SSID);}voidmqtt_temperature_publish(uint32_tid,,uint16_ttemperature){char*data=malloc(200);// Build OneNet required data formatsnprintf(data,200,"{\"id\":\"%"PRIu32"\",\"version\":\"1.0\",\"params\":{\"temp_value\":{\"value\":%d}}}",id,temperature);ESP_LOGI(TAG,"Publish data to OneNet: %s",data);intmsg_id=esp_mqtt_client_publish(mqtt_client,MQTT_TOPIC_PUB,data,strlen(data),0,0);if(msg_id<0){ESP_LOGE(TAG,"MQTT publish failed");}else{ESP_LOGI(TAG,"MQTT publish success, msg_id=%d",msg_id);}free(data);}// Initialize MQTT clientvoidmqtt_init(void){ESP_LOGI(TAG,"Initializing MQTT client...");// Print MQTT configurationESP_LOGI(TAG,"MQTT server: %s",ONENET_SERVER);ESP_LOGI(TAG,"MQTT port: %d",ONENET_PORT);ESP_LOGI(TAG,"Device ID: %s",ONENET_DEVICE_ID);ESP_LOGI(TAG,"Product ID: %s",ONENET_PRODUCT_ID);esp_mqtt_client_config_tmqtt_cfg={.broker.address.uri=ONENET_SERVER,.broker.address.port=ONENET_PORT,.credentials.client_id=ONENET_DEVICE_ID,.credentials.username=ONENET_PRODUCT_ID,.credentials.authentication.password=ONENET_API_KEY,};mqtt_client=esp_mqtt_client_init(&mqtt_cfg);if(mqtt_client==NULL){ESP_LOGE(TAG,"MQTT client initialization failed");return;}esp_mqtt_client_register_event(mqtt_client,ESP_EVENT_ANY_ID,mqtt_event_handler,NULL);esp_err_terr=esp_mqtt_client_start(mqtt_client);if(err!=ESP_OK){ESP_LOGE(TAG,"MQTT client start failed, error: %d",err);return;}ESP_LOGI(TAG,"MQTT client initialized");}voidnvs_init(){// Initialize NVSESP_LOGI(TAG,"Initializing NVS...");esp_err_tret=nvs_flash_init();if(ret==ESP_ERR_NVS_NO_FREE_PAGES||ret==ESP_ERR_NVS_NEW_VERSION_FOUND){ESP_LOGI(TAG,"NVS needs to be erased...");ESP_ERROR_CHECK(nvs_flash_erase());ret=nvs_flash_init();}ESP_ERROR_CHECK(ret);ESP_LOGI(TAG,"NVS initialized");}voidapp_main(void){// usart_init();nvs_init();// Initialize WiFiwifi_init();// Initialize MQTT clientmqtt_init();// xTaskCreate(rx_task, "uart_rx_task", 1024*2, NULL, 5, NULL);// Wait for WiFi and MQTT connectionESP_LOGI(TAG,"Waiting for WiFi and MQTT connection...");xEventGroupWaitBits(s_wifi_event_group,WIFI_CONNECTED_BIT|MQTT_CONNECTED_BIT,true,true,portMAX_DELAY);ESP_LOGI(TAG,"WiFi and MQTT connected, starting main loop");while(1){// Check MQTT connection statusif(!(xEventGroupGetBits(s_wifi_event_group)&MQTT_CONNECTED_BIT)){ESP_LOGW(TAG,"MQTT not connected, reconnecting...");if(mqtt_client){esp_mqtt_client_stop(mqtt_client);esp_mqtt_client_start(mqtt_client);}}// Detect button state changeif(switch_state==true){switch_state=false;// Publish state to OneNet// if (mqtt_client && (xEventGroupGetBits(s_wifi_event_group) & MQTT_CONNECTED_BIT))// {// mqtt_temperature_publish( real_time , , temperature);// real_time++;// temperature ++;// temperature %= 100;// ESP_LOGI(TAG, "temperature:%d",temperature);// }// else// {// ESP_LOGW(TAG, "MQTT not connected, cannot publish state");// }}// Delay 100msvTaskDelay(1000/portTICK_PERIOD_MS);}}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询