MQTT通讯协议详解【通俗易懂】

本文详细介绍了MQTT协议,包括其工作原理、特点(如轻量级、发布/订阅模式、可靠性与安全性)、服务质量QoS级别以及报文结构,展示了MQTT在物联网中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MQTT协议

MQTT模型

MQTT特点

MQTT服务质量

MQTT报文

MQTT消息类型表

参考文献


MQTT协议

简单来说:MQTT是一个消息传输协议,不同的设备可以通过这个协议进行消息的稳定传输。

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议上。

MQTT作为一种轻量级、高效的通信协议,在物联网和各种低带宽不稳定网络环境下扮演着重要的角色。它为设备之间的通信提供了简单、可靠的解决方案,用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务

MQTT模型

MQTT的运作模型中,有三种角色:发布者、服务器和订阅者,其中发布者和订阅者可以身份互换。

简单来说就是一个消息队列,但是MQTT的特点是某些情况并不会存储消息,例如:发布者A发布一个消息,如果没有订阅者,那么这个消息就丢失了。

在实际应用中,担任服务器的角色可以是一个小型的计算机(例如树莓派)或者是一个大型的Internet服务器都行。

MQTT特点

轻量级

MQTT协议设计简单轻巧,数据包头部较小,使其在低带宽、高延迟的网络环境中运行效率高,可以对比HTTP协议,HTTP协议的数据报头较大,就算是不携带任何的数据,都有一定字节的大小,但是MQTT的报头只有一个字节。

发布-订阅模式

MQTT采用发布者(Publisher)和订阅者(Subscriber)模式,发布者负责将消息发布到特定的主题(Topic),而订阅者可以选择订阅感兴趣的主题,接收与之相关的消息。这种模式使得设备之间可以异步通信,降低了耦合性,适用于多个设备之间的实时通信。发布者发布消息后,不需要等待订阅者的响应,从而提高了系统的响应性能。

可靠性

MQTT支持消息的持久性传输,确保消息的可靠性,这在物联网应用中非常重要,MQTT可以通过控制可靠性级别来确保消息传递的可靠性。

安全性

MQTT支持使用TLS/SSL进行加密通信,确保数据传输的安全性。此外,MQTT还支持用户名和密码进行认证,保护客户端和服务器之间的通信安全。

MQTT服务质量

MQTT有一个服务质量级别的概念,QoS(Quality of Service levels),这个概念能保证消息更可靠的传输,简单来说就是增加了消息确认机制。

  1. QoS 0(最多一次,At most once):

    这是最低的服务质量级别。在这种级别下,消息会被尽最大努力发送,但不会进行确认。发布者一次发布消息后,就不会知道消息是否已经到达订阅者,也不会知道是否有订阅者接收到消息。如果消息在传输过程中丢失或未能到达订阅者,发布者将不会得到任何通知,也不会有重发的机制。因此,这种级别适合对消息传递可靠性要求不高的场景,如传感器数据采集等。

  2. QoS 1(至少一次,At least once):

    在QoS 1级别下,消息的确保传递,发布者会收到一个确认(PUBACK),以表示消息已经到达代理服务器。如果代理服务器未能将消息传递给订阅者,它会重试直到成功传递,并且确保发布者收到确认。这样可以确保消息至少传递一次,但可能会导致重复传递,因为发布者可能会收到多个确认。QoS 1适用于一些要求消息传递至少一次的场景,但可以容忍一些重复传递的应用。

  3. QoS 2(恰好一次,Exactly once):

    QoS 2提供了最高的消息传递质量。在这种级别下,发布者会收到两个确认(PUBREC和PUBCOMP)。PUBREC表示消息已经到达代理服务器,PUBCOMP表示消息已经成功传递给订阅者。在这个级别下,确保消息只传递一次,并且没有重复传递。虽然QoS 2提供了最高的可靠性,但它也是最耗费资源的级别,因为需要多次的确认和处理。因此,QoS 2适用于对消息传递严格要求恰好一次的场景,如金融交易等。

