ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

深入对比 MQTT、AMQP 与 HTTP/HTTPS:IoT-For-Beginners 第四课课后任务的协议选型指南

深入对比 MQTT、AMQP 与 HTTP/HTTPS:IoT-For-Beginners 第四课课后任务的协议选型指南 深入对比 MQTT、AMQP 与 HTTP/HTTPSIoT-For-Beginners 第四课课后任务的协议选型指南【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本文围绕《IoT-For-Beginners》入门系列第四课「将设备接入互联网」的课后作业展开系统对比 MQTT 与 AMQP、HTTP/HTTPS 三大 IoT 通信协议。文中将以仓库中夜灯nightlight项目的 MQTT 实现为参照从功耗、安全、断连消息持久化三个核心维度给出可执行的对比框架帮助读者在真实 IoT 项目中做出正确的协议选型。说明本文对应的作业原文位于 translations/bg/1-getting-started/lessons/4-connect-internet/assignment.md英文原版见 1-getting-started/lessons/4-connect-internet/assignment.md其完整课程主体在 1-getting-started/lessons/4-connect-internet/README.md。作业背景为什么要比较 MQTT 与其他协议第四课的核心是让读者理解 IoT 设备如何通过标准通信协议连接到云端服务。课程主体内容围绕 MQTT 展开——它是一种轻量级的、开放标准的消息传递协议于 1999 年为监控输油管道而设计15 年后由 IBM 发布为开放标准。MQTT 采用单个 broker、多个客户端的模型所有客户端连接到 broker消息通过具名主题topic路由发布者向主题发布消息订阅该主题的所有客户端都会收到消息。课后作业要求学生完成一个研究型任务将 MQTT 与另外两类常见协议——AMQP 和 HTTP/HTTPS——进行对比compare and contrast并重点从三个维度展开分析功耗power usage——协议对设备电池续航的影响安全security——协议提供的身份认证与加密能力消息持久性message persistence——连接中断时消息是否会丢失。作业的评分标准Rubric也按此设计分别对AMQP vs MQTT和HTTP/HTTPS vs MQTT两组对比评分能够覆盖全部三个维度为优秀只覆盖两个维度为合格仅覆盖一个维度则需要改进。也就是说一份完整的作业答案必须逐项给出这两组协议在功耗、安全、断连持久性上的差异结论本文即为这一任务提供可直接参考的技术素材与仓库佐证。MQTT 的关键特性回顾对比基准在展开对比之前先回顾课程中已经建立的 MQTT 知识基线这些特性正是后续对比的参照物。课程 1-getting-started/lessons/4-connect-internet/README.md 中提到主题与通配符主题具有层级结构客户端可用通配符订阅多个层级例如温度遥测发到/telemetry/temperature、湿度发到/telemetry/humidity云端应用订阅/telemetry/*即可同时接收两类数据服务质量QoSMQTT 提供三档 QoS——至多一次fire and forget、至少一次确认投递、恰好一次两阶段握手保证仅投递一份无消息队列尽管名字里有Message QueueingMQTT 本身并不支持消息队列。客户端断开期间发送的消息不会在重连后自动补发除了已在 QoS 流程中处理的消息但消息可设置retained 标志broker 会保存该主题上最后一条带此标志的消息并在新客户端订阅时推送给它保活机制keep alive在消息间隔较长时检测连接是否仍然存活连接安全MQTT 连接可以是公开开放的也可以用用户名/密码或证书进行加密和认证传输层MQTT 基于 TCP/IP与 HTTP 底层协议相同但使用不同端口也可通过 WebSocket 承载以适配浏览器或受防火墙限制的场景。课程的实践环节在仓库中留有完整的可运行代码它们展示了 MQTT 在物联网夜灯上的真实用法可以作为对比时MQTT 侧的具体证据MQTT 连接与遥测发布Python 虚拟设备1-getting-started/lessons/4-connect-internet/code-mqtt/virtual-device/nightlight/app.pyMQTT 连接与命令订阅Python 虚拟设备1-getting-started/lessons/4-connect-internet/code-commands/virtual-device/nightlight/app.py服务端订阅遥测、发布命令Python1-getting-started/lessons/4-connect-internet/code-commands/server/app.pyWio TerminalArduino/C端到端实现1-getting-started/lessons/4-connect-internet/code-commands/wio-terminal/nightlight/src/main.cpp以服务端代码为例code-commands/server/app.py 完整演示了 MQTT 的订阅遥测→决策→发布命令闭环mqtt_client mqtt.Client(client_name) mqtt_client.connect(test.mosquitto.org) mqtt_client.loop_start() def handle_telemetry(client, userdata, message): payload json.loads(message.payload.decode()) print(Message received:, payload) command { led_on : payload[light] 300 } print(Sending message:, command) client.publish(server_command_topic, json.dumps(command)) mqtt_client.subscribe(client_telemetry_topic) mqtt_client.on_message handle_telemetry while True: time.sleep(2)对应地设备侧代码code-commands/virtual-device/nightlight/app.py每 5 秒向id /telemetry主题发布一次{light: 数值}遥测并订阅id /commands主题根据led_on字段控制 LED。两侧共用同一个id前缀命名主题——README.md 特别强调服务端代码中的ID必须与设备端一致否则订阅/发布就会落在错误主题上。Wio Terminal 版本则把同样的逻辑用 C 表达PubSubClient负责 MQTTArduinoJson负责编解码主题同样在 config.h 中定义为ID /telemetry与ID /commands。这些代码展示的 MQTT 特点轻量 JSON 载荷、单一 broker、主题路由、发布/订阅正是后续对比中 MQTT 一方的基准画像。MQTT 与 AMQP 的对比AMQPAdvanced Message Queuing Protocol高级消息队列协议是一种面向消息的开放标准协议。与 MQTT 不同AMQP 的核心定位是可靠的企业级消息传递它原生支持消息队列、路由键routing key、交换器exchange与绑定binding等概念并内建消息持久化、确认acknowledgement与事务能力。二者在以下三个维度上差异显著。功耗对比MQTT 胜出。MQTT 为低功耗、低带宽场景而生报文头极小最小仅 2 字节客户端与 broker 之间保持长连接空闲时仅需周期性发送很小的 keep-alive 包即可维持连接非常适合电池供电的传感器节点。AMQP 开销更大。AMQP 的帧结构、复杂的连接握手与多协议层次使其报文头部更大、协商更重对微控制器等资源受限设备不友好。从仓库实践看课程在 Wio TerminalCortex-M4F 微控制器这类低算力设备上选择 MQTTcode-commands/wio-terminal/nightlight/src/main.cpp而非 AMQP正是功耗与资源约束下的典型取舍。安全对比两者都支持 TLS 加密传输与用户名/密码或证书认证安全能力大致相当。MQTT 的差异点在于其轻量连接安全基于 MQTT 规范中的 CONNECT 报文认证字段而 AMQP 的安全模型与 SASL简单认证与安全层深度集成更便于嵌入企业级统一身份体系。课程同时提醒作业中使用的公共测试 brokertest.mosquitto.org是公开且不安全的任何人可能监听你发布的内容绝不可用于需要保密的敏感数据见 README.md——这一提醒对 AMQP 同样适用无论使用哪种协议公共 broker/服务都不能承载隐私数据。断连时的消息持久性对比AMQP 原生具备持久化能力。AMQP 的消息队列模型支持消息落盘、持久订阅与消息确认客户端断线期间 broker 会为其保留消息重连后可继续消费这与 AMQP面向可靠企业集成的定位一致。MQTT 需要显式配置。正如课程所述MQTT 本身不支持消息队列客户端断线期间的消息默认不会补发如需近似持久性只能依靠 retained 消息broker 保存每个主题最后一条带 retained 标志的消息供后来订阅者获取最新状态或由应用层自行实现消息重放。对断连期间全部消息都不丢失的强可靠性场景AMQP 原生模型更有优势。对比结论可直接用于作业设备端资源紧张、电池供电、消息可容忍少量丢失时选 MQTT需要企业级消息队列、严格的消息持久化与路由灵活性、且设备算力/供电充足时选 AMQP。就夜灯这类场景而言MQTT 的轻量与 retained 消息保证新接入设备立即拿到最新灯控状态已经足够。MQTT 与 HTTP/HTTPS 的对比HTTP/HTTPS 是最普及的 Web 协议HTTPS 在 HTTP 之上叠加 TLS 加密。几乎所有 IoT 设备都具备 HTTP/HTTPS 客户端能力因此它也常被用作设备与云之间的传输方式但其请求-响应模型与 MQTT 的发布-订阅模型存在本质差异。功耗对比MQTT 更省电。MQTT 客户端建立长连接后持续保持连接消息开销小HTTP 则是请求-响应模式客户端每次发送数据都要重新建立 TCP 连接或维持连接池、携带完整的 HTTP 报文头含 Cookie、User-Agent 等大量元数据报文体积远大于 MQTT。对电池供电、需要频繁上报数据的传感器MQTT 的低开销显著延长续航。反过来如果设备极少上报数据例如每天仅几次HTTP/HTTPS 的连接即用、发完即断反而没有持续的保活开销此时两者功耗差距缩小。这也是课程中多久发送一次遥测讨论的意义所在——README.md 明确指出测量频率越高功耗、带宽、数据量与云端处理成本都越高需要测够但不测太频繁。安全对比HTTPS 全面占优。HTTPS 通过 TLS 提供传输加密、服务器身份验证并可通过客户端证书实现双向认证由于继承了 Web 生态HTTPS 还天然兼容 OAuth2、API Key 等成熟认证体系。而 MQTT 的 TLS 支持虽然存在课程提到可用用户名/密码或证书加密但在默认配置下 MQTT 常以明文运行如公共测试 broker 的 1883 端口需要显式启用 TLS 才安全。需要注意作业评分关注的是协议本身能提供什么所以在 HTTPS vs MQTT 的安全对比中应写HTTPS 默认即加密、MQTT 需显式配置 TLS而不是得出MQTT 不安全的绝对结论——两者在正确配置下都能实现安全通信。断连时的消息持久性对比HTTP/HTTPS 没有服务端消息持久性。请求-响应模型下请求要么送达、要么失败客户端断线期间的请求根本不会被服务器记住服务端也无从向离线客户端主动推送消息。要实现云→设备的下行指令HTTP/HTTPS 只能靠设备轮询polling拉取这既增加延迟也增加功耗。MQTT 天然支持下行推送。设备与 broker 的长连接使云端可随时向设备发布命令retained 消息还能让离线后重连的设备立即获得最新状态。课程中夜灯的命令控制/commands主题就是这种云→设备推送的直接体现。若必须用 HTTP/HTTPS 实现类似效果应用层需要额外的消息暂存设备轮询拉取机制。对比结论可直接用于作业仅需设备向云单向上报、频率低、且应用层可容忍失败重试时HTTP/HTTPS 简单直接且安全默认开箱即用需要双向实时通信遥测上行 命令下行、低功耗长连接、以及断连重连后的状态同步时MQTT 明显更优。三协议综合对比速查表下表汇总三个维度上的对比结论可直接作为作业的结论性材料对比维度MQTTAMQPHTTP/HTTPS通信模型发布/订阅broker 路由主题寻址发布/订阅 消息队列交换器/路由键请求/响应HTTPS 即加密版 HTTP功耗极低报文头小、长连接、保活开销小较高帧与握手开销大中等到高报文头大、轮询/频繁建连耗电安全支持 TLS、用户名/密码、证书但需显式配置支持 TLS、SASL 认证企业级身份集成HTTPS 默认 TLS 加密生态认证体系成熟断连持久性原生无队列可借 retained 消息保留最新一条应用层可自行补发原生消息队列 持久化 确认断线消息可保留无服务端持久性下行需轮询断线数据由应用层负责典型适用电池供电传感器、MCU 设备、双向遥测/命令企业集成、金融/物流等强可靠性消息系统上报型设备、Web 生态对接、低频数据三个维度的分析要点如何展开你的对比论证为了让作业回答达到优秀档覆盖全部三个维度建议按照以下要点组织论证功耗结合设备是什么来分析——MCU如 Wio Terminal内存与供电极其有限必须选择报文开销最小的协议单板机如 Raspberry Pi或常供电设备约束较小。同时考虑上报频率高频上报下 MQTT 长连接优势明显极低频上报下 HTTP/HTTPS 也未必不可接受。安全明确区分默认状态与可配置能力。MQTT 明文 1883 端口与公共 broker 是不安全的默认配置HTTPS 默认加密是开箱即安全。指出课程 README.md 对公共 broker 的警告论证任何协议的公共端点都不可用于敏感数据。断连消息持久性引用课程关于连接丢失的讨论README.md 的 Loss of connectivity 小节温控器可以丢弃旧读数新读数覆盖旧值而工业机械的遥测数据需要全部保留用于异常检测与预测性维护。据此说明需要全部消息不丢选 AMQP 原生队列需要最新状态不丢用 MQTT retained 消息HTTP/HTTPS 则完全依赖应用层自行实现。结合仓库源码的延伸阅读完整课程内容含协议理论、遥测、命令与挑战题1-getting-started/lessons/4-connect-internet/README.md服务端订阅遥测并打印消息基础版1-getting-started/lessons/4-connect-internet/code-server/server/app.py服务端决策并下发led_on命令完整闭环1-getting-started/lessons/4-connect-internet/code-commands/server/app.py虚拟设备发布遥测MQTT 连接基础版1-getting-started/lessons/4-connect-internet/code-mqtt/virtual-device/nightlight/app.py虚拟设备订阅命令并控制 LED 1-getting-started/lessons/4-connect-internet/code-commands/virtual-device/nightlight/app.pyWio Terminal 设备端 C 实现发布遥测 订阅命令1-getting-started/lessons/4-connect-internet/code-commands/wio-terminal/nightlight/src/main.cppWio Terminal 的 MQTT 主题与 broker 配置1-getting-started/lessons/4-connect-internet/code-commands/wio-terminal/nightlight/src/config.h课程配套图形笔记第四课速记图sketchnotes/lesson-4.jpg参考实现提示若想自己动手验证断连持久性这一维度可尝试按 README.md 结尾的建议用 Mosquitto 自建本地 broker默认禁止匿名连接且不允许外部访问可在mosquitto.conf中配置listener 1883 0.0.0.0与allow_anonymous true放开再分别测试 MQTT retained 消息与 AMQP 持久队列在客户端断线重连后的行为差异。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表