前言
近段时间由于项目需求,需要将原来的项目增加应用层的MQTT协议,由于不懂MQTT所以从B站学习了正点原子的lwip课程,看完后需要进行实践,所以选择了ONENET平台来作为学习的时间的平台。
1、学习准备
先下载工具:
MQTT X 是一款开源 5.0 桌面测试客户端,它支持在 macOS,Linux,Windows 操作系统上运行。
MQTT X 支持创建多个同时在线的 MQTT 客户端,方便用户快速测试 MQTT/TCP、MQTT/TLS 、MQTT/WebSocket 的连接/发布/订阅功能及其他 MQTT 协议特性。
EMQ官网下载:免费下载、试用 EMQ 产品
先下载进行安装
2、ONENET平台
1)注册账号 这里手机号注册就可以,不多说了
2)创建产品
产品开发->创建产品
产品分类->选择一个合适的(选哪个其实不是很重要),我选择了如下图
选择WIFI\以太网都没差别,非*我们可以不填,最后电机确定完成产品创建
3)创建产品的功能点
点击产品开发
点击设置物模型
添加自定义功能点
下图是我自己自定义添加的(注由于我们产品注册温湿度传感器,系统默认会有创建好了的功能点),只是我不想用系统创建,便自己创建
定义好产品的功能点,我们就可以添加设备。
4)添加设备
这里设备相当于要就行MQTT通讯的设备,有几台参与,就创建几个设备;比如我有一个开发板,也有一个APP获取数据,那么这里就需要创建两个设备。这么理解。
下图就是我创建好的两个设备,想创建几个由你定义
3、学习使用MQTTX客户端与ONENET平台数据通讯
我们学习使用MQTT最后都是为了移植MQTT进行项目开发,这里我们先不进行程序移植,我们先使用便捷的客户端先进行通讯,尝试学习使用发布和订阅的相关指令,这样才能更好掌握,避免从零直接弄程序,来一堆问题,先确保我们能正常通讯。
1)MQTTX已经下载好了
2)准备ONENET平台的一个工具,叫做 Token生成工具
网址:https://open.iot.10086.cn/doc/iot_platform/images/tools/token.exe
3)打开MQTT X客户端,进入客户端配置页面,先把语言改成中文
配置连接
产品ID:
ONENET服务器地址:
但是如果地址使用官网提供的地址:studio-mqtt.heclouds.com,我连接不上
得使用: 183.230.40.96地址,才连接的上,你们回头可以试下。
密码:
最后生成的,复制粘贴到MQTTX的密码那行。
时间戳:只要这个时间戳时间大于当前时间,所以我们可以填写时间大一些
设备钥匙:
4)点击连接,链接成功后入下图,设备也会在ONENET平台显示在线
5)要进行通讯之前,我们先了解ONENET平台规定的 订阅与发布相关指令
这个是官方链接:OneNET - 中国移动物联网开放平台
1)设备上报信息(在ONENET属性即数据点),官网叫发布属性上报
$sys/{pid}/{device-name}/thing/property/post
2)设备订阅响应信息(我们上报了信息,订阅这条就可以收到服务器返回的是否成功信息)
$sys/{pid}/{device-name}/thing/property/post/reply
3)接收服务器推送消息,就要订阅这条命令
$sys/{pid}/{device-name}/thing/property/set
4)设备收到服务器推送消息,要返回成功给他,就要发布这条命令
$sys/{pid}/{device-name}/thing/property/set_reply
了解完命令后,我们先进行数据属性发布
6)在发布前,先订阅服务器响应,不订阅这条,就是我们发布完消息,不知道服务器是否收到数据,订阅了,我们发布完消息,就可以收到服务器的返回信息。
下面是官方提供的回复模式(但是官方发布格式使用有问题,按照文章那的来就可以,后面有距说明):OneNET - 中国移动物联网开放平台
注:在发布命令前,一定要确保你输入的命令是正确的,不带任何空格等或者写错,一旦有出入写错,你客户端在点击发布时候就会,发送完数据就会立马断开连接,如下图
6.1)订阅
$sys/x818hiMIU0/DHT11/thing/property/post/reply
6.2)发布消息:
$sys/x818hiMIU0/DHT11/thing/property/post
{
"id": "123",
"version": "1.0",
"params": {
"CurrentTemperature": {
"value": 2.6
},
"CurrentVoltage": {
"value": 2
}
}
}
发布成功后,平台的数据就会变化,对比数据是对的
6.3)接收服务器下发消息,即订阅
$sys/x818hiMIU0/DHT11/thing/property/set
订阅后,我们在服务器进行下发数据测试
但是由于我们客户端收到数据后,没有返回成功与否,所以服务器这些等待响应就显示
所以这时候就要用到,发布命令,这句 命令用来回复服务器我收到了数据
$sys/{pid}/{device-name}/thing/property/set_reply
$sys/x818hiMIU0/DHT11/thing/property/set_reply
{ "id":"39", "code":200, "msg":"success" }
注意,回复的ID号,要和收到的服务器下发的那条数据的id一致,都则回复无效
如下图所示:
这张就是总结上面罗列,完成的服务器下发,我们客户端收到并返回
以上就是我们常用的数据交互等功能,由于我们是依靠ONENET平台开发,所以指令需要按照官方提供的来,实际项目开发,可以与软件工程师交流编写指令等。
下面列举一些常见的问题,下面是我在调试中遇到的问题截图,供后续大家参考,减少脱坑时间
1)针对ONnet平台,客户端在发布消息时候,如果是参数有单精度或双精度,参数的数据是不允许加双引号,如下图
2)发布的消息结构,按照官方提供的发布的消息有提那家时间戳,但实际我发送如按照官方形式来,发布是返回错误,所以发布要不带时间戳才可以返回成功 ,下图是添加时间戳返回失败的截图
3)如果你参数设定的整形的,如果发布时候你写单精度或双精度,也是会返回错误
这样才是成功的
4)在发布时候对参数加引号加在错误位置,也会返回错误
5)最重要一点,如果指令参杂任何字符空格等或者少字符,一旦你点击发布消息,那么MQTTX客户端就会立即断开连接,我就是在这里吃亏很久,因为我指令从官方复制下来,可能带有空格,所以每次发布都是断开,后面就先把指令复制到记事本,消除隐藏格式,在从记事本复制早MQTTX实现发布。
7、进入程序开发
注意:这里使用原子提供的MQTT例程,然后对其进行简单修改,STM32F407+LWIP进行MQTT实验的,下面进行程序解析。最下文会放置工程链接
经过前面第一轮的MQTTX客户端实验,到这里我们应该熟悉许多,现在我们开启层序;
程序时基于原子哥实验来的,我是先把原子哥的LWIP实验看完,对TCP有个了解,大家也可以去看看,有帮助;
主程:
.h文件
.c文件
1)是否成功连接ONENET服务器
2)订阅指令发送出去完成
3)验证订阅指令有无出错,是否订阅成功
4)发布数据
5)客户端发布后,查看回调函数,接收服务器返回“信息”
6)收到服务器自己下发的数据消息
7)最后一点值得大家注意下,就是设置MQTT发送/接收数据包长度的宏
我之前没去修改长度,在调试时有一次发送数据多,到时候我们开发板收到后,数据包被分成两包数据,原因就是长度定义太短,如下图
大家要修改,可以去修改这个宏定义
以上就是程序MQTT常用的发布与订阅,关主要函数实现功能均已验证,程序我将上传上来,大家可以自己调试感受下
百度网盘:
链接:https://pan.baidu.com/s/1c7KbmfuRHs1QWDEC0q6nog
提取码:n5l4