[ESP32]mqtt onenet

发布时间:2026/6/6 10:44:11

[ESP32]mqtt onenet 一、参数配置1.1 wifi配置改为自己的wifi用户名和密码#defineWIFI_SSIDJermo#defineWIFI_PASSzj952701231.2 ONENET服务器配置#defineONENET_SERVERmqtt://mqtts.heclouds.com#defineONENET_PORT1883服务器网址如何得到的可查看1.3 ONENET设备信息具体如下图所示////////////////////////////////////////////////////////////////////////////////////////////////////对应下图字条#defineONENET_DEVICE_IDesp32_device//按键Generate可生成#defineONENET_API_KEYversion2018-10-31resproducts%2FaPqTF98Pfu%2Fdevices%2Fesp32_deviceet1810718710methodmd5signmLkhAfxAEHajMUOhgZ6obw%3D%3D//产品信息-产品ID#defineONENET_PRODUCT_IDaPqTF98Pfu////////////////////////////////////////////////////////////////////////////////////////////////////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二、源码#includestdio.h#includetime.h#includestring.h#includedriver/i2c.h#includedriver/gpio.h#includefreertos/FreeRTOS.h#includefreertos/task.h#includefreertos/event_groups.h#includeesp_timer.h#includeesp_rom_sys.h#includeesp_wifi.h#includeesp_event.h#includeesp_log.h#includenvs_flash.h#includemqtt_client.h#includecJSON.h#includedriver/uart.h// WiFi configuration#defineWIFI_SSIDJermo#defineWIFI_PASSzj95279527// #define WIFI_SSID kt// #define WIFI_PASS 12345678// OneNet configuration#defineONENET_SERVERmqtt://mqtts.heclouds.com#defineONENET_PORT1883#defineONENET_DEVICE_IDesp32_temper_humi#defineONENET_API_KEYversion2018-10-31resproducts%2Fu2BQj54Axu%2Fdevices%2Fesp32_temper_humiet1905580383methodmd5signLz6TS8nYlUnHn6qSkx7ZEg%3D%3D#defineONENET_PRODUCT_IDu2BQj54Axuuint32_treal_time1000;int16_ttemperature25;#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*TAGONENET_MQTT;staticEventGroupHandle_t s_wifi_event_group;staticesp_mqtt_client_handle_tmqtt_clientNULL;staticbool switch_statefalse;bool is_connectfalse;// 是否连接上OneNet// WiFi event handlerstaticvoidwifi_event_handler(void*arg,esp_event_base_tevent_base,int32_tevent_id,void*event_data){if(event_baseWIFI_EVENTevent_idWIFI_EVENT_STA_START){ESP_LOGI(TAG,WiFi connecting...);esp_wifi_connect();}elseif(event_baseWIFI_EVENTevent_idWIFI_EVENT_STA_DISCONNECTED){ESP_LOGI(TAG,WiFi disconnected, reconnecting...);esp_wifi_connect();xEventGroupClearBits(s_wifi_event_group,WIFI_CONNECTED_BIT);}elseif(event_baseIP_EVENTevent_idIP_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*valuecJSON_GetObjectItem(params,maxhum_set);if(value){ESP_LOGI(TAG,string: %s,value-string);if(valuecJSON_IsNumber(value)){int16_tdown_valuevalue-valueint;ESP_LOGI(TAG,maxhum_set: %d,down_value);// Publish state updatechar*pub_datamalloc(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_teventevent_data;esp_mqtt_client_handle_tclientevent-client;intmsg_id;switch(event-event_id){caseMQTT_EVENT_CONNECTED:{ESP_LOGI(TAG,MQTT connected);xEventGroupSetBits(s_wifi_event_group,MQTT_CONNECTED_BIT);msg_idesp_mqtt_client_subscribe(client,MQTT_TOPIC_SUB,0);ESP_LOGI(TAG,MQTT subscribed successfully, msg_id%d,msg_id);msg_idesp_mqtt_client_subscribe(client,MQTT_TOPIC_SUB_SET,0);ESP_LOGI(TAG,MQTT subscribed successfully, msg_id%d,msg_id);is_connecttrue;}break;caseMQTT_EVENT_DISCONNECTED:{ESP_LOGI(TAG,MQTT disconnected);xEventGroupClearBits(s_wifi_event_group,MQTT_CONNECTED_BIT);is_connectfalse;}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_len0){char*datamalloc(event-data_len1);memcpy(data,event-data,event-data_len);data[event-data_len]0;ESP_LOGI(TAG,Data received: %s,data);// Parse JSON datacJSON*rootcJSON_Parse(data);if(root){uint16_tid0;cJSON*id_paramscJSON_GetObjectItem(root,id);if(id_params)// cJSON_IsNumber(id_params)){idatoi(id_params-valuestring);ESP_LOGI(TAG,%s: %d,id_params-string,id);// ESP_LOGI(TAG, %s: %s, id_params-string , id_params-valuestring);}cJSON*paramscJSON_GetObjectItem(root,params);if(params!0){cJSON*valuecJSON_GetObjectItem(params,maxhum_set);if(value){ESP_LOGI(TAG,string: %s,value-string);if(valuecJSON_IsNumber(value)){int16_tdown_valuevalue-valueint;ESP_LOGI(TAG,maxhum_set: %d,down_value);// Publish state updatechar*pub_datamalloc(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_groupxEventGroupCreate();ESP_ERROR_CHECK(esp_netif_init());ESP_ERROR_CHECK(esp_event_loop_create_default());esp_netif_create_default_wifi_sta();wifi_init_config_tcfgWIFI_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{.ssidWIFI_SSID,.passwordWIFI_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*datamalloc(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_idesp_mqtt_client_publish(mqtt_client,MQTT_TOPIC_PUB,data,strlen(data),0,0);if(msg_id0){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.uriONENET_SERVER,.broker.address.portONENET_PORT,.credentials.client_idONENET_DEVICE_ID,.credentials.usernameONENET_PRODUCT_ID,.credentials.authentication.passwordONENET_API_KEY,};mqtt_clientesp_mqtt_client_init(mqtt_cfg);if(mqtt_clientNULL){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_terresp_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_tretnvs_flash_init();if(retESP_ERR_NVS_NO_FREE_PAGES||retESP_ERR_NVS_NEW_VERSION_FOUND){ESP_LOGI(TAG,NVS needs to be erased...);ESP_ERROR_CHECK(nvs_flash_erase());retnvs_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_statetrue){switch_statefalse;// 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);}}

相关新闻