nodemcu使用mqtt连接onenet

记录一下折腾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

以上为本文全部内容,如有错误的地方烦请看官指正指正!小弟感激不尽!!

猜你喜欢

转载自blog.csdn.net/Lozenyi/article/details/115259816