#include <Arduino.h>
#include "WiFi.h"
#include "PubSubClient.h"
#include "Ticker.h"
#include "ESPAsyncWebServer.h"
#include "stdio.h"
#include "DHTesp.h" //引入DHTesp头文件,为下面调用函数做准备。
#include<DHT.h>
#define DHTPIN 15
#define DHTTYPE DHT11
DHT dht(DHTPIN,DHTTYPE);
const char *ssid = "LA"; //wifi名
const char *password = "15032097092"; //wifi密码
const char *mqtt_server = "183.230.40.96"; //onenet 的 IP地址183.230.40.120
const int port = 1883; //端口号
#define mqtt_devid "shuibiao_1" //设备ID
#define mqtt_pubid "uxs6lNA4K3" //产品ID
//鉴权信息
#define mqtt_password "version=2018-10-31&res=products%2Fuxs6lNA4K3%2Fdevices%2Fshuibiao_1&et=2686969126&method=md5&sign=As9pkzSzlILDEs7%2BWMApeQ%3D%3D" //鉴权信息
WiFiClient espClient; //创建一个WIFI连接客户端
PubSubClient client(espClient); // 创建一个PubSub客户端, 传入创建的WIFI客户端
char msgJson[200]; //发送信息缓冲区
//信息模板
//char dataTemplate[] = "{\"id\":123,\"version\":1.0,\"params\":{\"wendu\":{\"value\":19}}}";char dataTemplate[] = "{\"id\":123,\"dp\":{\"temp\":[{\"v\":%.2f}],\"humi\":[{\"v\":%.2f}]}}";
//char dataTemplate[] = "{\"id\":\"123\",\"version\":\"1.0\",\"params\":{\"wendu\":{\"value\":%.2f},\"shidu\":{\"value\":%d}]}}";
//char dataTemplate[] = "{\"id\":\"123\",\"version\":\"1.0\",\"params\":{\"wendu\":{\"value\":%.2f},\"shidu\":{\"value\":%.2f}}}";
//char dataTemplate[] = "{\"id\":\"123\",\"version\":\"1.0\",\"params\":{\"wendu\":{\"value\":%.2f}}}";
char dataTemplate[] = "{\"id\":\"123\",\"version\":\"1.0\",\"params\":{\"wendu\":{\"value\":%.2f},\"shidu\":{\"value\":%.2f}}}";
Ticker tim1; //定时器,用来循环上传数据
//连接WIFI相关函数
void setupWifi()
{
delay(10);
Serial.println("连接WIFI");
WiFi.begin(ssid, password);
while (!WiFi.isConnected())
{
Serial.print(".");
delay(500);
}
Serial.println("OK");
Serial.println("Wifi连接成功");
}
//收到主题下发的回调, 注意这个回调要实现三个形参 1:topic 主题, 2: payload: 传递过来的信息 3: length: 长度
void callback(char *topic, byte *payload, unsigned int length)
{
Serial.println("message rev:");
Serial.println(topic);
for (size_t i = 0; i < length; i++)
{
Serial.print((char)payload[i]);
}
Serial.println();
}
//向主题发送模拟的温湿度数据
//void sendTempAndHumi()
//{
// if (client.connected())
// {
// // snprintf(msgJson, 75, dataTemplate, 26.5, 42); //将模拟温湿度数据套入dataTemplate模板中, 生成的字符串传给msgJson
// snprintf(msgJson, 75, dataTemplate, 26.5,30);
// Serial.print("public the data:");
// Serial.println(msgJson);
// //client.publish("$sys/PSl64STX9X/esp32/thing/property/post", (uint8_t *)msgJson, strlen(msgJson));
// client.publish("$sys/uxs6lNA4K3/shuibiao_1/thing/property/post", (uint8_t *)msgJson, strlen(msgJson));
// //发送数据到主题
// }
//}
void sendTempAndHumi()
{
float h=dht.readHumidity();//读湿度
float t=dht.readTemperature();//读温度
if (client.connected())
{
// float temperature = t; // 模拟温度数据
// float humidity = h; // 模拟湿度数据
//snprintf(msgJson, sizeof(msgJson), dataTemplate, temperature, humidity);
snprintf(msgJson, 200, dataTemplate, t, h);
Serial.print("Publishing the data: ");
Serial.println(msgJson);
// client.publish("$sys/uxs6lNA4K3/shuibiao_1/thing/property/post", msgJson);
client.publish("$sys/uxs6lNA4K3/shuibiao_1/thing/property/post", (uint8_t *)msgJson,strlen(msgJson));
}
}
//重连函数, 如果客户端断线,可以通过此函数重连
void clientReconnect()
{
while (!client.connected()) //再重连客户端
{
Serial.println("reconnect MQTT...");
if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password))
{
Serial.println("connected");
client.subscribe("$sys/uxs6lNA4K3/shuibiao_1/thing/property/post/reply"); //订阅命令下发主题
}
else
{
Serial.println("failed");
Serial.println(client.state());
Serial.println("try again in 5 sec");
delay(5000);
}
}
}
void setup()
{
Serial.println("DHT11 test");
dht.begin();
Serial.begin(115200); //初始化串口
delay(3000); //这个延时是为了让我打开串口助手
setupWifi(); //调用函数连接WIFI
client.setServer(mqtt_server, port); //设置客户端连接的服务器,连接Onenet服务器, 使用6002端口
client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息
if (client.connected())
{
Serial.println("OneNet is connected!");//判断以下是不是连好了.
}
client.setCallback(callback); //设置好客户端收到信息是的回调
client.subscribe("$sys/uxs6lNA4K3/shuibiao_1/thing/property/post/reply"); //订阅命令下发主题
tim1.attach(10, sendTempAndHumi); //定时每10秒调用一次发送数据函数sendTempAndHumi
}
void loop()
{
if (!WiFi.isConnected()) //先看WIFI是否还在连接
{
setupWifi();
}
if (!client.connected()) //如果客户端没连接ONENET, 重新连接
{
clientReconnect();
delay(100);
}
client.loop(); //客户端循环检测
}
ESP32连接温度传感器并传输到oneNET里面代码
最新推荐文章于 2024-04-12 17:14:50 发布