记录一下折腾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那个地方出现的问题,自己折腾了一下才搞定。
以上为本文全部内容,如有错误的地方烦请看官指正指正!小弟感激不尽!!