目录
前言
物联网平台-新版Onenet
Onenet平台更新后,不再更新维护多协议接入.本文以ESP8266设备通过MQTT协议接入新版One net云平台为例,ESP8266上传测量数据至物模型,微信小程序访问云平台API接口,实现物模型数据查询和命令下发。
ESP8266信息:NodeMCU-12E,开发环境为Arduino;
STM32信息:STM32C8T6,开发环境Keil 5;
附带onenet平台配置说明
一、Onenet平台配置
1.创建产品
首先浏览器搜索Onenet平台,打开后进入开发者中心。
点击产品开发---->创建产品;
选择产品类别;
选择其他行业->其他行业->其他类别
点击保存;
选择智能化方式:设备接入;
填写信息:注意几个点为:
节点属性->直连设备;
接入协议->MQTT;
数据格式->OneJson;
联网方式->WIFI;
开发方案选择->自定义方案
点击确定,保存;
然后我们就可以看到一个叫ESP_IOT的产品被创建。
2.配置产品属性
点击产品开发
设置物模型
添加自定义功能
根据自己需求设置模型物理功能属性,此处注意,最好将读写类型改为读写。
按照上述操作,我们一共配置两类功能,温度(tem)、湿度(hum)。
属性创建完成,如下图所示:
记住标识符tem和hum,这是设备上传数据以及获取数据的重要接口。
3.创建物模型(创建设备)
创建完产品就该配置物模型了,点击设备接入管理->设备管理->添加设备
选择单个设备;
所属产品选择刚刚创建的产品;
设备名称自定义,注意以字母或_头;
配置完成点击确认;
点击确认后就可以看到我们刚刚创建的产品啦;
点击 详情->属性,可以看到我们刚刚给产品定义的属性被设备继承了。以后硬件上传的数据可以在这里看到。
到此为止,我们平台的配置就完成了,下面需要硬件设备连接Onenet平台
二、ESP8266设备连接
ESP8266设备连接通过MQTT协议实现,MQTT协议需要使用到PubSubClient库,可在Github上下载ZIP包导入或使用库管理器下载;不再详细叙述。
ESP8266代码资源下载链接:
https://download.csdn.net/download/qq_53038430/89715266
1.获取MQTT连接参数
//在这里修改MQTT客户端信息
#define MQTT_HOST "mqtts.heclouds.com" //MQTT服务器地址
#define MQTT_PORT 1883 //MQTT端口
#define MQTT_USER "HAgE46jiXO" //用户名
#define MQTT_PASSWD "version=2018-10-31&res=products%2FHAgE46jiXO&et=1918593319&method=md5&sign=fykV7W63NwloSkGYgACuVA%31%3D" //密码
#define MQTT_CLIENTID "ESP8266" //客户端参数
MQTT连接需要用到5个连接参数:
- 服务器地址:"mqtts.heclouds.com" 固定不变的
- 服务器端口:1883 固定不变的
- 用户名(User ID):产品ID;
- 密码(Token):根据计算Token生成
- 客户端参数(Client ID):设备名字
token计算需要通过Token计算工具
Token工具官方链接:https://open.iot.10086.cn/doc/v5/fuse/detail/1487
以产品级授权为例,需要三个参数:res,key,et;
res字段为products/{产品id},key为产品级key,et为登录授权过期时间(Unix格式10位数字)
点击产品开发->产品开发,在首页即可看到产品ID及产品key。
随便找一个UNIX时间戳转换器,时间设置尽量很靠后;以2030-6-17为例,得到时间戳为1907914732;
例:
res:products/m8kIpm5JYM
key:wcMNHQVXURN3b48t+2PHpbNpmxV/U+Mt8Xk9KW0am60=
et:1907914732
其他默认,点击生成Token
Token:version=2018-10-31&res=products%2Fm8kIpm5JYM&et=1907914732&method=md5&sign=Vfa1sC5CMnSfU79EYXMfwQ%3D%3D
TOKEN即为连接密码,将生成的Token填入MQTT_PASSWORD;MQTT连接参数配置即可完成。
利用上述参数,书写MQTT协议连接代码即可成功连接Onenet平台。下面讲述如何上传数据到物模型;
2.Onenet物理属性上传主题
"$sys/0qTk9Jw944/设备ID/thing/property/post"
例如:
"$sys/0qTk9Jw944/ESP8266/thing/property/post"
设备ID就是设备名字,也是MQTT连接参数里面的客户端参数(Client ID);
向设备主题发送数据,等同更新设备属性(前面提到过)
3.上传数据
上传数据关键代码如下:
long now = millis();//获取当前时间戳
if (now - lastMsg > 2000) {//如果达到2s,进行数据上传
lastMsg = now;
StaticJsonDocument<200> jsonBuffer; //声明一个JsonDocument对象,长度200
// 对象嵌套
jsonBuffer["id"]="111";
JsonObject root = jsonBuffer.createNestedObject("params"); //添加一个对象节点
root["tem"]["value"] = tem; //tem为存储温度数据的变量,"tem"为云平台属性标识符
root["hum"]["value"] = hum; //hum为存储湿度数据的变量,"hum"为云平台属性标识符
jsonBuffer["version"]="1.0";
String output;
serializeJson(jsonBuffer, output); // 序列化JSON数据并导出字符串
// Serial.println(output); // 串口打印最后输出的字符串
client.publish(up_topic,output.c_str());//温度数据上传
}
这里用到了ArduinoJson库,将数据转化为json字符串,如果上传数据不是JSON格式则会报错(创建产品选数据格式为:onejson)建议Arduino IDE版本为2.0以上;
上述代码中 up_topic变量存储设备属性上传主题,即:
char* up_topic = "$sys/0qTk9Jw944/ESP8266/thing/property/post"; //上传数据主题名
通过上述配置我们就可以实现将测量的数据上传到Onenet平台下的设备属性里面;
三、ESP8266和STM32通信
STNM32在系统中负责采集环境数据,例如温度,湿度,光照等...采集完成后通过串口通信将数据发送给8266;
以STM32串口1和8266串口0通信为例,接线图:
1.STM32发送数据,8266解析并上传
STM32通过串口发送数据;以发送字符串为例:
"35#40";
其中35为温度数据,40为湿度数据;
8266串口接收后解析字符串;实现代码:
//解析STM32串口传送的数据
if(RX_DATA!=""){ //RX_DATA存储串口数据
//fenge为字符串分割函数
if(fenge(RX_DATA,"#",0).toInt()>=0)
tem=fenge(RX_DATA,"#",0).toInt(); //提取温度信息
if(fenge(RX_DATA,"#",1).toInt()>=0)
hum = fenge(RX_DATA,"#",1).toInt(); //提取湿度信息
RX_DATA = ""; //清空串口缓存
}
经过上述代码,tem变量存储了温度数值,hum变量存储了湿度数值;通过第二部分的上传代码即可将采集到的温湿度数据上传至Onenet平台;
2.8266接收上位机命令通过串口传送给STM32
8266接收命令在MQTT协议中callback函数中实现
//MQTT订阅主题,下发消息接收函数
void callback(char* topic, byte* payload, unsigned int length) {
// Serial.println(topic);
if(strcmp(topic,down_topic)==0)//topic == down_topic
{
payload[length] = '\0';
json = (char *)payload; //json变量存储上位机发送指令,通过ArduinoJson库可对指令进行提取
}
}
上述代码中,字符串变量json存储了云平台下发指令,通过ArduinoJson库解析Json字符串即可将微信小程序发送的指令提取出来。
ESP8266通过串口将指令发送给STM32,STM32接收到指令后控制继电器,LED,风扇灯等外设开关。
四、微信小程序获取数据及发送指令
微信小程序获取设备数据及发送指令是通过调用平台API接口实现的。
Onenet官方给出了API接口列表,链接:OneNET - 中国移动物联网开放平台
下面看两种应用的API接口
1.获取设备最新上传数据
API接口为:/thingmodel/query-device-property
URL连接:https://iot-api.heclouds.com/thingmodel/query-device-property
需要在URL连接添加请求信息:设备ID和设备名字
使用HTTP GET请求获取到信息,然后解析JSON字符串即可获取到数据。
微信小程序详细代码如下所示:
2.设置设备属性
注意!设置设备属性需要硬件设备在线,不然无法响应
微信小程序通过Onenet平台向硬件设备发送指令可以通过设置属性的API实现;
API接口为:/thingmodel/set-device-property
URL连接:'https://iot-api.heclouds.com/thingmodel/set-device-property'
使用POST请求发送指令,URL需要添加请求头信息;
注意!!!!!注意!!!!注意!!!
使用/thingmodel/set-device-property设置设备属性这个API接口后,硬件设备需要向Onenet平台发送应答命令;
应答命令发送主题为:$sys/{pid}/{device-name}/thing/property/set_reply
其中pid为产品ID;device-name为设备名字;
向该主题发送应答消息内容有三项,分别为id,msg,code,其中id用来区分设置属性的消息,msg和code代表硬件有没有成功收到消息
3.获取设备在线状态
API接口:/device/detail
使用GET请求获取信息,这里不再赘述;
微信小程序代码资源下载:
https://download.csdn.net/download/qq_53038430/89719064
五、系统测试
1.上传数据
设备属性定义如下,四个数据一个开关。
烧录代码进ESP8266,设备显示在线
用串口发送数据给8266,这里我定义了四个属性,空气温湿度,土壤湿度,气体浓度
全部设置为99;
可以看到云平台已经更新了数据
微信小程序模拟器也显示在线;
至此,硬件设备上传属性上位机查看就已完成。
2.设置设备属性
微信小程序点击打开或关闭按钮,ESP8266串口输出截图为:
注意!开关尽量不要选BOOL型,如果你选了Bool型,上传整数0或1会报错。
解析json字符串中led值即可获得开关是否关闭。
注意如果你想云平台属性中的开关变量也随着微信程序设置而改变,记得在设备属性上报主题上传led的值
上传主题:$sys/{pid}/{device-name}/thing/property/post
六、结尾
本期分享Onenet平台配置及应用就到此结束了;
如果您觉得对你有帮助,可以打赏一下下哦,您的鼓励是我创作的动力!
如果你有其他需求,例如需要定制硬件或上位机可以通过私信与我取得联系,
本人可做STM32、ESP8266,Arduino等硬件,可做QT上位机,安卓应用,微信小程序。
欢迎打扰!
关于本人:电子信息类研一在读,曾获得国家奖学金等多项奖项。闲时兼职,欢迎咨询!