MQTT完全搞定:拨开云雾见日出

目录

先来认识一些名词

本文用到的工具

熟悉各类工具

读懂MQTT报文结构

MQTT应用完整步骤



       本文除共群友浏览学习,也会上传到博客供大家参考。由于近期群里问的人太多,QQ号私信的人太多,无法一一回复,因此编写了这篇《MQTT完全搞定:拨开云雾见日出》,本文的目的完全搞定,哈哈,好像有点夸张了。

大家对MQTT可能并不陌生,它的数据可以贯穿从边缘传感设备到终端、网关、到上位机、远程终端设备或服务器全链路。它的数据经过处理可以完整的保存于各种关系型数据库系统,如MsSql、MySQL、Oracle,同时也常应用于时序数据库。那么,它应用于那些领域那些场景呢?它广泛应,用于工业领域,如M2M场景,像诸如车载设备监测如温度、振动、油耗,环境监测如温湿度,抄表监测如电力行业,逆变器监测及控制反馈,应用场景非常的多。

MQTT发布到5.0版本了,小Q仔细对比了各版本,然而发现差别非常的小,因此本文适合所有热爱学习的萌新们。


先来认识一些名词

客户端 Client:在MQTT的系统里,除broker外所有的程序或设备。

 

服务端 Server:就是上面说的broker了,broker是一个消息代理软件,(它是一个开源软件,大家可以从Github上下载,网址给大家贴上https://github.com/mqtt/mqtt.github.io/wiki/servers,本文使用的是Mosquitto,大家可以看到好多,还有MQTTnet、MqttWk、RabbitMQ,都可以去了解一下)

 

主题名 Topic Name:它决定有效的数据从哪儿来,到哪儿去,是报文可变报头的第一个字段,我举个例子吧:如dev/x/xxx/xx ,意思就是有效数据要发到dev/xx/xxx/xx这么一个层级结构里去,当然这是小Q自己编的(主题是自定义的,当然要符合主题名约定的规范)。

 

主题过滤器 Topic Filter:可以把它理解为主题的一部分,如上面小Q的举例dev/x/xxx/xx,其中dev、x、xxx、xx都是过滤器,这样说大家理解了吧,另外,还有一些通配符小Q后面会给大家说,这里先记住几个符号:”/”、”#”、”+”、”*”、”$”。

 

订阅 Subscription:订阅是客户端发起的动作,就是发送主题名和需要的服务质量到服务端,大家应该理解了,订阅主题=订阅主题名+服务质量。

 

会话 Session:就是客户端和服务端之间的交互吧

 

控制报文 MQTT Control Packet:这里小Q建议把控制报文理解为订阅主题的类型,而订阅主题的类型有发布、订阅、中断、连接、心跳、保活等等,所以,控制报文也有这么些类型,

 

大家可能还没完全弄明白,没关系,上面只是给大家留个印象,为了完成这项艰巨的的任务,小Q拼了老命给大家搜集各类工具,如果对你有帮助,请给小Q一个大大的赞,大家接着往下看


本文用到的工具

Mqtt fx客户端https://mqtt-fx.software.informer.com/download/

AT Commander https://dl.pconline.com.cn/download/539510-1.html

Ali物联开方平台https://helpcdn.aliyun.com/product/30520.html,阿里云计算有限公司,这个平台是按量后付费模式目前的计价方式是4元/100万条,用流量比较少,还是可以考虑的,非常适合用来学习理解整个流程的学生党和考虑经济人士,)

Neoway N720http://www.neoway.com/product/info/85 ,深圳市有方科技股份有限公司,国内第一款基于高通芯片平台开发的全网通4G工业模块,其中我们关注的是它完美的支持MQTT全系列版本板子小Q是通过某宝入手的,连接也给大家吧https://neoway.tmall.com/index.htm?spm=a1z10.3-b.w5001-21445528278.2.7d415a904JYZow&scene=taobao_shop。

Notepad++ ( https://notepad-plus-plus.org/)


熟悉各类工具

网络调试助手

MQTT完全搞定:拨开云雾见日出

 

Mqtt fx客户端,就是小Q前文所说的客户端 Client

MQTT基于TCP,我们需要设置协议类型为TCP client或TCP server、主机地址、端口编号,像编号1那样。

ASCII和HEX是两种数据显示方式。

详细参数转换及参数设置,主题设置订阅发布在后文找

 

阿里云物联开方平台

https://helpcdn.aliyun.com/product/30520.html注册一个账号,登陆,平台目前的计价方式是4元/100万条,用流量比较少,还是可以考虑的。如果流量过大费用还是很高的。

MQTT完全搞定:拨开云雾见日出

 

登陆后,首先创建一个产品

MQTT完全搞定:拨开云雾见日出

 

Neoway N720

MQTT完全搞定:拨开云雾见日出

 

Notepad++

这个非常常用,有兴趣的小伙伴可以去了解下,https://notepad-plus-plus.org/


读懂MQTT报文结构

 

控制报文格式

先看看总结:

MQTT报文结构 = 固定报头+可变报头+有效载荷

固定报头 = 控制报文类型标记+剩余长度

可变报头 = 报文标识符(MSB/LSB)

有效载荷 = 主题过滤器+ 服务质量等级

 

从上面小Q的归纳,可以看出,不论什么类型的报文,必须包含报文类型标记,而其它是可选的。

 

下面给大家举几个例子:

断开连接 : EO 00 ; 心跳:C0 00 ; 心跳回复:D0 00 ; 订阅回复: 90 03 00 0A 00 ,这几个例子中只包含报文类型标记,剩余为长度。比如断开连接 : EO 00,其中E0 是类型标记,00是长度标记

 

这里强调一下,上面说的是,不论什么类型的报文,必须包含报文类型标记,要注意一下,不同类型的报文,必须包含的内容不同。比如,断开连接 : EO 00,最短内容只需要包含类型标记;如订阅报文,最短内容除了包含类型标记,还包含可变报头、有效载荷。

再举个例子,订阅报文:82 0F 00 0A 00 0A 6D 76 7A 62 5F 74 6F 70 69 63 00,其中80 0F表示类型标记,00 0A 00 0A表示固定报头,6D 76 7A 62 5F 74 6F 70 69 63表示主题,00表示服务质量

 

控制报文分类

小Q总结如下:

连接报文(请求、确认)

订阅报文(请求、确认)

发布报文(发布、确认、收到、释放、完成)

取消订阅报文(请求、确认)

心跳报文(请求、响应)

断开连接报文(请求)

保留字(保留、不保留)

这只是一个完整的分类,实际中大家根据服务质量来判断,那些报文是存在的,而那些是不存在的,比如在Qos为0时,不存在发布确认报文、发布收到报文、发布释放报文、发布完成报文

 

控制报文举例

前面已经例举了订阅:80 0F 00 0A 6D 76 7A 62 5F 74 6F 70 69 63 31 32 33 34 35;断开连接 : EO 00 ; 心跳:C0 00 ; 心跳回复:D0 00 ; 订阅回复: 90 03 00 0A 00等例子

下面小Q再给大家来几个,方便理解:

建立连接:10 27 00 04 4D 51 54 54 04 C2 00 78 00 09 35 33 32 30 39 32 32 37 34 00 06 31 35 33 32 38 36 00 08 32 30 31 39 30 36 32 33,

其中10 27 类型,可变报头的协议名(00 04固定部分,4D 51 54 54 MQTT、04 C2协议级别部分),后面一大串字符04 C2 00 78 00 09 35 33 32 30 39 32 32 37 34 00 06 31 35 33 32 38 36 00 08 32 30 31 39 30 36 32 33,表示DeviceName,ProductKey,DeviceSecret,也就是设备号、产品号、鉴权号。


MQTT应用完整步骤

MQTT.Fx

阿里平台创建

MQTT完全搞定:拨开云雾见日出

 

在创建完成阿里云物联平台后,大家记得记录下如下三个字段:

"ProductKey": "a1GgE9jjXLJ",

"DeviceName": "Neoway",

"DeviceSecret": "hj9dew4z6oVVcssResRK2WWWMOY9uSNA"

MQTT完全搞定:拨开云雾见日出

 

然后,进入如下网址将字段信息转换为域名、端口、用户密匙信息,网址是http://mqtt.lovemcu.cn/

MQTT完全搞定:拨开云雾见日出MQTT完全搞定:拨开云雾见日出

然后,大家会得到域名、端口、客户端ID、用户密匙等信息,下载MQTT.fx工具,网址为https://mqtt-fx.software.informer.com/download/,进入后,新建立一条连接,如下图所示

MQTT完全搞定:拨开云雾见日出

建立连接后,大家可以按规范建立主题名,进行订阅,发布等操作。

MQTT完全搞定:拨开云雾见日出

 

到此为止,小Q觉得该是讲的差不多了,各位萌新们如果还有问题,欢迎大家联系提问。

N720 AT指令流程

首先N720模块上电,插入有效的SIM卡,开机,观察指示灯,如果POWER指示灯、RING指示灯、NET指示灯都点亮了,我们进入下一步,对模块进行初始化

MQTT完全搞定:拨开云雾见日出

Window系统下,按住win+r,打开运行对话框,输入devmgmt.msc命令,打开设备管理器,看看是否识别到N720相关的COM口,下面是小Q的截图 

MQTT完全搞定:拨开云雾见日出

在下面这个网址https://dl.pconline.com.cn/download/539510下载 AT Commander 工具,选择系统给N720分配的端口,小Q的截图如下

MQTT完全搞定:拨开云雾见日出

下面这一步是对N720初始化操作,用到标准AT指令集,如下图,其中,AT+CGAAT?是小Q误输入,实际指令集为AT+CGATT? , 这一步成功的标志是是否获取到IP地址。

MQTT完全搞定:拨开云雾见日出

N720模块初始化完成后,接下小Q带大家解锁基于AT指令集的MQTT使用流程

大家还记得前文提到的三个字段吗?现在需要用到了,三个字段的样子是这样的,可能和你们的不一样哈,是正确的就行。

"ProductKey": "a1GgE9jjXLJ",

"DeviceName": "Neoway",

"DeviceSecret": "hj9dew4z6oVVcssResRK2WWWMOY9uSNA"

然后根基上面三个字段,在文本编辑器中创建一条AT指令集,像下面这样:

AT+CLOUDHDAUTH = a1GgE9jjXLJ,Neoway,hj9dew4z6oVVcssResRK2WWWMOY9uSNA

然后打开你的 AT Commander 工具操作起来,像下面这样应答:

MQTT完全搞定:拨开云雾见日出

下面我们尝试用AT指令集订阅主题/a1GgE9jjXLJ/Neoway/user/EZ,具体请看下面小Q的演示,应答OK就表示订阅该主题成功了。

MQTT完全搞定:拨开云雾见日出

接下来,我们再从AT Commander终端 发布一条消息,指令集是AT+CLOUDPUB = /a1GgE9jjXLJ/Neoway/user/EZ,1,Hello Neoway,实现如下截图,应答ok,表示发布消息成功

MQTT完全搞定:拨开云雾见日出

然后取消订阅该主题,关闭MQTT连接

MQTT完全搞定:拨开云雾见日出

整个过程就是这样,今天小Q就给大家讲到这里,希望大家能够熟悉这些知识,如果有什么疑问,留言吧,我会私信你小Q的及时社交账号,我会及时给大家解决疑惑 @博乐。

更多的以后再给大家分享,当然不限于MQTT,大家可以关注下,以免走失哦。