想象你搬进了一个“云端智慧社区”:门口的电表、阳台的花盆湿度计、车库的路灯、客厅的摄像头,全是能说话的智能设备。物业中心想随时知道它们的状况,可这些设备不能像手机那样随时开直播——它们省电、量小、网络经常时好时坏。这时,社区里需要两套沟通语言:一套是“广播站模式”,任何设备把消息贴到公告栏,感兴趣的人(或系统)订阅栏目后自动收到推送;另一套是“对讲机模式”,控制中心按一下门铃直接问某个设备,设备立刻回答。前者叫 MQTT,后者叫 CoAP。它们是目前物联网世界最主流的两套“邻里通信协议”。全程我们会用这个小区的故事,把这两个协议从原理到实战讲清楚。

岗位关联

掌握 MQTT/CoAP 是物联网开发者的基本功:从智能家居到工业监控,选对协议、配好 QoS、能排查故障,才能让海量设备在正确的时间把数据送到 AI 模型手里。

目录
  1. 可视化演示
  2. 1. 协议定位:先看清社区格局
  3. 2. MQTT核心原理:社区广播站
  4. 3. MQTT可靠性:广播的三种认真程度
  5. 4. CoAP核心原理:楼道对讲机
  6. 5. CoAP可靠性:对讲里的“听到请回答”
  7. 6. 性能优化:广播站还是对讲机?
  8. 7. 工程实践:小区通信故障手册
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示IoT通信协议三大核心:MQTT发布订阅(1个PUB发布者→Broker消息代理→3个SUB订阅者S1/S2/S3主题路由+QoS 0/1/2三级服务质量)、CoAP请求响应(客户端CLI↔服务器SRV基于UDP轻量协议REQ请求+RSP响应+4种方法GET/POST/PUT/DELETE RESTful风格)、协议对比(MQTT TCP开销5B延迟50ms负载256B vs CoAP UDP开销1B延迟10ms负载64B按场景选型),三模式切换理解IoT协议。

本节配有交互动效(进入视口后自动加载,约 3KB)。

'+C1+'

1. 协议定位:先看清社区格局

智慧社区里,有的通知适合用公告栏贴、让订阅的住户来取,有的查询适合直接按门铃问。通信协议也一样,先要看清社区分成几层:最底层是感知层,住着温湿度传感器、烟雾报警器、电表这些“一线住户”,它们负责采集;中间的网络层是“邮路”,把消息从门口驿站搬上楼;顶层的应用层是“物业大脑”,负责理解数据和做决策。

对应到技术上,感知层产生数据,网络层的 MQTT/CoAP 负责封装与搬运,应用层的云端程序或 AI 模型负责解析,这就构成了物联网三层架构。小区资源受限——设备电池小、内存少、网络常抖动,所以协议要“轻”:报文越短越好,握手越少越好。于是有了基于 TCP 的 MQTT 和基于 UDP 的 CoAP 两条不同路线,一条重可靠、一条重轻快。

回到小区比喻:你以为买的是“对讲机”还是“广播订阅”?需求先想清楚,后面才不会乱配设备。这正是协议选型的第一课。

IoT 通信链路=感知层(采集)→网络层(传输)应用层(解析)\displaystyle \text{IoT 通信链路} = \text{感知层(采集)} \xrightarrow{\text{网络层(传输)}} \text{应用层(解析)}
  1. 感知层负责采集物理世界数据,如温度、湿度、开关状态。
    感知层=传感器+执行器\text{感知层} = \text{传感器} + \text{执行器}
  2. 网络层用 MQTT/CoAP 把数据封装成报文并路由到目标端。
    网络层=协议封装+路由转发\text{网络层} = \text{协议封装} + \text{路由转发}
  3. 应用层云端或边缘 AI 解析数据、做业务决策。
    应用层=数据解析+AI决策\text{应用层} = \text{数据解析} + \text{AI决策}

