MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,该协议构建于 TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

本文旨在帮助使用LierdaNT35模组进行开发的用户,让其能快速使用模组本身的各种硬件资源,文章概述了MQTT的特性、以及使用LierdaNT35模组连接MQTT服务器和阿里云平台的具体流程。

1.MQTT协议的通信模型

MQTT的通信是通过发布/订阅的方式来实现的,订阅发布又是基于主题(Topic)的。发布方和订阅方通过这种方式来进行解耦,它们没有直接地连接,它们需要一个中间方。在MQTT里面我们称之为Broker,用来进行消息的存储和转发。一次典型的MQTT消息通信流程如下所示。

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
MQTT消息通信流程图

发布方(Publisher)连接到Broker;订阅方(Subscriber)连接到Broker,并订阅主题Topic1;发布方(Publisher)发送给Broker一条消息,主题为Topic1;Broker收到了发布方的消息,发现订阅方(Subscriber)订阅了Topic1,然后将消息转发给订阅方(Subscriber);订阅方从Broker接收该消息。其中Publisher和Subscriber是相对于Topic来说的身份,如果一个Client向某个Topic发布消息,那么这个Client就是Publisher;如果一个Client订阅了某个Topic,那么它就是Subscriber。

2.MQTT协议通信测试

本次测试通过MQTT.fx工具测试数据是否收发成功。进入工具的设置界面,Client ID需要修改,不能使用默认的,不能使用重复的,否则会导致MQTT连接失败。服务器的地址和端口需要设置正确,我们设置服务器地址为test.mosquitto.org,这是一个公用MQTT测试服务器,端口为1883,若使用该服务器,则端口号不能做修改,否则会连接失败。

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
MQTT.fx设置按钮位置
三、MQTT协议通信(含阿里云IoT平台MQTT连接)
MQTT.fx设置修改

在Subscribe设置中订阅主题,订阅的主题设置为/lierda/NT35_topic

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
设置订阅的主题并进行订阅

接下来是NT35模组对该主题进行订阅,订阅完成后即可测试通信效果。

1、定义并激活PDP上下文:AT+CGDCONT=1,”IP”,”CMNET”AT+CGACT=1,1

2、查看获取的IP地址:AT+CGPADDR

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
IP地址获取成功

3、连接MQTT服务器:AT+MQTTCONN=”test.mosquitto.org”,1883,”lierda1234″,90,0

AT+MQTTCONN=,,,,,[username],[password]

为MQTT服务器的host name,在这里是MQTT.fx设置中的MQTT Broker Address。

为MQTT服务器的端口号,在这里是MQTT.fx设置中的Broker Port。

为客户id,不可重复。

为MQTT连接存在时长,范围为30-1800,时间单位为秒。

输入为0。

4、订阅主题:AT+MQTTSUBUNSUB=”/lierda/NT35_topic”,1,1

AT+MQTTSUBUNSUB=,,

为准备订阅的主题,在这里是MQTT.fx中订阅的主题。

1为订阅,0为取消订阅。

为服务质量,输入可为0或者1或者2;当取消订阅,即为0时,该参数不用填写。

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
模组连接MQTT服务器并订阅主题

5、发布消息:AT+MQTTPUB=”/lierda/NT35_topic”,”hellolierda”,1,0,0

AT+MQTTPUB=,,,,

为发布消息的MQTT目标主题,在这里是之前订阅的主题。

为发布的消息的内容。消息内容的长度,主题的长度与其他包数据的长度(不超过9字节)之和最大为256字节。

输入值为0或者1或者2。

输入值为0或者1。

输入值为0或者1。

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
模组发布消息
三、MQTT协议通信(含阿里云IoT平台MQTT连接)
MQTT.fx接收到模组发布的消息
三、MQTT协议通信(含阿里云IoT平台MQTT连接)
MQTT.fx发布消息
三、MQTT协议通信(含阿里云IoT平台MQTT连接)
模组接收到MQTT.fx发布的消息
三、MQTT协议通信(含阿里云IoT平台MQTT连接)

