ARTICLE DETAIL

资讯详情

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

MQTT从入门到实战:Windows搭建与485设备接入指南

MQTT从入门到实战:Windows搭建与485设备接入指南 1. 先弄明白MQTT的底层逻辑它凭什么成为物联网事实标准做物联网项目做得久了你会发现一个很有意思的现象不管是做智能家居、工业数据采集还是做智慧农业、车联网大家最后都会不约而同地选MQTT来跑业务消息。我在几个项目里试过HTTP轮询、TCP长连接自研协议、甚至直接拿WebSocket硬顶兜兜转转一圈下来最后还是回到MQTT。原因不复杂它解决的是物联网场景里最痛的那几个问题设备网络不稳定、设备数量多、消息量小但频繁、有的消息丢了也不行有的消息丢了也无所谓。1.1 发布/订阅模型通信不再是一对一的直连MQTT全称Message Queuing Telemetry Transport消息队列遥测传输。名字里带遥测两个字就知道它一开始就是为远程数据采集设计的。1999年IBM出的协议最初用在石油管道卫星通信上那个场景里带宽贵、网络差、数据要省着传所以协议本身就做得非常克制——报文头最小只有2个字节一个PUBLISH消息的固定头部压缩到极致这对嵌入式设备来说简直是救星。它和传统HTTP最大的区别在于通信模型。HTTP是请求-响应模式客户端问一次、服务器答一次设备得知道服务器的地址主动去连。MQTT则是发布/订阅模式所有的消息都通过一个中间人——Broker消息代理服务器来转发。发送消息的人Publisher不关心谁在听接收消息的人Subscriber也不关心消息是谁发的双方只和Broker打交道。我用一个比喻帮你理解MQTT的Broker就像一个公告板。你想把设备温度告诉所有人就把写着温度的字条贴到公告板上谁想看谁自己来读。不需要知道读的人是谁也不需要等对方确认收到了。而HTTP就像打电话你得知道对方的号码拨过去一句一句对话。这个模型解决了物联网里一个很实际的痛点设备和服务器之间到底谁先找谁如果设备在内网没有公网IP服务器想主动连设备是做不到的。HTTP轮询倒是可以让设备主动问但设备多了以后效率极低而且实时性差。MQTT让设备主动去连Broker建立起一条长期维持的TCP通道然后这条通道双向都能走消息——服务器想给设备下发指令直接往对应的Topic上发消息Broker就推给设备了。设备端的NAT、防火墙问题全部绕开这是MQTT在物联网里能被大规模采用的底层原因。1.2 QoS等级一条消息三种活法MQTT定义了三个QoSQuality of Service服务质量等级对应消息从发送端到接收端三种不同的保障级别。这是协议里最容易让新手困惑的地方也是实际开发中踩坑最多的地方。QoS 0至多一次发出去就不管了不确认、不重发。消息可能丢适合丢一条也无所谓的数据比如周期性上报的温度、湿度。QoS 1至少一次发送端发出消息后等Broker回一个PUBACK确认包等不到就重发。能保证消息到达但可能重复。适合命令下发场景丢指令的后果比重复执行严重得多。QoS 2恰好一次通过四步握手协议PUBLISH→PUBREC→PUBREL→PUBCOMP保证消息既不丢也不重。代价是报文交互翻倍吞吐量降得厉害适合计费、订单这类要求严格不重复的业务。很多初学者一上来就全部用QoS 2觉得越可靠越好这是典型的过度设计。物联网设备普遍算力有限、网络带宽有限消息量大时QoS 2的握手开销能把Broker拖垮。我的习惯是设备遥测数据用QoS 0或QoS 1命令下发用QoS 1真正涉及资金和状态机切换的才用QoS 2。你可以在开发环境里用QoS 2测试生产环境按业务场景降级这个后面实战部分我会再细说。1.3 主题Topic设计消息的路由规则Topic是MQTT消息的路由地址结构上类似文件系统的路径用斜杠分隔层级比如factory/zone1/device001/temperature。它不像HTTP有URL那么强的语义Topic对Broker来说就是一个字符串匹配规则但设计得好不好直接决定你后面业务开发是丝滑还是痛苦。Topic支持通配符这是它路由能力的核心factory//device001/temperature单层通配匹配factory/任何内容/device001/temperaturefactory/zone1/#多层通配匹配factory/zone1/下面的所有层级我在多个项目里总结了一套比较稳的Topic命名规范你可以直接参考Topic类型命名示例用途遥测数据dev/{deviceId}/telemetry设备周期性上报的测量值事件上报dev/{deviceId}/event告警、开关门、故障等事件命令下发dev/{deviceId}/cmd服务器或上位机下发的指令指令响应dev/{deviceId}/resp设备执行指令后返回的结果这套规范的好处是设备ID固定消息类型清晰权限控制好做后续加新设备类型也不用改结构。还有一点经验是Topic层级不要超过四层太深了影响Broker匹配性能而且在通配符订阅时容易出幺蛾子。2. Windows下搭建MQTT服务器从装包到跑通的完整过程热词里很多人搜windows安装mqtt安装包可见Windows环境是开发者接触MQTT的第一站。我最初也是在Windows上搭的开发环境不做生产服务器图的就是方便、能快速验证业务逻辑。这里我把两个主流Broker的搭建过程都讲一遍你可以按需选择。2.1 选型对比EMQX还是Mosquitto我个人推荐的组合是本地开发用Mosquitto功能验证和压测用EMQX。两者的定位差异很明显。Mosquitto是Eclipse基金会出的轻量BrokerC语言写的安装包才几MB资源占用极低一台树莓派都能跑。功能相对基础但MQTT 3.1.1和5.0都支持基本的用户名密码鉴权、TLS加密、WebSocket监听都有。它最大的短板是管理界面官方不带图形化控制台调试的时候得靠命令行工具mosquitto_sub和mosquitto_pub或者借助第三方可视化工具。EMQX是国产开源Broker里国际影响力最大的一个Erlang语言写的天生擅长处理高并发连接。单机百万级连接对它来说是小意思而且自带一个完整的Dashboard控制台在线连接数、消息吞吐、订阅关系全部可视化还内置了规则引擎消息进来可以直接转发到数据库或HTTP服务。缺点是安装包大Windows安装包两三百MB内存占用相对高跑在开发机上有点杀鸡用牛刀。如果你是刚开始学MQTT先装Mosquitto如果你在给真实项目选型直接上EMQX省得后期迁移。2.2 Mosquitto的安装与基础配置Mosquitto在Windows上的安装已经很友好了从官网或GitHub Release页下载exe安装包一路Next就能装完。装完之后它不是以服务方式自动启动的需要手动跑一下或者注册成Windows服务。我用最直接的命令行方式演示# 进入安装目录 cd C:\Program Files\mosquitto # 前台方式启动使用默认配置默认监听1883端口 mosquitto -v看到Starting mosquito version x.x.x和Opening ipv4 listen socket on port 1883这两行说明Broker已经起来了。此时打开另一个命令行窗口用自带的命令行客户端验证一下# 订阅一个主题 mosquitto_sub -t test/topic -v # 新开一个窗口发布消息 mosquitto_pub -t test/topic -m hello mqtt如果你在订阅窗口能看到hello mqtt恭喜你的MQTT服务器已经跑通了。需要说明的是mosquitto -v启动的是前台进程窗口一关服务就没了。要长期运行建议注册成服务mosquitto install net start mosquittoMosquitto的配置文件在安装目录下的mosquitto.conf几个常用的配置项我给你列出来配置项取值示例作用port1883默认MQTT监听端口明文传输allow_anonymousfalse禁止匿名连接生产环境必须关掉password_fileC:/mosquitto/pwfile用户名密码文件路径listener 8883-开启TLS加密端口生产环境推荐顺便提醒一句1883端口是MQTT的默认端口明文传输。这意味着消息在网络上是裸奔的只要能抓包就能看到内容。生产环境务必配置TLS加密8883端口或者至少做好网络隔离。2.3 EMQX的安装与Dashboard使用EMQX从5.0开始Windows安装包已经非常成熟到官网下载Windows zip包解压后进入目录执行bin\emqx start启动成功后浏览器打开http://localhost:18083默认用户名admin密码public登录后就能看到Dashboard。这里你可以直观地看到Broker的运行状态包括当前连接数、消息收发速率、订阅主题数量。Dashboard里我用的最多的是两个功能。一是主题订阅页面可以模拟一个客户端去订阅任意Topic查看实时消息流二是规则引擎可以把指定Topic的消息直接桥接到MySQL、Kafka或者Webhook。之前做工业数据采集项目我就是用EMQX规则引擎把设备遥测数据实时转发到Kafka后端数据服务直接从Kafka消费完全不用自己写数据接入层。Windows上跑EMQX做开发没问题但生产环境我强烈建议部署到Linux服务器上性能和稳定性都不是一个量级。3. 订阅与发布实战把这套消息模型跑起来服务器搭好了接下来要解决的是实际开发问题。热词里mqtt订阅与发布消息被搜的次数很多可见很多人卡在客户端开发这一步。我把开发工具和写代码两个层面都讲清楚。3.1 用MQTTX快速打通全链路写代码之前强烈建议先用一款图形化客户端把全链路跑通。我用的是MQTTX跨平台免费界面清爽最关键的它同时支持Web端和桌面端可以在两台设备上各开一个客户端模拟真实的发布订阅场景。MQTTX里新建连接时只需要填三样东西Broker地址比如mqtt://localhost:1883、客户端ID每个连接必须唯一我习惯用mqttx_前缀加随机串、用户名密码如果Broker开了鉴权。连接成功后左边添加订阅输入Topic名称和QoS等级右边输入要发送的Topic和Payload点发送就能在订阅窗口看到消息。用MQTTX做联调有一个好处它能非常直观地展示消息的收发时序和QoS确认过程。调QoS 1和QoS 2时你可以在消息日志里看到完整的PUBACK、PUBREC、PUBREL、PUBCOMP报文交互记录。我的调试习惯是先在MQTTX里验证协议行为确认无误后再对着写业务代码能省掉一半的排查时间。3.2 Python客户端订阅与发布的最小实现Python下用paho-mqtt库这是在物联网开发社区里最主流的MQTT客户端库没有之一。装好之后一个完整的订阅加发布代码如下import paho.mqtt.client as mqtt BROKER_ADDR localhost BROKER_PORT 1883 CLIENT_ID python_demo_001 # 连接回调 def on_connect(client, userdata, flags, reason_code, propertiesNone): if reason_code 0: print(连接成功) client.subscribe(dev/001/telemetry, qos1) else: print(f连接失败错误码: {reason_code}) # 消息回调 def on_message(client, userdata, msg): print(f收到主题: {msg.topic}, 消息: {msg.payload.decode()}) client mqtt.Client(client_idCLIENT_ID, protocolmqtt.MQTTv311) client.username_pw_set(iot_user, iot_pass) client.on_connect on_connect client.on_message on_message client.connect(BROKER_ADDR, BROKER_PORT, keepalive60) client.loop_forever()这段代码的逻辑很简单连接Broker连接成功后订阅dev/001/telemetry这个主题收到消息就打印出来。你要发布消息只需要调用一行接口client.publish(dev/001/telemetry, {temp: 26.5, humidity: 60}, qos1)publish方法的第一个参数是主题第二个是消息内容第三个是QoS等级。注意publish是异步的它会立即返回一个MQTTMessageInfo对象真正的发送是在后台事件循环里完成的。这里的client.loop_forever()是阻塞式的消息循环适合脚本程序。如果你的程序同时还要做别的事情比如处理串口数据改用client.loop_start()启动一个后台线程处理网络消息。这个区别看似小实际项目里掉了好多坑。3.3 QoS和Retained消息要在什么场景用网上很多教程把QoS讲得很玄乎其实选型逻辑非常朴素。QoS 0适合高频遥测比如温湿度传感器每5秒上报一次丢一帧根本无所谓QoS 1适合大部分场景特别是指令下发宁可重复也不能丢QoS 2用得极少除非消息内容会触发资金变动、状态机强一致切换这类业务。还有一个很容易被忽略的功能是Retained消息保留消息。发布消息时可以设置retainTrueBroker会把这条消息存起来之后任何客户端订阅这个主题都会立刻收到最新一条保留消息。这个特性在设备状态同步场景下极其好用。比如网关程序上线后往dev/{deviceId}/status发一条online的保留消息任何新的订阅者一上来就知道当前设备在线不需要等下一次心跳上报。有一类典型的需求是新客户端连上来我要立刻知道当前设备状态用普通发布消息做不到——客户端来晚了消息已经发过了。Retained消息就是为了解决这个问题设计的。我自己在设备管理项目里就是这样用的设备上下线状态、最近一次仪表读数全部用retainTrue发布管理端刷新列表时直接缓存命中体验好到飞起。4. 把MQTT接到485设备上指令下发与数据上云的完整链路mqtt如何给485设备发指令这个热词搜的人特别多说明这是一个既有代表性和含金量的实战场景。RS485是工业现场最常用的总线标准电表、水表、温控器、变频器、各种传感器出厂基本都带RS485接口。而这些设备本身没有网络功能更不会说MQTT要让它们接入物联网平台必须有一层转换。4.1 485设备为什么需要MQTT这张皮RS485是一种串行通信标准半双工最远传输距离1200米左右一条总线上可以挂128个设备。它的通信方式是主从问答式主站通常是PLC、工控机或电脑发一条指令报文从站设备响应一问一答协议层面常见的是Modbus RTU。主站发什么、从站回什么全部是按字节组织的十六进制数据帧。问题来了RS485走的是串口数据只能在物理连线的设备之间传递。你要在千里之外的办公室里看电表读数或者远程控制车间的阀门需要把485总线和互联网打通。MQTT在这里扮演的角色就是物联网的消息总线——485设备的数据先被本地网关采集到网关把十六进制帧解析成JSON格式再通过MQTT发布到Broker的Topic上服务器要下发指令也是往Topic上发一条JSON指令网关订阅到之后转换成Modbus报文从485串口发出去。整个链路可以概括成三层物理接入层RS485总线上的设备通过USB转485、串口服务器或网关接入本地计算设备协议转换层边缘网关负责Modbus RTU协议和MQTT消息之间的翻译云端平台层Broker负责消息路由应用端通过Topic订阅/发布完成业务逻辑这里最关键的是第2层协议转换的处理质量直接决定了整个系统的稳定性和响应速度。第一次做485接入MQTT的朋友最容易犯的错是直接把原始的十六进制报文原封不动地发到MQTT上去让云端去解析。这样做不是完全不行但会把协议解析的压力全部压到应用端而且Modbus的功能码、寄存器地址、CRC校验这些细节暴露在业务链路上后续维护非常痛苦。我的经验是概念上要让MQTT消息贴近业务语义而不是贴近串口报文的物理表示。网关向上发布的时候已经把寄存器地址翻译成了业务字段。比如电表的电压你最终看到的是一条JSON消息{ deviceId: meter_001, type: voltage, value: 220.5, timestamp: 1711417200 }而不是一行01 03 02 08 A1这样的原始报文。4.2 硬件选型三种常见的485转MQTT网关方案把485设备接入MQTT市面上有现成的硬件方案也有自己写软件的自研方案我按适配场景把它们分类说明。方案一硬件串口服务器直连MQTT这是最省事的方式。有些厂商比如有人物联网、四信的串口服务器/工业网关固件里直接内置了MQTT功能你只需要在网页配置界面里填上串口波特率比如9600、数据位8、校验位无、停止位1、目标Broker地址、设备Topic、心跳间隔它就会把串口收到的数据帧原封不动地推到MQTT上去。这种方案适合快速验证但要注意设备发上来的原始Modbus报文不会自动解析你拿到的是十六进制字符串需要在云端自行解析。方案二边缘网关/边缘计算盒子做协议转换针对有解析需求的项目方案是选一个边缘网关树莓派、工控机、Jetson都可以在边缘节点上跑一个协议转换程序。这个程序向下通过串口收发Modbus报文向上发布解析好的JSON到MQTT Broker。这样做的好处一是数据在边缘侧已经清洗好了云端的逻辑简单二是网关本身可以做本地缓存、断网自动重发三是可以在边缘直接执行本地联动逻辑比如超限报警不必等云端决策。方案三DTU透传Bridge桥接现有的Modbus网关不支持MQTT但支持TCP Client模式即DTU。你可以在Broker所在服务器上跑一个桥接程序这个程序同时作为TCP Server接收DTU的透传数据再用MQTT客户端把数据转发到Broker。本质是让普通的DTU也能间接接入MQTT。这个方案成本低但稳定性依赖中间桥接进程适合场景有限、预算有限的小规模项目。4.3 软件实现网关程序的核心逻辑示例我以一个比较典型的场景为例一台RS485电表用的是Modbus RTU协议通过USB转485接到一台Linux工控机上要求把电表的电压、电流、功率数据通过MQTT定时上报到云端同时支持远程下发命令读取某个特定寄存器。先解释一下Modbus RTU报文是怎么构成的。以读保持寄存器为例从站地址1字节比如01代表1号设备功能码1字节03代表读保持寄存器06代表写单个寄存器10代表写多个寄存器起始寄存器地址2字节寄存器数量2字节CRC校验2字节低字节在前所以读1号从站、起始寄存器地址0、读2个寄存器的原始报文是01 03 00 00 00 02 C4 0B在Python里用pyserial库发送这段报文然后接收响应。完整的网关核心代码大概是import serial import json import time import paho.mqtt.client as mqtt SERIAL_PORT /dev/ttyUSB0 BAUD_RATE 9600 BROKER_ADDR 192.168.1.100 BROKER_PORT 1883 def build_modbus_read_frame(slave_id, func_code, start_addr, quantity): frame bytearray() frame.append(slave_id) frame.append(func_code) frame.extend(start_addr.to_bytes(2, byteorderbig)) frame.extend(quantity.to_bytes(2, byteorderbig)) crc calc_crc(frame) frame.extend(crc.to_bytes(2, byteorderlittle)) return frame def calc_crc(data): crc 0xFFFF for b in data: crc ^ b for _ in range(8): if crc 0x0001: crc (crc 1) ^ 0xA001 else: crc 1 return crc # 初始化串口 ser serial.Serial(SERIAL_PORT, BAUD_RATE, timeout1) # 初始化MQTT客户端 client mqtt.Client(client_idgateway_485) client.username_pw_set(gw_user, gw_pass) client.connect(BROKER_ADDR, BROKER_PORT, keepalive60) client.loop_start() # 读取Modbus数据并发布到MQTT def poll_and_publish(): frame build_modbus_read_frame(1, 3, 0, 2) # 读1号设备0寄存器2个量 ser.write(frame) resp ser.read(7 2 * 2) # 7字节响应头 2寄存器*2字节 2字节CRC # 这里需要完整解析响应帧并换算成实际电压/电流值 payload {deviceId: meter_001, voltage: 220.5, current: 1.32} client.publish(dev/meter_001/telemetry, json.dumps(payload), qos1) while True: poll_and_publish() time.sleep(10)这只是个演示用的骨架代码实际项目里你需要处理的事情包括Modbus响应帧的超时重试、数据异常值过滤、CRC校验失败丢弃、多个从站设备轮询调度。这些逻辑如果放在循环里全凭经验写很容易出问题。我第5章里会专门讲几个坑。4.4 完整演示远程下发指令到485设备并取回结果再来演示一个更完整的指令往返流程这个流程基本覆盖了给485设备发指令的全部链路。场景云端服务器的某个业务系统要读取485电表上的某个寄存器地址让它返回数据。第一步业务系统往命令主题发布一条指令消息client.publish( dev/meter_001/cmd, json.dumps({ cmd: read_register, slave_id: 1, func_code: 3, start_addr: 2, quantity: 2 }), qos1 )第二步网关程序通过MQTT订阅到这条指令解析消息组装Modbus帧通过串口发给485设备def on_cmd_message(client, userdata, msg): cmd json.loads(msg.payload.decode()) if cmd.get(cmd) read_register: frame build_modbus_read_frame( cmd[slave_id], cmd[func_code], cmd[start_addr], cmd[quantity] ) ser.write(frame) resp ser.read(7 cmd[quantity] * 2) # 解析寄存器值并发布到响应主题 parsed parse_modbus_response(resp) client.publish( dev/meter_001/resp, json.dumps({request_id: cmd.get(request_id), data: parsed}), qos1 )第三步云端业务系统订阅响应主题拿到结果。整个流程在1秒内完成。这套cmd下发→网关执行→resp响应的消息结构你几乎可以套用到任何485设备上。指令是Modbus读还是写、是单个还是多个寄存器都只是Instruction Payload字段的变化消息骨架不用动。我用这套方案接了电表、温控器、阀门执行器多种设备全部一套逻辑跑通。5. 实践中的坑和优化经验5.1 消息洪峰与QoS降级别让可靠性拖垮Broker我最开始做MQTT接入的时候设备侧全部用QoS 1上报觉得这样最稳。结果设备数量一上千Broker的CPU和带宽占用直线飙升1883端口的消息吞吐出现明显瓶颈。后来分析才明白QoS 1每一次消息送达都要多一次PUBACK往返消息量翻了将近一倍换成QoS 2更是翻了四倍。这里我的建议是遥测类的数据如果业务上允许丢失少量点就用QoS 0如果担心偶发丢包可以在应用层做序列号检查发现有空洞就主动重发比全局QoS 1高效得多。对于指令类消息QoS 1是底线且一定要设计指令的幂等性——也就是说重复收到同一条指令也不能产生副作用比如开阀门指令设计成设置阀门开度为80而不是切换阀门开关状态。这样即使消息重复了执行的结果也是一样的。5.2 心跳、保活和断线重连的机制配合MQTT连接的本质是TCP长连接但TCP连接是会假死的——网线被拔、设备睡眠、网络切换这些情况下TCP层面可能感知不到连接已经失效。MQTT的解决方案是keepalive机制客户端每隔interval秒发一个PINGREQ包给BrokerBroker在1.5倍interval时间内没有收到任何包就把这个连接断开。客户端里的keepalive参数就是这个interval默认60秒。很多设备放在信号不稳定的环境里60秒已经偏长了。我的习惯是根据场景设到20-30秒太短又会在弱网环境下造成频繁断连需要找平衡点。断线重连是另一个很重要的机制。客户端因为网络抖动连不上Broker了不能退出要按退避策略逐步重连。paho-mqtt库有一个reconnect_delay_set方法可以设置最小和最大重连延迟但这只是基础退避真实场景我还会结合连接状态回调做本地缓存。设备侧的逻辑可以是连接正常时数据实时发送连接断开时数据落本地缓存内存队列或SQLite重连成功后按时间顺序补发缓存里的数据这套逻辑在网关程序里非常实用尤其是在485转MQTT的场景串口数据本来就来自真实的物理设备丢了就再也补不回来所以本地缓存是保数据完整性的关键手段。5.3 主题权限最小化与多租户隔离当你的Broker上不止一个客户端时权限控制就是刚需了。EMQX和Mosquitto都支持ACLAccess Control List规则可以限制某个用户名能订阅和发布哪些Topic。这个必须从项目第一天就设计好否则后面设备越来越多权限只能一刀切安全隐患非常大。一个常见的权限设计模式是设备端证书/账号只能发布dev/{deviceId}/telemetry和dev/{deviceId}/event只能订阅dev/{deviceId}/cmd应用端账号可以订阅所有dev/#但只能发布dev/{deviceId}/cmd管理后台账号可以订阅$SYS/#Broker系统主题监控整体运行状态这么做的好处是即使设备的账号泄露攻击者也只能操控这一台设备无法干扰其他设备的数据流。5.4 Broker的$SYS主题值得你多看一眼很多初学者不知道EMQX和Mosquitto都有以$SYS开头的系统主题里面发布的是Broker自己的运行指标。比如订阅$SYS/broker/load/publish/received你就可以实时看到Broker每秒收到多少条消息。我自己做项目排查的第一步永远是去Dashboard或者$SYS主题看一眼设备和消息量确认不是Broker层面的瓶颈再往下逐层排查。生产环境运维MQTT我建议至少要积累这些指标当前连接数、消息发布速率、订阅总数、在线设备数、带宽占用。EMQX的Dashboard已经把这些都可视化了但如果你用的是Mosquitto需要自己定时去捞$SYS主题做记录。6. 最后再说一句关于MQTT版本的选择MQTT有两个主版本MQTT 3.1.1和MQTT 5.0。新项目选型时到底用哪个我的建议是如果没有特殊需求直接选MQTT 5.0。3.1.1是2014年发布的版本稳定、普及率高几乎所有物联网平台都支持。5.0在2019年发布并没有大改协议本身的发布订阅模型而是增加了会话过期时间、订阅标识符、用户属性、消息过期时间、请求响应机制这些锦上添花的能力。5.0里我最喜欢的一个特性是消息过期时间Message Expiry Interval。它允许一条消息在指定时间内没有消费者读取就自动丢弃非常适合指令类业务——比如开灯指令如果设备离线30秒这条指令本来就没有意义了与其等设备上线后再执行不如让它过期作废。这在3.1.1里是做不到的。如果是刚开始学习MQTT3.1.1足够用了API跟5.0基本兼容学会了3.1.1再切5.0几乎没有学习成本。但如果是新项目从零开始建议直接按5.0设计毕竟协议本身的演进方向是明确的。我自己做过的几个项目里遇到过各种奇奇怪怪的问题——485设备收不到指令、MQTT消息堆积、断线重连风暴、Topic权限配错导致数据泄露每一个坑背后都有很具体的原因和排查思路。这个领域的知识体系其实不大核心就是协议机制、Broker配置、客户端开发、边缘网关转换这四块把这四块打通了任何物联网场景的MQTT应用都能拿得下来。
返回列表