2. MQTT核心原理:社区广播站

MQTT 像小区里的广播站:快递员(发布者)把通知送到广播站(Broker),广播站按“栏目”分拣,住户(订阅者)只要订了该栏目,广播站就主动投递。这个模式最大的优点是“解耦”——发布者不认识订阅者,订阅者也不关心消息从哪来,大家只认广播站。

在 MQTT 中,这个“栏目”叫主题(Topic),用斜杠分级,比如 一栋/三层/温度传感器。发布者往主题写数据,订阅者订阅主题拿数据,Broker 负责转发和缓存。报文类型也很丰富:CONNECT 表示住户来办理入网,PUBLISH 表示投递消息,SUBSCRIBE 表示订阅栏目,DISCONNECT 表示离网。

每条 MQTT 报文由固定头、可变头和有效载荷组成。固定头里带着“这是哪种报文”和“后面还有多长”,可变头按需携带主题名、报文标识等,有效载荷才是真正的传感器数值。

广播站带来便利也带来约束:所有消息都过它一手,Broker 就成了性能关键点。但社区里几千户人家,广播站仍是效率最高的通知方式——这正是 MQTT 在智能家居领域随处可见的原因。

MQTT报文=固定头(2-5字节)+可变头(可选)+有效载荷\displaystyle \text{MQTT报文} = \text{固定头(2-5字节)} + \text{可变头(可选)} + \text{有效载荷}
  1. 固定头所有报文必带,含报文类型与标志位、剩余长度字段。
    固定头=类型与标志(1字节)+剩余长度(1-4字节)\text{固定头} = \text{类型与标志(1字节)} + \text{剩余长度(1-4字节)}
  2. 可变头根据报文类型携带主题名、报文标识符等。
    可变头=Topic名称+报文标识符+…\text{可变头} = \text{Topic名称} + \text{报文标识符} + \dots
  3. 有效载荷真正的业务数据,如温度 23.5°C。
    Payload=23.5∘C\text{Payload} = 23.5^{\circ}C

3. MQTT可靠性:广播的三种认真程度

小区广播站也分“多认真”:普通广播的大喇叭喊一遍,听到听不到随缘;重要通知喊完再打个电话确认收没收到;特别重要的文件,需要专人上楼、签字确认、回执归档。MQTT 的 QoS 等级就是这三种认真程度。

QoS0(至多一次):消息发出去就不管了,适合垃圾桶满了、路灯亮暗这类丢了也无妨的状态上报。QoS1(至少一次):发送方等接收方回执(PUBACK),没回就重发,代价是可能重复。QoS2(恰好一次)用四步握手,保证不重不丢,适合门锁控制、支付指令等关键操作。

另外,MQTT 还有两件“广播站神器”:保留消息让新订阅的住户进屋就能看到最近一条公告;遗嘱消息让住户意外失联时,广播站替它发布一条“某某已离线”的讣告。可靠不是越高越好,而是匹配业务的重要程度。

QoS2 四步握手:PUBLISH→PUBREC→PUBREL→PUBCOMP\displaystyle \text{QoS2 四步握手}:\quad \text{PUBLISH} \to \text{PUBREC} \to \text{PUBREL} \to \text{PUBCOMP}
  1. PUBLISH发送方发出带唯一报文标识符的消息。
    PUBLISH=主题+载荷+报文ID\text{PUBLISH} = \text{主题} + \text{载荷} + \text{报文ID}
  2. PUBREC接收方回执“已收到该报文 ID”。
    PUBREC=确认报文ID\text{PUBREC} = \text{确认报文ID}
  3. PUBREL发送方确认“可以释放该报文 ID”。
    PUBREL=释放报文ID\text{PUBREL} = \text{释放报文ID}
  4. PUBCOMP接收方回复“处理完成”。
    PUBCOMP=完成报文ID\text{PUBCOMP} = \text{完成报文ID}

4. CoAP核心原理:楼道对讲机

