MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,该协议构建于 TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
本文旨在帮助使用LierdaNT35模组进行开发的用户,让其能快速使用模组本身的各种硬件资源,文章概述了MQTT的特性、以及使用LierdaNT35模组连接MQTT服务器和阿里云平台的具体流程。
1.MQTT协议的通信模型
MQTT的通信是通过发布/订阅的方式来实现的,订阅和发布又是基于主题(Topic)的。发布方和订阅方通过这种方式来进行解耦,它们没有直接地连接,它们需要一个中间方。在MQTT里面我们称之为Broker,用来进行消息的存储和转发。一次典型的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,若使用该服务器,则端口号不能做修改,否则会连接失败。
在Subscribe设置中订阅主题,订阅的主题设置为/lierda/NT35_topic。
接下来是NT35模组对该主题进行订阅,订阅完成后即可测试通信效果。
1、定义并激活PDP上下文:AT+CGDCONT=1,"IP","CMNET";AT+CGACT=1,1。
2、查看获取的IP地址:AT+CGPADDR。
3、连接MQTT服务器:AT+MQTTCONN="test.mosquitto.org",1883,"lierda1234",90,0。
AT+MQTTCONN=
4、订阅主题:AT+MQTTSUBUNSUB="/lierda/NT35_topic",1,1。
AT+MQTTSUBUNSUB=
1为订阅,0为取消订阅。
5、发布消息:AT+MQTTPUB="/lierda/NT35_topic","hellolierda",1,0,0。
AT+MQTTPUB=
6、取消订阅:AT+MQTTSUBUNSUB="/lierda/NT35_topic",0。
7、断开连接:AT+MQTTDISCONN。
3.MQTT连接阿里云IoT平台
1、登录阿里云物联网平台 http://iot.aliyun.com,完成注册和实名认证后,平台会自动生成一个公共实例,本次测试于该公共实例中进行。
2、点击设备管理--产品--创建产品,进入新建产品界面。
3、在新建产品界面中,节点类型选择为直连设备,连网方式选择为蜂窝(2G/3G/4G/5G),数据格式选择为透传/自定义,数据校验级别选择为弱校验,认证方式选择为设备密钥,再点击确认按键,完成产品的创建。
4、点击设备管理--设备--添加设备。
5、在"添加设备"界面中,选择刚刚创建的产品,并输入DeviceName,点击确认。
6、设备添加完成后,点击查看进入设备详情界面。
7、在设备详情界面中,点击DeviceSecret后面的查看,即可查看ProductKey,DeviceName和DeviceSecret。
8、点击设备管理--产品--查看,进入产品详情界面。
9、在产品详情界面中,点击Topic类列表--自定义Topic--定义Topic类,开始自定义Topic。
10、为方便测试,在自定义Topic时,设备操作权限选择为"发布和订阅",Topic类名可自定义。
下图为创建好的自定义Topic。
11、NT35模组上电,自动附着PS,手动定义和激活PDP上下文,需要发送并执行的指令为AT+CGDCONT=1,”IP”,”CMNET”;AT+CGACT=1,1。
激活完成后通过指令"AT+CGPADDR",可查询获取到的IP地址。
12、非动态鉴权:AT+ALICAUTH=
具体指令如下AT+ALICAUTH=0,"gt5xRLG8Qg1","NT35_TEST","7b47f6ecb55a63ef2b524243c817ba78"。
13、创建连接:AT+ALICCONN=60,1。
14、订阅主题Topic:AT+ALICSUB=
具体指令为AT+ALICSUB="/gt5xRLG8Qg1/NT35_TEST/user/123",1。
15、发布消息:AT+ALICPUB=
具体指令为AT+ALICPUB="/gt5xRLG8Qg1/NT35_TEST/user/123",1,"hello"。
16、模组接收消息
17、取消订阅:AT+ALICUNSUB="/gt5xRLG8Qg1/NT35_TEST/user/123"。
18、断开连接:AT+ALICDISCONN。