記錄一下折騰nodemcu的經過,
本文主要講述如何使用nodemcu開發板上報資料到onenet云平臺
硬體連接

如圖所示,黑線為地線,紅線為接3.3V,藍色的線為資料線,
軟體代碼
有關與溫濕度資料的獲取請查看本人撰寫的這篇《基于nodemcu開發板與DHT11溫濕度傳感器》
【https://blog.csdn.net/Lozenyi/article/details/115409547】
首先是相關的頭檔案
#include <DHT.h>//溫濕度傳感器庫
#include <ESP8266WiFi.h>//WiFi頭檔案
#include <PubSubClient.h>//mqtt庫頭檔案
WIFI與MQTT協議的相關連接引數的設定
//接入WiFi引數
#define wifi_ssid "youwifissid"
#define wifi_passwd "youwifipawssd"
//MQTT協議接入引數
const char* mqtt_server = "mqtt.heclouds.com";//mqtt服務器網址【這是onenet的mqtt服務器】
const char* mqtt_com="6002";//mqtt服務器埠
const char* mqtt_ID="*********";//設備ID
const char* mqtt_CID="*******";//產品ID
const char* mqtt_key="********";//鑒權資訊【密碼】
實體化
WiFiClient wifiClient;//建立WiFiClient物件
PubSubClient mqttClient(wifiClient);//建立mqttClient物件
WiFi初始化
//WiFi初始化【連接WiFi】
void WiFiInit(){
WiFi.mode(WIFI_STA);//設定為客戶端模式
WiFi.begin(wifi_ssid,wifi_passwd);//輸入WiFi引數
while(WiFi.status() != WL_CONNECTED){//判斷連接狀態,后面的是個庫里定義的常量
delay(2000);
Serial.println("WIFI not Connect");
}
Serial.println("Connected to AP");
Serial.print("IP address is ");
Serial.println(WiFi.localIP());
}
mqtt連接函式,【用于重連服務】
void mqtt_commend(){
while(!mqttClient.connected()){
Serial.print("Attempting MQTT connection...");
if(mqttClient.connect(mqtt_ID,mqtt_CID,mqtt_key)){//連接引數
Serial.println("connected");
mqttClient.publish("temperature",itoa(tem,str_tem,10));
mqttClient.publish("humidity",itoa(hum,str_hum,10));
}else{
Serial.print("failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" ——1秒后重試");
delay(1000);
}
}
}
資料獲取與處理
//資料處理【資料封裝】
dht11();//獲取溫濕度資料到
char json[256];
char *JsonStr="{\"datastreams\":[{\"id\":\"temperature\",\"datapoints\":[{\"value\":%f}]},{\"id\":\"humidity\",\"datapoints\":[{\"value\":%f}]}]}";
sprintf(json,JsonStr,tem,hum);
unsigned short jsonlen=strlen(json);
unsigned char data[jsonlen+3];
data[0]='\x01';
data[1]=jsonlen>>8;
data[2]=jsonlen;
memcpy(data+3,json,jsonlen);
資料上報
//資料發送函式【標簽頭,有效資料,有效資料長度】
mqttClient.publish("$dp",data,jsonlen+3);
代碼整體
/*
專案名:基于nedomcu的MQTT上傳溫濕度資料
*/
//頭檔案設定
//#include <dht11.h>//溫濕度傳感器DHT11頭檔案
#include <DHT.h>//溫濕度傳感器庫【麻省理工庫】
#include <ESP8266WiFi.h>//WiFi頭檔案
#include <PubSubClient.h>//mqtt庫頭檔案
#include <Ticker.h>//任務調度頭檔案
//關于溫濕度傳感器的設定
#define DHTTYPE DHT11//溫濕度傳感器型號
#define DHT11_PIN 2//溫濕度檢測引腳【智能選用】
DHT dht(DHT11_PIN,DHTTYPE);//建構式,實體化
//dht11 DHT11;//實體化
//定義溫濕度全域變數
float tem;
float hum;
char str_tem[10];
char str_hum[10];
WiFiClient wifiClient;//建立WiFiClient物件
PubSubClient mqttClient(wifiClient);//建立mqttClient物件
//接入WiFi引數
#define wifi_ssid "youwifissid"
#define wifi_passwd "youwifipawssd"
//MQTT協議接入引數
const char* mqtt_server = "mqtt.heclouds.com";//mqtt服務器網址【這是onenet的mqtt服務器】
const char* mqtt_com="6002";//mqtt服務器埠
const char* mqtt_ID="*********";//設備ID
const char* mqtt_CID="*******";//產品ID
const char* mqtt_key="********";//鑒權資訊【密碼】
//采集溫濕度并顯示的函式
void dht11(){
//讀取溫濕度資料
dht.begin();
tem=dht.readTemperature();
hum=dht.readHumidity();
delay(300);
Serial.print("t=");
Serial.print(tem);
Serial.print("*C,h=");
Serial.print(hum);
Serial.print("%\n");
}
//WiFi初始化【連接WiFi】
void WiFiInit(){
WiFi.mode(WIFI_STA);//設定為客戶端模式
WiFi.begin(wifi_ssid,wifi_passwd);//輸入WiFi引數
while(WiFi.status() != WL_CONNECTED){//判斷狀態,后面的是個庫里定義的常量
delay(1000);
Serial.println("WIFI not Connect");
}
Serial.println("Connected to AP");
Serial.print("IP address is ");
Serial.println(WiFi.localIP());
}
//連接MQTT服務器
void mqtt_commend(){
while(!mqttClient.connected()){
Serial.print("Attempting MQTT connection...");
if(mqttClient.connect(mqtt_ID,mqtt_CID,mqtt_key)){//連接引數
Serial.println("connected");
mqttClient.publish("temperature",itoa(tem,str_tem,10));
mqttClient.publish("humidity",itoa(hum,str_hum,10));
}else{
Serial.print("failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" ——1秒后重試");
delay(1000);
}
}
}
//初始化【只執行一遍】
void setup() {
pinMode(DHT11_PIN, INPUT);
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);//設定串口波特率
WiFiInit();
//設定MQTT服務器和埠號(這里使用的是普通的TCP埠)
mqttClient.setServer(mqtt_server, 6002);//連接服務器
while(!mqttClient.connect(mqtt_ID,mqtt_CID,mqtt_key));
Serial.print("MQTT服務器連接成功!");
}
//主回圈函式
void loop() {
//重連機制
if(!mqttClient.connected()){
//重連
mqtt_commend();
}
mqttClient.loop();
//資料發送處理
delay(1000);//延時處理
//資料處理【資料封裝】
dht11();//獲取溫濕度資料到
char json[256];
char *JsonStr="{\"datastreams\":[{\"id\":\"temperature\",\"datapoints\":[{\"value\":%f}]},{\"id\":\"humidity\",\"datapoints\":[{\"value\":%f}]}]}";
sprintf(json,JsonStr,tem,hum);
unsigned short jsonlen=strlen(json);
unsigned char data[jsonlen+3];
data[0]='\x01';
data[1]=jsonlen>>8;
data[2]=jsonlen;
memcpy(data+3,json,jsonlen);
//資料發送函式【標簽頭,有效資料,有效資料長度】
mqttClient.publish("$dp",data,jsonlen+3);
}
重點難點
關于上報的資料格式
在設備端接入協議-MQTT檔案中的5.接入流程-5.2訊息發布-5.2.1資料點上報有相關的描述,

看官可以自行查看該檔案,檔案下載鏈接放在下一行
【https://open.iot.10086.cn/doc/multiprotocol/book/develop/mqtt/device/doc-tool.html】
詳解上報json格式
{
"datastreams":[//必要項,允許多條資料上報
{
"id":"temperature",//資料流名稱
"datapoints":[
{"value":25}//資料流的值
]
},{
"id":"",//資料流名稱
"datapoints":[
{"value":%d}//資料流的值
]
}
]
}
注意:“”在加進代碼里需要使用\保護!!!
感謝“我要開飛機”博主的以下文章,大家可以看一下我參考的這篇文章,資料處理部分參照了該篇的,但是JsonStr那個地方出現的問題,自己折騰了一下才搞定,
【https://blog.csdn.net/oBaoChiChenMo/article/details/87996899?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161683310816780255217444%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161683310816780255217444&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-2-87996899.pc_search_positive&utm_term=nodemcu+mqtt%E6%8E%A5%E5%85%A5onenet】
以上為本文全部內容,如有錯誤的地方煩請看官指正指正!小弟感激不盡!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272306.html
標籤:其他
上一篇:電磁場中相位常數K和β的關系