如果说 MQTT 是大喇叭,CoAP 就是楼道对讲机:客户端按一下门铃(发起请求),设备端通过话筒回答(返回响应)。它不依赖中心广播站,两个节点直接对话,特别适合“我要问某个灯泡现在亮不亮”这种一问一答的场景。

CoAP 在设计上借鉴了 REST 风格:每个设备暴露资源(Resource),用 URI 路径定位,比如 coap://路灯01/status。操作方法与 HTTP 一致:GET 查询、POST 新增、PUT 更新、DELETE 删除。但它的报文比 HTTP 精简得多——仅仅 4 字节固定头部,压缩到极致,一条消息小到可以塞进一个 UDP 数据报。

对讲机的好处是直接、省心:不用先跑去广播站登记,省掉中间人开销。但代价是对话双方必须在场——发送方发出请求后,要等待响应,这正好引出下一节如何保证对讲不落空。

CoAP头部=[Ver(2位)+Type(2位)+TKL(4位)]⏟1字节+[Code(8位)]+[Message ID(16位)]=4字节\displaystyle \text{CoAP头部} = \underbrace{[Ver(2位)+Type(2位)+TKL(4位)]}_{1字节} + [Code(8位)] + [Message\ ID(16位)] = 4字节
  1. Ver 与 Type 与 TKL前 1 字节含版本号、消息类型、Token 长度。
    Ver+Type+TKL=2+2+4=8 位=1 字节Ver + Type + TKL = 2 + 2 + 4 = 8\text{ 位} = 1\text{ 字节}
  2. Code表示请求方法或响应码,例如 GET、2.05 Content。
    Code=GET/POST/PUT/DELETE 或 2.05 等\text{Code} = \text{GET/POST/PUT/DELETE 或 2.05 等}
  3. Message ID16 位随机数,用于匹配请求响应与去重。
    Message ID=16 位唯一标识\text{Message ID} = 16\text{ 位唯一标识}

5. CoAP可靠性:对讲里的“听到请回答”

对讲机喊出“收到请回答”,对方回一句“收到”,才算踏实。CoAP 在 UDP 之上实现了类似机制:可确认消息(CON)必须得到 ACK 应答,如果没收到 ACK,发送方就按“指数退避”规则重传——第一次等 2 秒,再等 4 秒、8 秒……就像对讲机喊完没人应,你会隔一会儿喊一遍,且每次间隔翻倍。

同时,CoAP 用 Message ID 做重复检测:假设响应 ACK 丢了,客户端重传了请求,服务器收到重复请求也不会重复执行。针对大文件,CoAP 还提供块传输(Block-wise),把大载荷切成一块块分别传,避免超过 UDP 报文上限。

这套机制让 UDP 上的 CoAP 也有了自己的“可靠档位”:重要指令用 CON 消息,普通遥测用 NON 消息即可。和 MQTT 的中心保障不同,CoAP 的可靠性是“端到端自己扛”。

Tn=ACK_TIMEOUT×2n−1,n=1,2,…\displaystyle T_n = \text{ACK\_TIMEOUT} \times 2^{n-1},\quad n=1,2,\dots
  1. ACK_TIMEOUT基础超时时间,CoAP 标准默认 2 秒。
    T1=2s×20=2sT_1 = 2s \times 2^0 = 2s
  2. n重传序号,每重传一次加 1。
    T2=2s×21=4sT_2 = 2s \times 2^1 = 4s
  3. 上限控制达到最大重传次数后放弃并通知上层。
    Tn≤MAX_TRANSMIT_SPANT_n \le \text{MAX\_TRANSMIT\_SPAN}

6. 性能优化:广播站还是对讲机?

现在把两种工具放在秤上比一比。广播站(MQTT)多了一次中转,报文固定头最小也要 2 字节,但换来了一对多推送的高效率——给一百户发通知只投递一次。对讲机(CoAP)头部 4 字节且路径最短,但每问一件事都要一次交互,适合单对单的按需查询。

