You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

178 lines
5.9 KiB
C

1 month ago
#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