新版Onenet物联网平台,微信小程序显示上传信息&发送指令。STM32&ESP8266实现采集数据并上传

目录

前言

一、Onenet平台配置

1.创建产品

2.配置产品属性

3.创建物模型(创建设备)

二、ESP8266设备连接

1.获取MQTT连接参数

2.Onenet物理属性上传主题

3.上传数据

三、ESP8266和STM32通信

1.STM32发送数据,8266解析并上传

2.8266接收上位机命令通过串口传送给STM32

四、微信小程序获取数据及发送指令

1.获取设备最新上传数据

2.设置设备属性

3.获取设备在线状态

五、系统测试

1.上传数据

2.设置设备属性

六、结尾


 


前言

物联网平台-新版Onenet

Onenet平台更新后,不再更新维护多协议接入.本文以ESP8266设备通过MQTT协议接入新版One net云平台为例,ESP8266上传测量数据至物模型,微信小程序访问云平台API接口,实现物模型数据查询和命令下发。

ESP8266信息:NodeMCU-12E,开发环境为Arduino;

STM32信息:STM32C8T6,开发环境Keil 5;

附带onenet平台配置说明

一、Onenet平台配置

1.创建产品

首先浏览器搜索Onenet平台,打开后进入开发者中心。

3ae0df72c448526da5b9d02c27d2deb3.png

点击产品开发---->创建产品;

4a6f14693c2f627b6c01f0b0487cfc82.png

选择产品类别;

ddd2736c1fb361970ebb538fd747f777.png

选择其他行业->其他行业->其他类别

点击保存

d6c5e96af6c116502a64648548c984a5.png

选择智能化方式:设备接入;

填写信息:注意几个点为:

节点属性->直连设备;

接入协议->MQTT;

数据格式->OneJson;

联网方式->WIFI;

开发方案选择->自定义方案

点击确定,保存;

51771c68851db21042532e5da2d15237.png

然后我们就可以看到一个叫ESP_IOT的产品被创建。

2.配置产品属性

fbf370f81369ea56e3b4fa65f5ba0cc6.png

点击产品开发

fa73e0d54192fcf33d6a6cf3253ee259.png

设置物模型

19b1593c6389dc389e59a5b78a9d5e39.png

添加自定义功能

f02790275c66b7b81887fae3b59aa4ed.png

根据自己需求设置模型物理功能属性,此处注意,最好将读写类型改为读写。

按照上述操作,我们一共配置两类功能,温度(tem)、湿度(hum)。

属性创建完成,如下图所示:

6c841719d7684f221452f2d631f5d818.png

记住标识符tem和hum,这是设备上传数据以及获取数据的重要接口。

3.创建物模型(创建设备)

创建完产品就该配置物模型了,点击设备接入管理->设备管理->添加设备

8e8af3ce4fbe56ccb9bba022700fbe10.png

选择单个设备;

所属产品选择刚刚创建的产品

设备名称自定义,注意以字母或_头

配置完成点击确认;

719d7cdc185b15b276fe1bb5022ad35b.png

点击确认后就可以看到我们刚刚创建的产品啦;

点击 详情->属性,可以看到我们刚刚给产品定义的属性被设备继承了。以后硬件上传的数据可以在这里看到

0c9b474b43392b6cb1163672bd6d718f.png

2fda1235c3bbf02c97cb6ce801e0eed7.png

到此为止,我们平台的配置就完成了,下面需要硬件设备连接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):设备名字

cbcb5022f082b93f4f44e7c97ec4c78d.png

token计算需要通过Token计算工具

Token工具官方链接:https://open.iot.10086.cn/doc/v5/fuse/detail/1487

7e27499125367e7bd923caff711cb593.png

以产品级授权为例,需要三个参数:res,key,et;

res字段为products/{产品id},key为产品级key,et为登录授权过期时间(Unix格式10位数字)

点击产品开发->产品开发,在首页即可看到产品ID及产品key。

46cc6f81110ac0f2503774edea6da8ae.png

随便找一个UNIX时间戳转换器,时间设置尽量很靠后;以2030-6-17为例,得到时间戳为1907914732;

a3a22e585bcdd0a026d3cb0d4459ec96.png

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通信为例,接线图:

cc17b840a91d23a109354d716fef4f97.png

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.上传数据

设备属性定义如下,四个数据一个开关。

07a7d20a742f981c5afe19580931d1de.png

烧录代码进ESP8266,设备显示在线

9ff1eb84d48c79d7344c2dd57185be0a.png

用串口发送数据给8266,这里我定义了四个属性,空气温湿度,土壤湿度,气体浓度

f617c6d84c4ca5afb15ecc610362ce88.png

全部设置为99;

e562c63b401f86e447f498f717af2d6d.png

可以看到云平台已经更新了数据

8f08021cef807c04f4e48387dbea3e88.png

微信小程序模拟器也显示在线;

至此,硬件设备上传属性上位机查看就已完成。

2.设置设备属性

微信小程序点击打开或关闭按钮,ESP8266串口输出截图为:

108406e24d042276305c52508df74b05.png

注意!开关尽量不要选BOOL型,如果你选了Bool型,上传整数0或1会报错。

解析json字符串中led值即可获得开关是否关闭。

注意如果你想云平台属性中的开关变量也随着微信程序设置而改变,记得在设备属性上报主题上传led的值

上传主题:$sys/{pid}/{device-name}/thing/property/post

六、结尾

本期分享Onenet平台配置及应用就到此结束了;

如果您觉得对你有帮助,可以打赏一下下哦,您的鼓励是我创作的动力!

如果你有其他需求,例如需要定制硬件或上位机可以通过私信与我取得联系,

 

本人可做STM32、ESP8266,Arduino等硬件,可做QT上位机,安卓应用,微信小程序。

欢迎打扰!

关于本人:电子信息类研一在读,曾获得国家奖学金等多项奖项。闲时兼职,欢迎咨询!

 

 

 

 

 

 

 

 

 

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hyacinth8201

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值