目录
1 MQTT协议介绍
1.1 基本概念
MQTT是一种基于发布/订阅模式的消息传递协议,它工作在TCP/IP协议之上。该协议旨在简化数据传输,使设备之间的通信尽可能高效、稳定且可靠,特别适用于低带宽、高延迟或不可靠的网络环境。
1.2 核心组件
(1)发布者(Publisher):负责3将消息发送到MQTT Broker(代理服务器)。发布者只需要指定消息的主题,无需关心有多少订阅者存在或它们的身份。
(2)订阅者(Subscriber):通过MQTT Broker订阅一个或多个主题,订阅者可以选择接收某类特定的消息,符合该主题的消息会由Broker分发给所有订阅者。
(3)Broker(代理服务器):MQTT系统中的核心组件,负责处理客户端之间的消息传递。所有的发布者和订阅者通过Broker实现解耦。Broker接收发布者发送的消息,并将其分发给订阅该主题的客户端。Broker还负责管理客户端的连接、会话状态、消息存储及分发等任务。
1.3 主要特性
(1)轻量级:MQTT协议设计得非常轻量级,占用极少的代码和带宽,使其成为大规模物联网应用的理想选择。
(2)低带宽消耗:由于其轻量级特性,MQTT在物联网设备间的消息传输中具有极低的带宽消耗,这对于资源受限的设备尤为重要。
(3)高效利用资源:MQTT通过采用发布-订阅模式,实现了发送者和接收者的解耦,从而有效地减少了网络流量和资源使用,提高了系统的整体效率。
(4)服务质量(QoS):MQTT协议支持不同级别的服务质量,以确保消息的可靠性和一致性。QoS 0、1和2分别代表不同的可靠性级别,允许根据需求选择合适的服务质量来优化消息传递过程。
(5)安全性:MQTT协议还考虑到了安全性问题,包括认证、加密和数据隐私等方面,以保护通信过程中的数据安全。具体来说,MQTT协议支持使用SSL/TLS对网络数据进行加密,确保消息在传输过程中的机密性和完整性。
1.4 应用场景
MQTT协议因其轻量级、低带宽消耗和高效利用资源的特点,被广泛应用于物联网领域,如智能家居、工业自动化、远程监控、车联网、远程医疗、环境监测等场景。它使得设备之间能够实时、可靠地交换信息,即使在网络条件不佳的情况下也能保证通信的稳定性。
1.5 工作流程
客户端连接到Broker:设备或应用程序作为MQTT客户端,首先与Broker建立连接,使用特定的主题(Topic)进行通信。
发布消息:发布者(Publisher)向Broker发布消息,并指定消息的主题(Topic)。Broker并不处理消息内容,而是根据主题将消息传递给相应的订阅者。
订阅消息:订阅者(Subscriber)通过Broker订阅一个或多个主题,当与主题匹配的消息发布时,Broker会将消息发送给所有订阅该主题的客户端。
消息传递:消息从发布者通过Broker传递给所有订阅者,传递过程中会根据所设定的服务质量(QoS)等级确定消息的可靠性和传输方式。
断开连接:客户端可以随时向Broker发送断开连接请求,结束通信。连接断开后,客户端可以选择通过持久会话机制在下次连接时继续接收离线期间的消息。
2 FS800DTU介绍
FS800DTU核心板是基于飞思创4G Cat.1模组设计的,上面集成了DC-DC、SIM卡、天线和串口电平转换电路,支持5-16V供电输入,无需额外设计,接上天线、SIM卡和串口就可以使用。FS800DTU支持4路Socket,支持TCP/UDP/HTTP/MQTT等通信协议,适配了阿里云、OneNET等物联网平台。
对于使用FS800DTU核心板的用户来说,其操作简便性是一大亮点。即便您仅对MQTT工作原理有基础的了解,也无需深入钻研MQTT协议的复杂细节。FS800DTU已经为您预先配置好了所需的通信环境,您只需简单设置几个关键参数,即可实现数据的快速传输。无论是初学者还是有一定经验的用户,都能在短时间内掌握其使用方法,并迅速将其应用到实际项目中,真正做到了“快速上手,高效应用”。
3 FS800DTU的MQTT功能介绍
下图为FS800DTU的上位机配置工具,通过它我们可以对DTU进行快速配置。打开配置工具,点击MQTT就可以看到DTU相关MQTT的所有参数。
3.1 服务器IP地址/域名
可以填写连接的目标服务器的域名或IP,例如:域名“broker.emqx.io”或者IP ”44.232.241.40“。
3.2 端口号
(1)标准MQTT端口(1883):此端口用于未加密的MQTT连接。它是最常用的MQTT端口,也是大多数MQTT代理的默认端口。
(2)MQTT通过SSL/TLS的端口(8883):通过SSL/TLS的MQTT默认端口是8883。当MQTT客户端和服务器之间的通信需要加密以提高安全性时,将使用此端口。
3.3 SSL加密
在MQTT协议的基础上,通过引入传输层安全(TLS)或安全套接层(SSL)加密技术,进一步增强了数据传输的安全性。这种加密通信机制能够有效地防止数据在传输过程中被非法窃取或恶意篡改,从而确保物联网设备的通信安全得到全面保护。当连接的MQTT服务器已经启用了SSL加密功能时,客户端可以相应地启用此加密通信方式。
3.4 Clientid
MQTT客户端ID是连接到MQTT代理(Broker)的每个MQTT客户端的唯一标识符。这个ID用于区分不同的客户端,并允许MQTT代理在客户端断开连接后重新连接时识别它们。如果FS800DTU在连接后立即断开,可能的原因之一是ClientID与其他MQTT客户端发生了冲突。
3.5 用户名和密码
(1)用户名:通常作为客户端的身份标识,可以是任意字符串。它用于在MQTT连接过程中,向服务端表明客户端的身份。
(2)密码:用于验证该身份的真实性,确保只有授权的客户端能够连接到MQTT服务器。密码与用户名相对应,共同构成身份验证的凭据。
(3)作用:MQTT用户名和密码的主要作用是增强MQTT通信的安全性。通过要求客户端在连接时提供正确的用户名和密码,MQTT服务器可以验证客户端的身份,并根据不同的权限级别控制客户端的访问权限。这有助于防止未经授权的客户端连接到服务器,从而保护敏感信息和通信的完整性。
3.6 KeepAlive
MQTT的KeepAlive参数允许设置客户端两次发送协议包之间的最大静默时间。若客户端在设定的时间内未发送数据,则应主动发送PINGREQ消息给Broker。Broker收到后,会回复PINGRESP消息,以确认连接仍然活跃。若Broker在1.5倍于KeepAlive设置的时间内未收到客户端的任何消息,则会断开与该客户端的连接。keep-alive机制确保了连接的活跃性,并能够及时发现和解决连接中断的问题。
3.7 会话标志位
会话标志位有“清除会话“与”保留会话“两个选项。
清除会话:表示客户端希望服务端丢弃任何已存在的会话,并开始一个新的会话。这通常用于客户端希望在每次连接时都获得一个全新的会话状态,以避免受到之前会话的影响。
保留会话:表示客户端希望服务端能够基于已存在的会话(如果存在的话)来恢复与客户端的通信。为了实现这一点,客户端需要使用与之前相同的ClientID再次登录。如果ClientID与之前的不一致,服务端则会认为这是一个新的客户端,并为其创建一个新的会话。
3.8 订阅和发布主题
3.8.1 主题的定义
MQTT主题是一个UTF-8编码的字符串,它可以包含一个或多个层次,每个层次之间使用正斜杠”/“进行分隔。
示例:
顶级主题:home这个顶级主题代表整个家居系统,是所有子主题的根。
二级主题:room这个二级主题代表家居中的各个房间,用于区分不同房间的温度数据。
例如,home/livingroom 代表客厅的温度数据,home/bedroom 代表卧室的温度数据。
三级主题:temperature这个三级主题代表温度数据,是具体要监控的数据类型。
例如,home/livingroom/temperature 代表客厅的温度数据,home/bedroom/temperature 代表卧室的温度数据。
3.8.2 主题通配符
3.8.2.1 通配符的种类
MQTT支持两种类型的主题通配符:
(1)单层通配符“+”:表示匹配一个层级的任意字符。
例如,订阅主题“home/+/temperature”可以匹配“home/bedroom/temperature”和“home/livingroom/temperature”等。
(2)多层通配符“#”:表示匹配多个层级的任意字符。
例如,订阅主题“home/bedroom/#”可以匹配“home/bedroom/temperature”、“home/bedroom/humidity”,home/bedroom/light/status等。
3.8.2.2 通配符的使用
(1)订阅多个主题:使用单层通配符可以订阅具有相同层级结构的多个主题。使用多层通配符可以订阅某个主题及其所有子主题。
(2)过滤消息:订阅者通过主题过滤器(包含通配符的主题)来指定感兴趣的主题。当代理收到发布到某个主题的消息时,它会根据订阅者的主题过滤器来决定是否将消息分发给该订阅者。
(3)注意事项:通配符只能用于订阅主题,不能用于发布主题。单层通配符不能单独使用(例如,“+/temperature”是无效的),必须放在主题层级之间。多层通配符必须放在主题末尾,且只能有一个。
3.8.2.3 单层通配符示例
3.8.2.4 多层通配符示例
3.8.3 主题的订阅
(1)订阅者(Subscriber)向MQTT代理(Broker)发送SUBSCRIBE数据包,其中包含了要订阅的主题列表以及每个主题的QoS(服务质量)级别。
(2)代理收到订阅请求后,会检查主题列表,并为每个有效的主题建立订阅关系。
(3)代理会向订阅者发送SUBACK数据包作为应答,确认订阅结果。
3.8.4 主题的发布
(1)发布者(Publisher)构建包含消息内容和主题名的PUBLISH数据包。
(2)发布者将数据包发送到MQTT代理。
(3)代理根据主题名将消息分发给所有订阅了该主题的订阅者。
3.9 QOS
MQTT协议设定了三种QoS等级,以满足不同应用场景的需求。以下是关于MQTT QoS的简单介绍:
(1)QoS 0:至多一次不保证消息传递,发送方尽力发送,不等待确认。适用于对可靠性要求不高、网络状况良好的场景。例如,传感器定期发送环境数据,即使偶尔丢失一些数据也不会对系统造成重大影响。
(2)QoS 1:至少一次确保消息至少被接收一次,可能产生重复消息。发送方等待接收方的确认(PUBACK),未收到则重发。适用于可以接受消息重复但不能丢失的应用。例如,智能家居设备的状态更新,如灯光开关状态、温度设置等。
(3)QoS 2:确保一次确保消息被接收且仅接收一次,最高级别的服务质量。通过多次握手确认(PUBLISH、PUBREC、PUBREL、PUBCOMP)确保准确传递。适用于对消息准确性和顺序性要求很高的场景。例如,金融交易系统中的交易指令,需要确保每条指令都被准确且仅执行一次。
3.10 发布保留标志位
保留标志位(Retained Flag)是MQTT协议中的一个重要特性,它允许消息被持久化存储在MQTT服务器上,以便新的订阅者能够立即获取到这些消息。
(1)作用:当发布者发布一条消息时,如果设置了保留标志位(Retained Flag)为true,则MQTT服务器(Broker)会为该主题(Topic)存储这条消息。这样,即使新的订阅者在消息发布后才订阅该主题,它们也能够接收到这条保留消息。
(2)存储方式:MQTT服务器只会为每个主题存储最新的一条保留消息。也就是说,如果服务器上已经为某个主题存储了一条保留消息,当发布者再次向该主题发布一条新的保留消息时,原来的消息会被覆盖。
(3)判断方法:客户端在订阅主题时,如果服务器上存在该主题的保留消息,则该消息会立即被发送给客户端。客户端可以通过消息中的保留标志位来判断接收到的消息是否为保留消息。
3.11 遗嘱消息
遗嘱消息允许客户端在建立连接时指定一条消息,这条消息将在客户端非正常断开连接(如客户端崩溃、网络中断等)时被发送到服务器,并由服务器广播给所有订阅了该遗嘱消息主题的客户端。遗嘱消息的主要目的是通知其他客户端该客户端已经“离世”或不再可用。
3.12 多主题模式
开启多主题使能后,MQTT 最多支持订阅 3 个主题,发布主题数量无限制。开启后需要按照主题:信息的格式发送,例如:
home/bedroom/temperature:
{
"bedroom": {
"temperature": {
"value": 33
}
}
}
home/bedroom/light/status:
{
"bedroom": {
"light": {
"status": "ON"
}
}
}
4.总结
本篇文章讲述了MQTT协议的基本概念、核心组件以及应用场景等内容,同时介绍了FS800DTU的MQTT功能,希望对您有所帮助。如果您在阅读过程中遇到任何问题或疑惑,欢迎在评论区积极留言,我会时刻关注大家的反馈,并尽快给予回复。