#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/event_groups.h" #include "esp_log.h" #include "nvs_flash.h" #include "mqtt_client.h" #include "simple_wifi_sta.h" #include #include "esp32/rom/ets_sys.h" #include "dht11.h" #include #include #include #include "driver/gpio.h" #include #include #define DHT11_GPIO 15 // DHT11引脚定义 const static char *TAG1 = "DHT11_Demo"; static const char* TAG = "main"; // 温度 湿度变量 int temp = 0,hum = 0; #define MQTT_ADDRESS "mqtt://47.242.184.139" //MQTT连接地址 #define MQTT_PORT 1883 //MQTT连接端口号 #define MQTT_CLIENT "mqttx_esp32_01" //Client ID(设备唯一,大家最好自行改一下) #define MQTT_USERNAME "admin" //MQTT用户名 #define MQTT_PASSWORD "publish452131wW452131wW$" //MQTT密码 #define MQTT_PUBLIC_TOPIC "/test/topic1" //测试用的,推送消息主题 #define MQTT_SUBSCRIBE_TOPIC "/test/topic1" //测试用的,需要订阅的主题 // #define MQTT_SUBSCRIBE_TOPIC "WifiSHT/+/SHT20" //定义一个事件组,用于通知main函数WIFI连接成功 #define WIFI_CONNECT_BIT BIT0 static EventGroupHandle_t s_wifi_ev = NULL; //MQTT客户端操作句柄 static esp_mqtt_client_handle_t s_mqtt_client = NULL; //MQTT连接标志 static bool s_is_mqtt_connected = false; /** * mqtt连接事件处理函数 * @param event 事件参数 * @return 无 */ static void aliot_mqtt_event_handler(void* event_handler_arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { esp_mqtt_event_handle_t event = event_data; esp_mqtt_client_handle_t client = event->client; // your_context_t *context = event->context; switch ((esp_mqtt_event_id_t)event_id) { case MQTT_EVENT_CONNECTED: //连接成功 ESP_LOGI(TAG, "mqtt connected"); s_is_mqtt_connected = true; //连接成功后,订阅测试主题 esp_mqtt_client_subscribe_single(s_mqtt_client,MQTT_SUBSCRIBE_TOPIC,1); break; case MQTT_EVENT_DISCONNECTED: //连接断开 ESP_LOGI(TAG, "mqtt disconnected"); s_is_mqtt_connected = false; esp_mqtt_client_start(s_mqtt_client); break; case MQTT_EVENT_SUBSCRIBED: //收到订阅消息ACK ESP_LOGI(TAG, " mqtt subscribed ack, msg_id=%d", event->msg_id); break; case MQTT_EVENT_UNSUBSCRIBED: //收到解订阅消息ACK break; case MQTT_EVENT_PUBLISHED: //收到发布消息ACK ESP_LOGI(TAG, "mqtt publish ack, msg_id=%d", event->msg_id); break; case MQTT_EVENT_DATA: printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); //收到Pub消息直接打印出来 printf("DATA=%.*s\r\n", event->data_len, event->data); break; case MQTT_EVENT_ERROR: ESP_LOGI(TAG, "MQTT_EVENT_ERROR"); break; default: break; } } /** 启动mqtt连接 * @param 无 * @return 无 */ void mqtt_start(void) { esp_mqtt_client_config_t mqtt_cfg = {0}; mqtt_cfg.broker.address.uri = MQTT_ADDRESS; mqtt_cfg.broker.address.port = MQTT_PORT; //Client ID mqtt_cfg.credentials.client_id = MQTT_CLIENT; //用户名 mqtt_cfg.credentials.username = MQTT_USERNAME; //密码 mqtt_cfg.credentials.authentication.password = MQTT_PASSWORD; ESP_LOGI(TAG,"mqtt connect->clientId:%s,username:%s,password:%s",mqtt_cfg.credentials.client_id, mqtt_cfg.credentials.username,mqtt_cfg.credentials.authentication.password); //设置mqtt配置,返回mqtt操作句柄 s_mqtt_client = esp_mqtt_client_init(&mqtt_cfg); //注册mqtt事件回调函数 esp_mqtt_client_register_event(s_mqtt_client, ESP_EVENT_ANY_ID, aliot_mqtt_event_handler, s_mqtt_client); //启动mqtt连接 esp_mqtt_client_start(s_mqtt_client); } /** wifi事件通知 * @param 无 * @return 无 */ void wifi_event_handler(WIFI_EV_e ev) { if(ev == WIFI_CONNECTED) { xEventGroupSetBits(s_wifi_ev,WIFI_CONNECT_BIT); } } void app_main(void) { esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { //NVS出现错误,执行擦除 ESP_ERROR_CHECK(nvs_flash_erase()); //重新尝试初始化 ESP_ERROR_CHECK(nvs_flash_init()); } s_wifi_ev = xEventGroupCreate(); EventBits_t ev = 0; //初始化WIFI,传入回调函数,用于通知连接成功事件 wifi_sta_init(wifi_event_handler); //一直监听WIFI连接事件,直到WiFi连接成功后,才启动MQTT连接 ev = xEventGroupWaitBits(s_wifi_ev,WIFI_CONNECT_BIT,pdTRUE,pdFALSE,portMAX_DELAY); if(ev & WIFI_CONNECT_BIT) { mqtt_start(); } vTaskDelay(2000 / portTICK_PERIOD_MS); DHT11_Init(DHT11_GPIO); static char mqtt_pub_buff[64]; while(1) { if (DHT11_StartGet(&temp, &hum)){ ESP_LOGI(TAG1, "temp->%i.%i C hum->%i%%", temp / 10, temp % 10, hum); } vTaskDelay(1000 / portTICK_PERIOD_MS); int count = 0; //延时2秒发布一条消息到/test/topic1主题 if(s_is_mqtt_connected) { //snprintf(mqtt_pub_buff,64,"{\"count\":\"%d\"}",count); snprintf(mqtt_pub_buff,64,"{%i.%i %i}",temp / 10, temp % 10, hum); esp_mqtt_client_publish(s_mqtt_client, MQTT_PUBLIC_TOPIC, mqtt_pub_buff, strlen(mqtt_pub_buff),1, 0); count++; } vTaskDelay(pdMS_TO_TICKS(9000)); } return; } // TOPIC=WifiSHT/7C87CE9F5CBF/SHT20 // DATA=52.5 28.8