MQTT报文

MQTT的报文分为三个部分,分别是固定报头、可变报头、有效负载(消息体),对应的英文是Fixed Header、Variable Header、Payload。可以联想HTTP协议,有请求协议、请求头、请求数据等等。

  

根据下图分析一下MQTT的三个组成部分,其中纵坐标代表的是字节数量、横坐标代表的是位数。

固定报头

固定报头(上图中第一行),分别由消息类型、DUP、可靠等级、RETAIN、剩余长度组成:

  • 消息类型

    MQTT支持发送多种数据类型,这里用4位的无符号二进制数表示多种数据类型,4位二进制能表示十进制的16种(0-15)种消息类型,例如:0001代表十进制值为1的消息类型,表示:消息从客户端到服务器,并且是请求连接的消息。

  • DUP

    标识位,发布消息的副本,如果设置为 1,则在下面的变长中增加MessageId,并且需要回复确认,以保证消息传输完成,但不能用于检测消息重复发送。

  • 可靠等级

    QoS发布消息的服务质量,即:保证消息传递的次数

    • 00:最多一次,即:<=1

    • 01:至少一次,即:>=1

    • 10:一次,即:=1

    • 11:预留

  • RETAIN

    发布保留标识,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它,如果设有那么推送至当前订阅者后释放。

  • Remain length

    它表示了整个报文剩余部分的长度(不包括固定报头的长度)。

    剩余长度字段使用了一种可变长度编码方式,可以占用1到4个字节。每个字节的最高位(bit 7)表示后续字节是否是剩余长度的一部分。如果最高位为1,表示后续字节也是剩余长度的一部分;如果最高位为0,则表示这是最后一个字节,不再是剩余长度的一部分。

可变报头

MQTT数据包中包含一个可变头,在固定报头和负载之间。它存储着各种不同类型消息特定信息,它的内容和格式取决于消息的类型和功能。例如,在固定头中的消息类型是CONNECT(十进制为1的数据类型),可变报头会含客户端的标识符、是否清除会话、心跳超时等信息。

有效负载(消息体)

这是报文的第三部分,它包含了实际的应用数据。有效负载的内容格式是由固定报文中的消息类型来决定的,它可以携带各种不同类型的数据,例如传感器数据、命令指令、文本消息等。MQTT中的每种消息类型在定义上都可以包含有效负载,但在实际使用中,并不是每个消息类型都携带有效负载

以下列举出了,携带Payload的消息类型:

注意:虽然这些消息类型可以携带有效负载,但并不是每次使用时都必须包含有效负载。是否携带有效负载取决于具体的应用需求和消息传递的目的。

  • PUBLISH(发布消息)消息:PUBLISH消息用于发布数据或信息到指定的主题(Topic)。它是MQTT中最常用的消息类型之一,可以携带有效负载,以传递实际的数据、信息或者命令。

  • SUBSCRIBE(订阅主题)消息:SUBSCRIBE消息用于向MQTT代理服务器订阅特定的主题。它通常携带有效负载,指示订阅者要订阅的主题和对应的服务质量级别。

  • SUBACK(订阅确认)消息:SUBACK消息用于确认订阅请求的结果。它通常携带有效负载,返回订阅主题和对应的服务质量级别。

  • UNSUBSCRIBE(取消订阅)消息:UNSUBSCRIBE消息用于向MQTT代理服务器取消订阅特定的主题。它通常携带有效负载,指示订阅者要取消订阅的主题。

  • PUBREC(发布接收)消息:PUBREC消息用于实现QoS级别为2的消息传递。它通常不携带有效负载,只是作为PUBLISH消息的确认,返回一个消息标识符。

  • PUBREL(发布释放)消息:PUBREL消息用于实现QoS级别为2的消息传递。它通常不携带有效负载,只是作为PUBREC消息的确认,返回一个消息标识符。

  • PUBCOMP(发布完成)消息:PUBCOMP消息用于实现QoS级别为2的消息传递。它通常不携带有效负载,只是作为PUBREL消息的确认,返回一个消息标识符。

