欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > c/c++ >内容正文

c/c++

利用MQTT协议实现Arduino与onenet测温湿度

发布时间:2023/12/20 c/c++ 68 豆豆
生活随笔 收集整理的这篇文章主要介绍了 利用MQTT协议实现Arduino与onenet测温湿度 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

一、代码

     根据实际情况,对WIFI的名称,密码进行修改,onenet的端口号与IP地址不必修改,设备id,产品id,鉴权信息通过onenet平台获取

#include <WiFi.h> #include "DHT.h" #include "PubSubClient.h" #include "Ticker.h" #define DHTPIN 21 //`#define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHT11); int god=0; const int led =15; //灯的接口 const char *ssid = "ABCD"; //wifi名称 const char *password = "12345678";//wifi密码 const char *mqtt_server = "183.230.40.96"; //onenet 的 IP地址 const int port = 6002; //端口号 #define mqtt_devid "960321553" //设备ID #define mqtt_pubid "529638" //产品ID //鉴权信息 #define mqtt_password "test12" //鉴权信息 WiFiClient espClient; //创建一个WIFI连接客户端 PubSubClient client(espClient); // 创建一个PubSub客户端, 传入创建的WIFI客户端 char msg_buf[200]; //发送信息缓冲区 char msgJson[75]; //要发送的json格式的数据 unsigned short json_len = 0; //json长度 //信息模板 char dataTemplate[] = "{\"temp\":%.2f,\"humi\":%.2f,\"led\":%d}"; // temp humi要与onenet相对应 Ticker tim1; //定时器,用来循环上传数据void setupWifi(){WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print("正在连接中----\n");}Serial.print("WIFI已连接\n");Serial.print(WiFi.localIP()); } void setup() {Serial.begin(115200);pinMode(led,OUTPUT);//输出setupWifi(); //调用函数连接WIFISerial.print(F("DHT11 test!"));dht.begin(); client.setServer(mqtt_server, port); //设置客户端连接的服务器,连接Onenet服务器, 使用6002端口client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息if (client.connected()){Serial.print("OneNet is connected!");//判断以下是不是连好了.}//client.setCallback(callback); //设置好客户端收到信息是的回调client.setCallback(callback); //订阅命令下发主题tim1.attach(5, sendTempAndHumi); //定时每5秒调用一次发送数据函数sendTempAndHumi}void loop() { delay(5000); float h = dht.readHumidity(); float t = dht.readTemperature(); float f = dht.readTemperature(true);if (isnan(h) || isnan(t) || isnan(f)) {Serial.println(F("Failed to read from DHT sensor!\n"));return;}//可以让我们通过串口查看数据Serial.print(F("Humidity: ")); Serial.print(h);Serial.print(F("% Temperature: "));Serial.print(t);Serial.print(F("℃ \n "));if (!WiFi.isConnected()) //先看WIFI是否还在连接{setupWifi();}if (!client.connected()) //如果客户端没连接ONENET, 重新连接{clientReconnect();delay(100);}client.loop(); //客户端循环检测}void sendTempAndHumi() {if (client.connected()){//dht.readHumidity()snprintf(msgJson,75,dataTemplate,dht.readTemperature(),dht.readHumidity(),god); json_len = strlen(msgJson); //msgJson的长度msg_buf[0] = char(0x03); //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3msg_buf[1] = char(json_len >> 8); //数据第二位是要发送的数据长度的高八位msg_buf[2] = char(json_len & 0xff); //数据第三位是要发送数据的长度的低八位memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJsonmsg_buf[3 + strlen(msgJson)] = 0; //添加一个0作为最后一位, 这样要发送的msg_buf准备好了Serial.print("public the data:");Serial.print(msgJson);client.publish("$dp", (uint8_t *)msg_buf, 3+strlen(msgJson));//发送数据到主题delay(500);} }//收到主题下发的回调, 注意这个回调要实现三个形参 1:topic 主题, 2: payload: 传递过来的信息 3: length: 长度 void callback(char *topic, byte *payload, unsigned int length) {Serial.print("Message arrived [");Serial.print(topic);Serial.print("] ");//for (int i = 0; i < length; i++) {//Serial.print((char)payload[i]);//}Serial.println();if ((char)payload[0] == '0') {digitalWrite(led, LOW); // god=0;} if ((char)payload[0] == '1') {digitalWrite(led, HIGH); // god=1;}else{}}void clientReconnect() {while (!client.connected()) //再重连客户端{Serial.print("reconnect MQTT...");if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password)){Serial.print("connected");}else{Serial.print("failed");Serial.print(client.state());Serial.print("try again in 5 sec");delay(5000);}} }

二、onenet平台

1.登录onenet平台。点击切换至旧版

 2.点全部产品,选择多协议接入

3.点击添加产品,产品名称设置是英文,其他可自由选择,但设备接入协议必须选择MQTT

 

4.添加完产品后,添加设备,设备名称设置是英文,鉴权信息自己设定,(这个是代码中需要的)

5.添加完设备后,点击数据流模板,添加数据流

 此处的temp与humi分别表示温湿度的数据流名称

6.设备列表中,点击设备详情 ,可查看设备的相关数据

三、结果

总结

以上是生活随笔为你收集整理的利用MQTT协议实现Arduino与onenet测温湿度的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。