6、取消订阅:AT+MQTTSUBUNSUB=”/lierda/NT35_topic”,0

7、断开连接:AT+MQTTDISCONN

3.MQTT连接阿里云IoT平台

1、登录阿里云物联网平台 http://iot.aliyun.com,完成注册和实名认证后,平台会自动生成一个公共实例,本次测试于该公共实例中进行。

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
阿里云物联网平台自动生成的公共实例

2、点击设备管理–产品–创建产品,进入新建产品界面。

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
设备管理–产品–创建产品

3、在新建产品界面中,节点类型选择为直连设备,连网方式选择为蜂窝(2G/3G/4G/5G),数据格式选择为透传/自定义,数据校验级别选择为弱校验,认证方式选择为设备密钥,再点击确认按键,完成产品的创建。

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
创建产品

4、点击设备管理–设备–添加设备。

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
设备管理–设备–添加设备

5、在”添加设备”界面中,选择刚刚创建的产品,并输入DeviceName,点击确认。

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
添加设备具体流程

6、设备添加完成后,点击查看进入设备详情界面。

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
“查看”按钮位置

7、在设备详情界面中,点击DeviceSecret后面的查看,即可查看ProductKey,DeviceName和DeviceSecret。

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
DeviceSecret”查看”按钮位置
三、MQTT协议通信(含阿里云IoT平台MQTT连接)
ProductKey,DeviceName和DeviceSecret信息

8、点击设备管理–产品–查看,进入产品详情界面。

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
设备管理–产品–查看

9、在产品详情界面中,点击Topic类列表–自定义Topic–定义Topic类,开始自定义Topic。

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
Topic类列表–自定义Topic–定义Topic类

10、为方便测试,在自定义Topic时,设备操作权限选择为”发布和订阅”,Topic类名可自定义。

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
自定义Topic流程

下图为创建好的自定义Topic。

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
自定义Topic创建完成

11、NT35模组上电,自动附着PS,手动定义和激活PDP上下文,需要发送并执行的指令为AT+CGDCONT=1,”IP”,”CMNET”AT+CGACT=1,1

激活完成后通过指令”AT+CGPADDR“,可查询获取到的IP地址。

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
入网成功

12、非动态鉴权:AT+ALICAUTH=,,,

设置为0时为非动态鉴权,设置为1时为动态鉴权。

,和参数见步骤7中的第二张图,一一填入。

具体指令如下AT+ALICAUTH=0,”gt5xRLG8Qg1″,”NT35_TEST”,”7b47f6ecb55a63ef2b524243c817ba78″

13、创建连接:AT+ALICCONN=60,1

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
鉴权并建立连接成功

14、订阅主题Topic:AT+ALICSUB=,

为步骤10中自定义的Topic,/gt5xRLG8Qg1/${deviceName}/user/123,其中${deviceName}部分替换为当前在线设备的DeviceName,在本次的测试中即为NT35_TEST。

具体指令为AT+ALICSUB=”/gt5xRLG8Qg1/NT35_TEST/user/123″,1

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
订阅Topic成功
三、MQTT协议通信(含阿里云IoT平台MQTT连接)
订阅Topic成功

15、发布消息:AT+ALICPUB=,,[,][,]

为已订阅的主题,在本次测试中为/gt5xRLG8Qg1/NT35_TEST/user/123。

为服务质量,可设置为0或者1或者2。

为发布的消息的内容。

具体指令为AT+ALICPUB=”/gt5xRLG8Qg1/NT35_TEST/user/123″,1,”hello”

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
消息发布成功
三、MQTT协议通信(含阿里云IoT平台MQTT连接)
平台成功接收到设备发布的消息

16、模组接收消息

三、MQTT协议通信(含阿里云IoT平台MQTT连接)
平台下发消息成功
三、MQTT协议通信(含阿里云IoT平台MQTT连接)
模组成功接收到来自平台下发的消息

17、取消订阅:AT+ALICUNSUB=”/gt5xRLG8Qg1/NT35_TEST/user/123″

18、断开连接:AT+ALICDISCONN