MQTT消息类型表

下面是MQTT报文中,固定报头的消息类型对应表,方便查阅:

名称值(十进制)流方向描述
Reserved0不可用保留位
CONNECT1客户端到服务器客户端请求连接到服务器
CONNACK2服务器到客户端连接确认
PUBLISH3双向发布消息
PUBACK4双向发布确认
PUBREC5双向发布收到(保证第1部分到达)
PUBREL6双向发布释放(保证第2部分到达)
PUBCOMP7双向发布完成(保证第3部分到达)
SUBSCRIBE8客户端到服务器客户端请求订阅
SUBACK9服务器到客户端订阅确认
UNSUBSCRIBE10客户端到服务器请求取消订阅
UNSUBACK11服务器到客户端取消订阅确认
PINGREQ12客户端到服务器PING请求
PINGRESP13服务器到客户端PING应答
DISCONNECT14客户端到服务器中断连接
Reserved15不可用保留位

参考文献

<think>我们正在构建一个简单的实验室局域网,需要实现两个主要目标:电脑之间的文件共享和机器人之间的通信。我们将使用路由器、交换机和无线发射模块(即无线接入点AP)来搭建网络。下面我将分步骤详细说明如何搭建。 ### 设备清单 1. **路由器**:作为网络的网关,提供DHCP服务(为设备自动分配IP地址)和NAT功能(如果需访问互联网)。这里我们使用4G路由器,以便在没有有线宽带的情况下通过4G接入互联网(但局域网内部通信不依赖互联网)。 2. **交换机**:用于扩展网络端口,连接多个有线设备(如电脑、机器人、文件服务器等)。 3. **无线发射模块(AP)**:提供无线网络覆盖,让无线设备(如笔记本电脑、带WiFi的机器人)接入局域网。 4. **网线**:用于连接设备。 ### 网络拓扑 我们将按照以下拓扑连接: ``` 4G路由器(WAN口接4G SIM卡,LAN口接交换机) → 交换机(连接有线设备) → 无线AP(连接到交换机,提供无线网络) ``` ### 详细搭建步骤 #### 步骤1:连接硬件设备 1. 将4G SIM卡插入路由器的SIM卡槽。 2. 使用网线将路由器的LAN口(通常有多个,任选一个)连接到交换机的任意端口(此端口称为上联端口)。 3. 将需要有线连接的设备(如台式电脑、文件服务器、部分机器人)通过网线连接到交换机的其他端口。 4. 将无线AP通过网线连接到交换机的另一个端口(确保AP已通电)。 > **注意**:如果设备数量不多,也可以不使用交换机,直接使用路由器的多个LAN口连接设备。但交换机可以扩展更多端口。 #### 步骤2:配置路由器 1. 给路由器通电,用电脑或手机连接路由器的默认WiFi(或通过网线连接路由器的LAN口),在浏览器中输入路由器的管理IP(如192.168.0.1或192.168.1.1,具体参考说明书)登录管理界面。 2. 设置4G网络:确保路由器已识别SIM卡并成功连接到4G网络(如果需要访问互联网,这一步很重要;如果仅需局域网内部通信,可以不配置)。 3. 配置局域网(LAN)设置: - 设置局域网IP地址段,例如:`192.168.10.0/24`(即IP范围192.168.10.1~192.168.10.254)。 - 启用DHCP服务器:设置DHCP地址池范围,例如从`192.168.10.100`到`192.168.10.200`,这样设备连接后会自动获取IP。 - 设置子网掩码:`255.255.255.0`。 4. 无线设置(如果路由器自带WiFi功能): - 设置SSID(网络名称)和密码,建议使用WPA2-PSK或WPA3-PSK加密。 5. 保存设置并重启路由器。 #### 步骤3:配置无线AP 1. 如果路由器没有内置WiFi功能,或者需要更强的无线覆盖,则需要配置独立的无线AP。 2. 连接AP的管理IP(通常通过网线连接后,在浏览器中输入AP的默认IP地址,如192.168.10.254,具体参考说明书)。 3. 设置AP的工作模式为“接入点(AP)模式”。 4. 设置与路由器相同的SSID和密码(为了无缝漫游,可以设置成与路由器相同的SSID和密码;或者设置不同的SSID以区分)。 5. 保存设置,AP将重启。 #### 步骤4:设备连接网络 1. 有线设备:用网线连接到交换机或路由器的LAN口,设备将自动获取IP地址(确保设备网络设置为DHCP自动获取)。 2. 无线设备:搜索设置的SSID,输入密码连接。 #### 步骤5:实现文件共享 以Windows电脑为例: 1. 在需要共享文件的电脑上,创建一个共享文件夹。 2. 右键点击文件夹 → 属性 → 共享 → 点击“共享”按钮,选择要共享的用户(如Everyone)并设置权限(读取/写入)。 3. 记录此电脑的IP地址(在命令提示符输入`ipconfig`查看)。 4. 其他电脑上,在文件资源管理器的地址栏输入:`\\目标电脑的IP地址`(例如:`\\192.168.10.101`)即可访问共享文件夹。 > **注意**:确保所有电脑在同一个局域网网段(如192.168.10.x),并且网络发现和文件共享功能已开启(在Windows的网络设置中)。 #### 步骤6:机器人通信设置 1. **有线机器人**:通过网线连接到交换机,并设置为自动获取IP(DHCP)或设置静态IP(需在路由器DHCP范围外,如192.168.10.50,避免冲突)。 2. **无线机器人**:连接到无线AP的SSID,同样设置自动获取IP或静态IP。 3. 机器人之间的通信可以通过TCP/UDP套接字编程实现。例如,每个机器人运行一个程序,通过目标机器人的IP地址和端口号进行通信。 > **示例**:机器人A(IP:192.168.10.50)向机器人B(IP:192.168.10.51)发送数据。机器人B的程序监听某个端口(如8000),机器人A向192.168.10.51:8000发送数据。 ### 关键参数说明 - **IP地址分配**:确保所有设备在同一子网(如192.168.10.0/24),否则无法直接通信。 - **无线覆盖**:根据实验室面积选择合适的AP位置,避免信号死角。 - **带宽**:如果机器人传输大量数据(如视频流),建议使用千兆交换机(1000Mbps)和5GHz频段的WiFi(减少干扰,带宽更高)。 ### 故障排查 - 无法获取IP地址:检查路由器DHCP是否开启,网线是否插好。 - 无法访问共享文件:检查Windows防火墙设置(允许文件和打印机共享),确保两台电脑在同一网络。 - 机器人通信失败:检查机器人IP地址是否正确,网络是否通畅(用ping命令测试)。 ### 扩展功能 - **文件服务器**:可以设置一台专用电脑或NAS(网络附加存储)作为共享中心,所有设备访问同一个存储位置。 - **远程访问**:如果路由器支持DDNS(动态域名解析),可以在外网通过4G网络访问实验室设备(需配置端口转发)。 §§相关问题§§ 1. 如何设置静态IP地址以避免机器人IP变化? 2. 如何测试局域网内设备之间的网络延迟? 3. 如何提高无线网络覆盖范围? 4. 如何搭建一个简单的聊天程序用于机器人之间的文本通信?</think>### 构建实验室局域网的详细步骤指南 以下是使用路由器、交换机和无线发射模块(AP)搭建局域网的完整方案,满足设备通信和文件共享需求: --- #### 一、设备清单与连接拓扑 **核心设备**: 1. **路由器**:作为网络网关,提供IP分配(DHCP)和内外网连接 2. **交换机**:扩展有线端口(建议8口千兆交换机) 3. **无线AP**:提供WiFi覆盖(建议支持双频WiFi 6) 4. **网线**:Cat5e及以上规格 **拓扑结构**: ```mermaid graph LR A[4G路由器] -->|LAN口| B[交换机] B -->|端口1-4| C[机器人/小车] B -->|端口5| D[文件服务器] B -->|端口6| E[无线AP] E --> F[笔记本电脑] A -.4G SIM卡.- G[互联网] ``` --- #### 二、搭建步骤详解 ##### **阶段1:物理连接** 1. 将4G SIM卡插入路由器SIM卡槽 2. 用网线连接路由器LAN口 ↔ 交换机任意端口 3. 设备连接交换机: - 端口1-4:连接机器人/小车(有线优先) - 端口5:连接文件服务器(PC/NAS) - 端口6:连接无线AP 4. 所有设备通电启动 ##### **阶段2:路由器配置**(通过192.168.1.1登录管理页) ```bash # 启用DHCP服务(自动分配IP) DHCP范围:192.168.1.100-200 子网掩码:255.255.255.0 # 设置无线基础网络(若路由器含AP功能) SSID:Lab_Network 加密:WPA2-PSK/AES 密码:强度≥12位混合字符 ``` ##### **阶段3:交换机优化**(非必需但推荐) ```bash # 创建隔离网段提升安全性 vlan 10 # 机器人专用 vlan 20 # 办公设备 # 端口分配 interface gig0/1-4 → switchport access vlan 10 interface gig0/5-6 → switchport access vlan 20 ``` ##### **阶段4:文件共享设置** 1. 在文件服务器创建共享文件夹 2. 配置Samba服务(Windows/Linux通用): ```bash [lab_share] path = /data/shared valid users = @research_group writable = yes ``` 3. 设置访问权限: ```bash sudo chmod 770 /data/shared sudo chgrp research_group /data/shared ``` ##### **阶段5:机器人通信配置** 1. **有线机器人**: - 通过网线直连交换机端口 - 设置静态IP(避免DHCP冲突),例如: ```bash IP:192.168.1.50 网关:192.168.1.1 子网掩码:255.255.255.0 ``` 2. **无线机器人**: - 连接SSID:Lab_Network - 使用DHCP或保留IP(需在路由器设置IP-MAC绑定) 3. **通信协议**: - 使用UDP/TCP套接字编程实现点对点通信 - 推荐协议MQTT(轻量级消息队列)或ROS(机器人操作系统) --- #### 三、关键验证与测试 | 功能 | 测试方法 | |---------------------|------------------------------------------| | **文件共享** | 在电脑运行`\\文件服务器IP`访问共享文件夹 | | **机器人通信** | 通过ping命令测试连通性:`ping 192.168.1.50` | | **跨设备通信** | 机器人A向机器人B发送控制指令(需编程实现)| | **无线覆盖** | 使用WiFi分析仪检查信号强度(≥-65dBm) | --- #### 四、故障排除指南 | 问题 | 解决方案 | |-----------------------|------------------------------------------| | 设备无法获取IP | 检查路由器DHCP是否启用,重启设备 | | 文件共享访问被拒 | 确认Samba用户权限和防火墙设置(开放139/445端口)| | 机器人通信延迟高 | ① 有线直连取代无线 ② 关闭交换机端口限速 | | 4G网络不稳定 | 调整天线方向或添加4G信号放大器[^2] | > **安全建议**: > - 禁用路由器远程管理功能 > - 定期更新设备固件 > - 为机器人设置专用通信VLAN[^1] --- #### 五、扩展应用场景 1. **远程监控**:通过4G网络外网访问实验室设备 2. **集中升级**:文件服务器分发机器人固件更新 3. **数据备份**:NAS自动同步实验数据
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值