衡量端到端时延可以从四段来拆:发送方把报文“推上链路”的传输时延、信号在网线/空中“奔跑”的传播时延、网关或服务器“思考”的处理时延、以及排队等待的时延。MQTT 长连接需要心跳保活(KeepAlive),所以功耗略高;CoAP 则提供了观察模式(Observe),客户端订阅资源后,服务器只在变化时推送,轮询开销大降。

所以选型口诀是:高频上报、一对多通知选 MQTT;低频查询、单点控制选 CoAP;弱网、深睡眠设备优先 CoAP。小区里广播站和对讲机都要有,关键是把工具放到对的场景里。

E2E=Dtrans+Dprop+Dproc+Dqueue\displaystyle E2E = D_{trans} + D_{prop} + D_{proc} + D_{queue}
  1. 传输时延报文封装后送上链路的时间,与报文长度成正比。
    Dtrans=报文长度链路速率D_{trans} = \frac{\text{报文长度}}{\text{链路速率}}
  2. 传播时延信号在物理介质中走过一段距离的时间。
    Dprop=物理距离传播速度D_{prop} = \frac{\text{物理距离}}{\text{传播速度}}
  3. 处理与排队时延节点 CPU 解析报文、队列等待产生的时间。
    Dproc+Dqueue=处理时间+排队时间D_{proc} + D_{queue} = \text{处理时间} + \text{排队时间}

7. 工程实践:小区通信故障手册

广播站也好,对讲机也好,用久了总会出问题:住户收不到通知、对讲机喊半天没人应。排查思路是逐层梳理:先看网络层通不通(端口、防火墙),再看协议层(MQTT 是否有心跳,CoAP 是否有重传),最后看业务层(主题是否写错、资源路径是否匹配)。

安全方面,小区也得装门禁:MQTT 走 TLS 加密,CoAP 走 DTLS 加密,二者都支持用户名密码或预共享密钥(PSK)。工程上还有几条避坑经验:主题命名要有层级规范,比如 设备类型/楼栋/房间/传感器;消息量大的业务用 QoS0/1 而不是全部 QoS2;同时要设计重连退避,防止大量设备同时重连把服务器打爆。

小区管理成熟后,广播站和对讲机各司其职、故障预案齐全,住户体验自然稳定。MQTT 与 CoAP 的工程实践,本质就是把这套“设备沟通秩序”维护好。

Tretry=min⁡(T0×2k, Tmax⁡)\displaystyle T_{retry} = \min(T_0 \times 2^{k},\ T_{\max})
  1. T0初始重连等待时间,比如 1 秒。
    T0=1sT_0 = 1s
  2. k连续失败次数,每次失败后 k 加 1。
    k=0,1,2,…k = 0, 1, 2, \dots
  3. 封顶等待时间设上限,防止无休止增长。
    Tmax⁡=60sT_{\max} = 60s

AI 应用场景

智能家居联动控制(MQTT)

阶段:数据接入与实时传输

解决的问题:传统方案轮询每个设备,延迟高且占用带宽;AI 助手需要实时感知全屋状态。

具体案例:AI 家庭中枢通过 MQTT 订阅 home/客厅/光照、home/卧室/温度 等主题。窗帘电机、空调、灯光分别作为发布者/订阅者,接入同一个本地 Broker。AI 模型解析光感数据后,向窗帘执行器发布“关闭”指令,全程毫秒级完成。

工业设备边缘诊断(CoAP)

阶段:边缘推理与按需查询

解决的问题:工厂设备种类多、数据量大,全部上报云端成本高;AI 诊断模型需要按需读取特定参数。

具体案例:边缘 AI 网关部署故障诊断模型,当模型产生疑问时,通过 CoAP 向某台电机控制器发送 GET 请求,读取振动、电流资源;控制器返回最新数据,模型完成推理并下发处置指令,整个过程绕过云端、延迟极低。

