|
|
#include <stdio.h>
|
|
|
#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 <freertos/queue.h>
|
|
|
#include "esp32/rom/ets_sys.h"
|
|
|
#include "dht11.h"
|
|
|
#include <driver/rmt_rx.h>
|
|
|
#include <driver/rmt_tx.h>
|
|
|
#include <soc/rmt_reg.h>
|
|
|
#include "driver/gpio.h"
|
|
|
#include <string.h>
|
|
|
#include <esp_log.h>
|
|
|
|
|
|
#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
|