什么是MQTT,什么情况下使用MQTT
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传递协议,设计用于在各种设备之间进行可靠的、实时的、双向的通信。
MQTT 是一种灵活、轻量级、可靠的通信协议,适用于各种需要可靠消息传递的物联网和传感器网络应用。它在节约网络带宽、降低能耗、实现快速响应等方面具有重要作用。
物联网终端相较于手机和电脑拥有不需要大数据交互,需要与服务器长时间连接并时刻待机的特点。因此,通信协议需要具有在连接时最大程度地减少数据收发,以保持在线的能力。MQTT协议正是为这种特殊环境而设计的。
目前哪些平台使用MQTT
目前市场上主流的服务器,95%以上的都是基于MQTT协议开发的。其中包括阿里云物联网平台、腾讯云物联网、亚马逊物联网,中移物联的ONENET。其中在上面衍生出来的产品,如阿里去的飞雁平台,腾讯连连等产品,本质就是在MQTT的方式上增加了配网交互以及对应APP与设备的绑定关系,或者是数据库存分析等功能,万变不离其中。
MQTT连接主要参数
各个参数的详细解读
指定要连接的 MQTT 服务器的主机名或 IP 地址。各平台对应的服务器主机名一般是以域名方式出现,并通过二级三级四级域名的衍生来指向你最近的服务器IP地址。
如阿里云物联网平台,你对应创建的ProductKey为a1gQZGKSSHz,则域名为:
a1gQZGKSSHz.iot-as-mqtt.cn-shanghai.aliyuncs.com
主域名:aliyuncs.com
二级域名:cn-shanghai,表示华东2上海的服务器
三级域名:iot-as-mqtt,表示物联网平台
四级域名:a1gQZGKSSHz,指向物联网平台创建的产品类别
单一应用中设备的服务器地址一定是唯一的。
指定 MQTT 服务器监听的端口号。由于MQTT服务器是基于TCP协议上开发的,所以默认情况下,MQTT 使用的是 TCP 端口1883。而 MQTT通过TLS加密传输时使用的是 TCP 端口8883。
使用SSL连接方式,可以使MQTT的数据传输更加的安全,但同时也增加了设备内存和存储的消耗。
客户端标识符(Client Identifier):用于识别连接到 MQTT 服务器的客户端。每个客户端在连接一个目标服务器里都必须具有唯一的标识符,以便服务器可以区分它们。
客户端标识符在同一个服务器中,如同公民的身份证一样,必须是唯一的。如果两台设备都使用相同的客户端标识符,则会造成之后上线的设备连接服务器后,服务器将主动断开前一台设备的连接。
某些 MQTT 服务器可能需要验证用户身份。如果需要身份验证,则需要提供有效的用户名和密码。如阿里云物联网平台,则是通过三元素的加密计算得出的用户名和密码。
用户名和密码对于设备来说一定是唯一的,如果一台设备带着用户名和密码连接一个没有加密的MQTT服务器,通常情况下是可以连接成功的。
清理会话标志(Clean Session Flag):当建立 MQTT 连接时,可以设置该标志来指示服务器如何处理之前的会话状态。如果设置了“清理会话”标志,服务器将删除之前保存的该客户端的订阅、QoS 消息等信息。
当未设置清除会话标志,设备连接上MQTT服务器时,服务器将会把之前订阅号上未发送成功的数据发送给设备,这也是可以实现用户离线接收到发送数据的方式。
遗嘱消息(Will Message):可以设置一个遗嘱消息,以便在客户端异常断开连接后,自动向服务器发送一条消息。遗嘱消息可以包含任何有效的 MQTT 消息,可以用于通知其他客户端或进行清理操作。
遗嘱消息由遗嘱主题和遗嘱消息内容两部分组成。如果其它的设备端定于此设备的遗嘱主题时,该设备掉线后,则MQTT服务器将会向其它订阅遗嘱主题的设备发送遗嘱消息内容。但是很可惜,目前很多物联网平台是不支持遗嘱消息功能的,如阿里云物联网平台,腾讯云物联网等。
指定客户端与服务器之间的心跳间隔时间(以秒为单位)。客户端会定期向服务器发送心跳包以保持连接的活跃状态。这里需要注意的是,则Keep Alive设置成0时,服务器将不再判断设备的心跳包。
Keep Alive的时间一般为30秒至7200秒之间,由设备端在连接服务器时将Keep Alive参数通知服务器。而设备应该在每次Keep Alive时间到来前,发送一个心跳包至服务器,以通知服务器设备连接的正常。当服务器在Keep Alive时间的1.5倍以上时间未收到设备心跳包时,则认为设备已经掉线了。此时服务器将会向设备设置的遗嘱消息主题发送遗嘱消息内容。
例如:
设备通知MQTT服务器KeepAlive的时间值为60秒,则设备必须在90秒内向服务器发送心跳包或者进行一次数据通信,否则服务器认为设备掉线。并关闭对应的MQTT TCP连接信息。
通过以上7个参数的正确设置,就可以将设备连接到MQTT的服务器。
MQTT服务器中设备间通信方式
在 MQTT 中,发布者(Publisher)和订阅者(Subscriber)通过使用主题(Topic)来进行消息的发布和订阅。
发布者是产生消息并将其发送到 MQTT 服务器的应用程序或设备。发布者将消息发布到一个或多个主题上。主题是消息的命名空间,用于标识消息的不同类型或分类。发布者可以选择性地选择一个或多个主题来发布消息。
订阅者是通过 MQTT 客户端订阅一个或多个主题的应用程序或设备。订阅者接收并处理订阅的主题上发布的消息。订阅者可以选择性地订阅一个或多个感兴趣的主题。
主题是 MQTT 中用于消息过滤和路由的重要概念。发布者在发布消息时将其关联到一个或多个主题上,订阅者可以通过订阅相应的主题来接收与之关联的消息。主题是通过由层级结构的多个标识符组成的字符串来表示,通常使用斜杠(/)进行分隔。例如,“home/living-room/temperature” 是一个示例主题。
我们以博客这种通俗易懂的方式来解读,则发送者就是博客编写内容的人,而订阅者就是阅读博客内容的人。当撰写者在csdn的物联网专栏下写了一条文件名为《一文读懂MQTT各参数定义》时,则发布者的发布主题就是:/www.csdn.net/物联网专栏/《一文读懂MQTT各参数定义》,消息内容则为文章内容。而订阅者只要订阅了主题:/www.csdn.net/物联网专栏/《一文读懂MQTT各参数定义》就能看到文章的内容。当然,订阅者也可以在www.csdn.net或者在物联网专栏中都可以找到文章,这就是主题中组的概念。
MQTT定义了三个服务质量等级,分别是0、1和2,其具体含义为:
当发布一个新的主题时,可以设置该主题的保留标志为true或false来指示是否需要将该主题保留。如果保留标志为true,则该主题的最新消息将会一直被保留下来,直到新的消息发布到该主题上。
通过指定这些参数,MQTT消息发送者可以控制消息发布的范围和可靠性,并确保消息的正确传递和可订阅性。