智慧园区混合组网(MQTT+CoAP)

阶段:多源数据汇聚与联动决策

解决的问题:园区设备既有高频率上报的传感器,也有低频率查询的执行器,单一协议难以兼顾。

具体案例:智慧路灯系统用 MQTT 定期上报能耗数据(批量推送),用 CoAP 支持巡检人员单灯查询状态、远程开关。AI 平台从 MQTT 数据流中识别异常能耗,再通过 CoAP 精准控制问题路灯,实现“广播预警 + 单点处置”。

Python 演示

python109 行
import timefrom collections import defaultdict  class SimpleBroker:    """模拟 MQTT Broker, 按主题转发消息"""     def __init__(self):        self.subs = defaultdict(list)      # 主题 -> 订阅客户端列表        self.retained = {}                 # 主题 -> 最后一条消息     def subscribe(self, topic, client):        if client not in self.subs[topic]:            self.subs[topic].append(client)     def publish(self, topic, payload, qos):        delay = {0: 0.0, 1: 0.1, 2: 0.2}[qos]        time.sleep(delay)        self.retained[topic] = payload        for client in self.subs[topic]:            client.on_message(topic, payload, qos)  class MqttSensor:    """模拟 MQTT 发布者"""     def __init__(self, broker):        self.broker = broker     def report(self, topic, payload, qos=0):        self.broker.publish(topic, payload, qos)  class MqttApp:    """模拟 MQTT 订阅应用"""     def __init__(self, name):        self.name = name        self.received = []     def on_message(self, topic, payload, qos):        self.received.append((topic, payload, qos))        print("[%s] 收到 %s -> %s (QoS%d)" % (self.name, topic, payload, qos))  class CoapResource:    """模拟 CoAP 服务器上的资源"""     def __init__(self, path, value):        self.path = path        self.value = value     def get(self):        return self.value     def put(self, value):        self.value = value  class CoapServer:    """模拟 CoAP 服务器"""     def __init__(self):        self.resources = {}     def add_resource(self, res):        self.resources[res.path] = res     def handle(self, method, path, data=None):        res = self.resources[path]        if method == "GET":            return res.get()        if method == "PUT":            res.put(data)            return "updated"  class CoapClient:    """模拟 CoAP 客户端"""     def __init__(self, server):        self.server = server     def get(self, path):        return self.server.handle("GET", path)     def put(self, path, data):        return self.server.handle("PUT", path, data)  def main():    # MQTT 流程: 传感器发布, 应用订阅    broker = SimpleBroker()    app = MqttApp("天气面板")    broker.subscribe("home/温度", app)    sensor = MqttSensor(broker)    sensor.report("home/温度", "23.5C", qos=1)    print("MQTT 已发布:", app.received)     # CoAP 流程: 客户端直接请求资源    server = CoapServer()    server.add_resource(CoapResource("temperature", "23.5C"))    client = CoapClient(server)    print("CoAP GET:", client.get("temperature"))    print("CoAP PUT:", client.put("temperature", "24.0C"))  if __name__ == "__main__":    main()
目的:用纯 Python 对象模拟 MQTT 发布订阅与 CoAP 请求响应两种通信模式,演示主题转发、QoS 延时和 REST 式资源操作。
  1. self.subs = defaultdict(list)用字典保存“主题 -> 订阅者列表”,这是 Broker 的核心分拣表。
  2. def publish(self, topic, payload, qos)模拟 MQTT 发布,按 QoS 等级模拟不同的确认耗时。
  3. client.on_message(topic, payload, qos)Broker 把消息推送给每个订阅者,体现广播站式转发。
  4. def add_resource(self, res)CoAP 服务器注册资源路径,对应 REST 风格中的 URI。
  5. if method == "GET"CoAP 客户端请求资源时,服务器按方法分发到对应处理逻辑。
  6. time.sleep(delay)用延时直观表现 QoS 越高、握手越多的开销代价。

