摘要:MQTT 怎么工作,得知道,发布订阅模式是核心,发消息的人不管谁收,只管往“主题”里扔。主题,就是个标签,订阅的人认准标签来拿。还有一个东西,QoS,服务质量,很重要。QoS 0,最快,但是靠不住,消息可能丢。QoS 1,至少一次,保证送到,但是可能重复。Qo
MQTT,物联网的秘密通道
MQTT,很重要,搞物联网绕不开它。就像做网站离不开 HTTP,他们差不多,都是基础工具。MQTT,让设备们说话,互相交流,很重要。
MQTT 怎么工作,得知道,发布订阅模式是核心,发消息的人不管谁收,只管往“主题”里扔。主题,就是个标签,订阅的人认准标签来拿。还有一个东西,QoS,服务质量,很重要。QoS 0,最快,但是靠不住,消息可能丢。QoS 1,至少一次,保证送到,但是可能重复。QoS 2,最安全,只送一次,肯定不重复,但是慢。选哪个,看情况,重要的,选2,不重要的,选0。大家都在想,这到底应该怎么选啊。
来个例子,用亿佰特 DTU 设备,还有 TCP 服务器,自己搭一个也行。DTU,把它设置成 MQTT 模式,很重要,不然没法玩。还要设置三元组,ClientID,Username,Password,一个都不能少。还要告诉 DTU,服务器在哪里,IP 地址和端口,写清楚。最后,设置发布和订阅的主题,很重要,不然发给谁,谁来收。DTU 开始发送,服务器开始接收,收到的是什么,要分析。连接报文,0x10 开头,告诉服务器,我要连上来。服务器回复,连接确认报文,0x20 开头,说,好的,允许你连接。订阅报文,0x82 开头,告诉服务器,我要订阅哪个主题。服务器回复,订阅确认报文,0x90 开头,说,好的,收到,开始给你推消息。发布报文,0x30 开头,发送消息,内容都在里面。
报文长什么样,要知道,固定头部,最前面,第一个字节,很重要,包含报文类型和标志位,类型,连接,发布,订阅,等等,标志位,控制消息的行为,不同的标志位,代表不同的意思。剩余长度,第二个字节,告诉我们,后面还有多长,用了 VLQ 编码,最多 4 个字节,表示长度,有点复杂。有效载荷,是正文,MQTT 三元组,主题,消息内容,都在这里。ClientID,在连接报文里,告诉服务器我是谁,发布主题,在发布报文里,告诉服务器,我发给谁。很多人看完这个故事,都会去想,这个报文结构到底有什么用。
MQTT 有什么优点,很重要,低功耗,省流量,物联网设备,很多都是电池供电,省电很重要,网络也可能不好,省流量也很重要。例子,智能家居,控制灯泡,控制空调,车辆网,定位车辆,监控车辆状态,很多地方都能用。MQTT 对设备接入,运维很重要,管理起来方便多了,所有人都觉得它以后不得了。
仔细说,固定头部,第一个字节,最高 4 位,报文类型,CONNECT,PUBLISH,SUBSCRIBE,等等,低 4 位,标志位,DUP,QoS,RETAIN,等等。DUP,表示消息重发,QoS,服务质量,0,1,2,RETAIN,表示服务器保存最后一条消息,新的订阅者可以立即收到。剩余长度,VLQ 编码,每个字节,最高位是标志位,1 表示后面还有字节,0 表示结束。有效载荷,根据报文类型,内容不一样,连接报文,包含 MQTT 三元组,用户名密码,发布报文,包含主题,消息内容。大家都在想,这个编码方式是不是很巧妙。
再说说,QoS 0,fire and forget,发出去就不管了,速度最快,但是不可靠,消息可能丢失,适合对实时性要求高,对可靠性要求不高的场景,比如传感器数据采集。QoS 1,at least once,消息至少发送一次,保证消息到达,但是可能重复,适合对可靠性要求较高,对重复不敏感的场景,比如控制指令。QoS 2,exactly once,消息只发送一次,保证消息到达,且不重复,适合对可靠性和重复性要求都很高的场景,比如金融交易。可是在那种环境下,谁能受得了。
配置 DTU 设备,很重要,要仔细,设置为 MQTT 模式,选择合适的串口参数,波特率,数据位,停止位,校验位,要和服务器一致,设置 MQTT 三元组,ClientID,Username,Password,要和服务器匹配,设置 TCP 服务器的 IP 地址和端口,要确保 DTU 可以连接到服务器,设置发布和订阅的主题,要根据实际需求进行设置,她小时候也确实乖,听话,老师们都喜欢,家里人也全力支持。
服务器端交互数据分析,用 Wireshark 抓包,或者用 TCP 调试工具,可以看到 DTU 发送的数据,连接报文 (CONNECT),0x10 开头,包含 ClientID,Username,Password,告诉服务器,我要连接,我的身份是这些,连接确认报文 (CONNACK),0x20 开头,包含连接状态码,告诉 DTU,连接成功还是失败,订阅报文 (SUBSCRIBE),0x82 开头,包含订阅的主题,告诉服务器,我要订阅哪些主题,订阅确认报文 (SUBACK),0x90 开头,包含订阅状态码,告诉 DTU,订阅成功还是失败,发布报文 (PUBLISH),0x30 开头,包含主题,消息内容,告诉服务器,我发布了哪些消息。这个过程,很像两个人对话,一来一回。
低功耗和低带宽,是 MQTT 的重要优势,MQTT 协议很简单,头部很小,报文很短,减少了网络传输的数据量,降低了设备的功耗,MQTT 支持遗嘱消息,当设备异常断线时,服务器可以发送遗嘱消息给其他订阅者,通知设备离线的情况,MQTT 支持持久会话,当设备重新连接时,可以恢复之前的会话状态,继续接收消息,大家都觉得,这确实很方便。
智能家居,用 MQTT 控制灯泡,开关,亮度,颜色,用 MQTT 控制空调,开关,温度,模式,用 MQTT 控制窗帘,开合,角度,用 MQTT 监控传感器数据,温度,湿度,光照,用 MQTT 管理智能设备,接入,配置,升级。车辆网,用 MQTT 定位车辆,经纬度,速度,方向,用 MQTT 监控车辆状态,发动机,电池,轮胎,用 MQTT 控制车辆行为,启动,停止,加速,用 MQTT 管理车辆设备,接入,配置,升级,所有人都觉得,未来可期。
MQTT,让物联网设备更智能,更互联,让我们的生活更便捷,更舒适,MQTT,是物联网的基石,是未来的方向,MQTT,值得我们深入学习,广泛应用,很多人看完这个故事,都会去想,MQTT 到底能改变什么。
她的故事很长,她知道,未来的路还很长,需要了解的知识,还有很多,MQTT的学习,也是一条漫漫长路。
来源:电子小课堂一点号
