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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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