常见误区

误区给所有消息都配 QoS2,觉得越可靠越安全,反正带宽不用白不用。

正解QoS2 需要四步握手,时延和流量开销远大于 QoS0/1。就像每封平信都要专人签收,小区广播站会累瘫。温度遥测这类允许偶发丢失的数据用 QoS0 即可,只有控制指令、支付类消息才值得上 QoS2。

为何常见:初学者把“可靠”理解成绝对的优点,忽略了可靠背后的资源和时延代价。

误区既然都是 IoT 协议,哪个顺手用哪个,反正都能传数据。

正解MQTT 是发布订阅模型,天然适合一对多推送;CoAP 是请求响应模型,适合按需查询。用 MQTT 做单灯查询,等于开着广播站只为问一个人;用 CoAP 做全楼广播,等于挨家挨户按门铃。场景决定选型,不能靠喜好互换。

为何常见:只看“能传数据”的共性,忽略了通信模式与网络拓扑的根本差异。

误区CoAP 就是 UDP 上跑了个简化 HTTP,除了头部短点没什么新鲜的。

正解CoAP 确实借鉴了 REST,但它有 HTTP 没有的能力:CON/NON 消息类型、观察模式订阅资源变化、块传输应对大文件、组播支持设备发现。它不是 HTTP 的简单压缩,而是为受限网络重新设计的协议。

为何常见:CoAP 的 URI 和 GET/POST 与 HTTP 太像,容易让人低估它独有的机制。

误区MQTT 基于 TCP,CoAP 基于 UDP,所以 MQTT 永远比 CoAP 可靠。

正解TCP 解决的是字节流传输的可靠性,但业务层的消息去重、到达顺序仍要应用层负责。CoAP 的 CON 机制在 UDP 之上实现了应用层的确认与重传,对业务来说同样可靠。而且 TCP 握手开销大、队头阻塞,在弱网下未必比“轻量 UDP + 应用层确认”更稳。

为何常见:把“可靠”等同于“基于 TCP”,忽略了可靠性是多层次共同实现的。

误区开启 MQTT 持久会话后,Broker 会无限期保存所有离线消息,随时补发。

正解持久会话只是保存会话状态(订阅关系与未确认的 QoS1/2 消息),且消息只在会话过期时间内有效。它不等于消息队列,不会把三个月前的数据都留着。要长时间缓存数据,应使用 Broker 的保留消息或独立的消息存储系统。

为何常见:把“会话”和“存储”两个概念混为一谈,忽略了过期策略与资源上限。

面试题

Q1. MQTT 采用哪种消息通信模式?

单选题 · easy

  • A.请求响应模式
  • B.发布订阅模式← 正确答案
  • C.点对点直连模式
  • D.多播广播模式

答案:B。MQTT 的核心是发布订阅模型,发布者把消息交给 Broker,Broker 按主题转发给订阅者,双方互相解耦。请求响应是对讲机式 CoAP 的模型,点对点直连则不是 MQTT 的典型用法。

Q2. CoAP 协议默认构建在哪个传输层协议之上?

单选题 · easy

  • A.TCP
  • B.UDP← 正确答案
  • C.QUIC
  • D.SCTP

答案:B。CoAP 专为受限设备设计,默认跑在 UDP 上,报文头仅 4 字节。TCP 是 MQTT 的传输层,QUIC 和 SCTP 在 IoT 领域并不常见。

Q3. MQTT QoS1 场景下,如果 PUBACK 应答丢失会发生什么?

单选题 · mid

  • A.消息会被直接丢弃
  • B.发送方可能重发导致重复← 正确答案
  • C.连接会立刻断开
  • D.会话自动切换为 UDP

答案:B。QoS1 是“至少一次”:发送方未收到 PUBACK 就会重发,因此接收方可能收到重复消息。它不像 QoS2 那样有去重机制,也不至于断开连接或切换传输层。

