0x01 MQTT基本概念
MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备之间的高效通信。
发布-订阅模式
发布-订阅模式与客户端-服务器模式的不同之处在于,它将发送消息的客户端(发布者)和接收消息的客户端(订阅者)进行了解耦。发布者和订阅者之间无需建立直接连接,而是通过 MQTT Broker 来负责消息的路由和分发。
下图展示了 MQTT 发布/订阅过程。温度传感器作为客户端连接到 MQTT Broker,并通过发布操作将温度数据发布到一个特定主题(例如 Temperature)。MQTT Broker 接收到该消息后会负责将其转发给订阅了相应主题(Temperature)的订阅者客户端。

[参考网页 https://www.emqx.com/zh/blog/the-easiest-guide-to-getting-started-with-mqtt]该网站有详细的MQTT教程
0x02 物联网平台
物联网平台目前有很多,例如阿里云、ONENET等原理上是一样的,区别在于各家的订阅的格式、验证的方法可能不一样而已。本文以ONENET为例。
1、ONENET物联网平台设置
登录onenet网站,选择开发者中心

选择物联网平台,创建产品


选择产品种类,按需选择。


添加设备到产品中。


添加设备名称,设备名称使用英文、数字和下划线的组合命名,最好不要使用中文。

2、测试物联网平台设备,学习如何使用mqtt连接物联网平台
需要使用的软件MQTTX 软件地址 https://mqttx.app/zh 下载软件运行如下:

下面介绍下必填项目与ONENET平台对应关系。打开设备管理。如图


密码的计算工具下载地址:https://open.iot.10086.cn/doc/mqtt/images/tools/token.exe
打开产品设置网页:

填写工具中相关信息:

其中key需要手机验证查看,复制到工具的key中。时间戳可以访问网站获得:
https://tool.chinaz.com/Tools/unixtime.aspx

这里需要注意,设置的时间要比现在的时间往后,如果到了设置的时间,密码将会失效。
点击创建获得密码复制到MQTTX工具中。

填写完成后点击connect

连接成功后,打开设备可以看到设备在线的状态显示。

至此,连接ONENET的物联网平台部分就已经通畅了。到这里我们知道要连接ONENET物联网需要知道产品ID,设备名称,服务器地址mqtts.heclouds.com(或者183.230.40.96),端口:1883。此外还需要账号(账号就是产品ID),密码,密码是使用工具token,需要产品的key、时间戳生成。这样就可以连接到对应的设备了。
连接设备后就可以订阅和发布相关消息到服务器了。
订阅
在开发者中心中选择产品开发,打开产品开发界面,在第一个界面中是模板列出的数据(在产品创建时候选择标准方案),也可以自定义数据,例如添加一个温度的数据,点击添加自定义功能点。


点击下一步之后到达第二个界面,在这个界面中有Topic管理界面。其中物模型Topic就是可以订阅与发布的内容。

以图中两个订阅为例,其中的device-name需要修改为自己设备的设备名称。打开MQTTX软件。

我们添加两个订阅:
注意两点:1、修改device-name为设备名称,本样例是classroom01;2、需要连接服务器之后才可以订阅,否则会出现如下问题:

添加成功后就可以看到如图

现在测试订阅的内容。打开设备列表,点击设备详情:

点击设备调试,选择刚刚添加的温度值,进行属性设置。

然后回到MQTTX软件就可以收到温度值被设置的消息了。

*** 通过这里的设置可以尝试去学习了解下属性值在设置时候的读写类型的含义,读写、只读是相对于什么而言。

到这里可以了解到,设备订阅了服务器上的订阅消息,当服务器上的相关事件触发的订阅内容,服务器会发数据给订阅了该事件的消息的设备。
发布
接下来看下如何发布消息给服务器。打开MQTTX,通过发布消息给服务器一个温度值。

按图中发布消息后,得到回复:

通过回复的消息我们可以看到,数据有错误,因为我们设置数据时候选择的步进是0.5,而发送时候是24.6就会报错了。所以这里要注意数据的名称之外还要注意数据的数据类型。修改后。发送消息后获得正确的回复

打开设备列表,选择设备详情中的属性,就可以看到发布的数据了。

通过这样方式可以测试和学习MQTT相关知识,调试服务器之间的连接可以知道它的连接过程和调试方法。接下来就可以把PC上MQTTX连接的过程放到BL618上就可以了。
3、BL618连接ONENET物联网平台
在样例工程目录中onenet_mqtt_sub和onenet_mqtt_pub分别是订阅和发布的例子,当然也可以自己将两个例子合在一起,在连接服务器之后先订阅相关消息,然后根据需要自己发布数据到服务器,接收到服务器的数据后进行相关的操作。
订阅
代码在onenet_mqtt_sub中,需要修改相关信息为自己服务器中的数据。

代码的流程基本和MQTTX连接的过程一样。

发布
发布的前段代码和订阅一致

后面就可以发布数据到服务器了

注意发布数据的间隔需要一定的延时,这跟服务器有关,参考各个服务器的要求。