利用MQTT协议实现Arduino与onenet测温湿度
生活随笔
收集整理的這篇文章主要介紹了
利用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测温湿度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5查看swf视频格式,如何使用V
- 下一篇: usemvc永远不会被使用_你永远不会离