Q4. CoAP 中用于订阅服务器资源变化、避免反复轮询的机制是什么?

单选题 · mid

  • A.Observe 机制← 正确答案
  • B.Blockwise 机制
  • C.Discover 机制
  • D.Ping 机制

答案:A。Observe(观察)让客户端注册后,服务器在资源变化时主动推送,这与小区广播站的订阅推送很相似。Blockwise 用于大文件分段,Discover 用于资源发现,Ping 是探测存活。

Q5. 以下哪些机制属于 CoAP 的可靠性保障?

多选题 · mid

  • A.CON 消息与 ACK 应答← 正确答案
  • B.指数退避重传← 正确答案
  • C.TCP 三次握手
  • D.块传输 Block-wise← 正确答案

答案:ABD。CoAP 用 CON 消息要求 ACK,超时后按指数退避重传,大文件用块传输切分,这些都是它自带的可靠性手段。TCP 三次握手是传输层的事情,CoAP 本身不用 TCP。

Q6. MQTT 中遗嘱消息(Last Will)的作用是什么?

单选题 · mid

  • A.维持心跳保活
  • B.用户异常断开时由 Broker 代发预设消息← 正确答案
  • C.加密客户端会话
  • D.分发 QoS2 消息

答案:B。遗嘱消息是住户失联时广播站替他贴的“告示”:客户端异常断线后,Broker 会代它发布预设消息,让其他订阅者知道设备掉线了。心跳保活是 KeepAlive 的职责,与遗嘱无关。

Q7. 以下哪个场景更适合选用 MQTT 而不是 CoAP?

单选题 · easy

  • A.一对一单次设备查询
  • B.海量设备持续状态上报← 正确答案
  • C.浏览器 REST 接口调用
  • D.局域网组播唤醒设备

答案:B。MQTT 的发布订阅模式天生适合海量设备向云端持续上报状态,Broker 集中转发效率高。一对一查询和组播正是 CoAP 的强项,浏览器 REST 接口则属于 HTTP 的世界。

Q8. 关于 MQTT 与 CoAP 的对比,下列说法正确的是?

多选题 · hard

  • A.MQTT 基于 TCP,CoAP 基于 UDP← 正确答案
  • B.MQTT 由中心 Broker 转发,CoAP 端到端直接通信← 正确答案
  • C.MQTT 不能用于局域网设备控制
  • D.CoAP 报文头比 MQTT 更紧凑← 正确答案

答案:ABD。MQTT 走 TCP 且必须经 Broker,CoAP 走 UDP 且节点直连。CoAP 固定头 4 字节,比 MQTT 最小 2 字节加可变头的结构更精简。MQTT 完全可以用于局域网控制,C 说法过于绝对。

Q9. CoAP 重传使用指数退避,若 ACK_TIMEOUT=2s,第三次重传的等待时间是多少?

单选题 · hard

  • A.2 秒
  • B.4 秒
  • C.8 秒← 正确答案
  • D.16 秒

答案:C。按公式 Tn = ACK_TIMEOUT × 2^(n-1),第一次重传 n=1 等 2 秒,第二次 n=2 等 4 秒,第三次 n=3 等 8 秒。这和小区保安喊话没人应、每次间隔翻倍的策略一致。

Q10. 在 MQTT 中,若 Broker 重启且客户端开启了持久会话,以下说法正确的是?

多选题 · extreme

  • A.持久会话可缓存未确认消息← 正确答案
  • B.订阅信息会被永久遗忘
  • C.遗嘱消息正常断开也会发布
  • D.重连后无需重新订阅即可恢复← 正确答案

答案:AD。持久会话保存订阅关系与未确认的 QoS1/2 消息,重连后自动恢复,无需重新 SUBSCRIBE。但消息缓存有过期时间,并非永久;遗嘱只在异常断开时由 Broker 代发,正常断开不会触发。