记录一下折腾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】
?
?
{
"datastreams":[//必要项,允许多条数据上报
{
"id":"temperature",//数据流名称
"datapoints":[
{"value":25}//数据流的值
]
},{
"id":"",//数据流名称
"datapoints":[
{"value":%d}//数据流的值
]
}
]
}
注意:“”在加进代码里需要使用\保护!!!
感谢“我要开飞机”博主的以下文章,大家可以看一下我参考的这篇文章。数据处理部分参照了该篇的,但是JsonStr那个地方出现的问题,自己折腾了一下才搞定。
以上为本文全部内容,如有错误的地方烦请看官指正指正!小弟感激不尽!!
?
?
?
?
?
来源:DeepenStudy 漏洞文件:js.asp % Dimoblog setoblog=newclass_sys oblog.a...
idea官方推送了2020.2.4版本的更新,那么大家最关心的问题来了,之前激活idea202...
在Flash Player 10.1及以上版本中,adobe新增了全局错误处理程序UncaughtErrorEv...
大家好,我是狂聊君。 今天来聊一聊 Mysql 缓存池原理。 提纲附上,话不多说,直...
本文实例讲述了AJAX+Servlet实现的数据处理显示功能。分享给大家供大家参考,具...
前言 项目开发中不管是前台还是后台都会遇到烦人的null,数据库表中字段允许空值...
本文转载自微信公众号「SH的全栈笔记」,作者SH。转载本文请联系SH的全栈笔记公...
本文转载自微信公众号「SQL数据库」,作者丶平凡世界 。转载本文请联系开发公众...
CKeditor,以前叫FCKeditor,已经使用过好多年了,功能自然没的说。最近升级到3....
问题:我们在做flex的开发中,如果用到别人搭建好的框架,而别人的server名称往...