副标题先 TCP再 CONNECT再业务KeepAlive 过长会让你发现断线太晚专栏《嵌入式学生的方案测试课》第 10 篇上云清单前置第 6 篇认 SYN第 8 篇能在热点拓扑抓到明文 MQTT 或本机 Mosquitto第 3 篇懂任务阻塞第 9 篇知道弱网证据可以是 RSSI 而不是空口标签嵌入式、MQTT、物联网、Wireshark、软件测试读者课程设计发过温度到云但说不清 CONNACK 返回码和重连后要不要重新订阅学完交什么手画状态图、KeepAlive 对比记录、6 步掉线检查单、一份「弱网丢命令」缺陷单主实验本机 Mosquitto MQTTX 网口抓包。有 Hi3861 / 能发 MQTT 的板就加上云错密钥对照。没有板本机实验仍算本篇及格报告写明「无设备侧」。0. 这篇结束你能干什么能手画TCP 三次握手 - MQTT CONNECT - CONNACK - SUBSCRIBE/PUBLISH - PINGREQ/PINGRESP - DISCONNECT / 异常 RST。缺任何一格都不能说「会 MQTT」。能说明 QoS 0/1/2 对设备上报意味着什么为何很多物联网上报用 QoS1为何不能把 QoS 当「越高质量越好」。能用农业终端的口吻讲KeepAlive 太长弱网断了很久云端还以为在太短弱网误踢。这是测试参数不是玄学。掉线时能按 6 步检查射频 - 关联 - IP - TCP - MQTT - 业务 JSON。一掉线就改主题名的作业作废。本篇抓包全部是网口。不要回头去第 9 篇找 CONNECT 的 Radiotap。1. 为什么上云是方案测试的日常却总被学生测成「发了一条」客户语言是应用层的「APP 看不到温度」「远程开灯没反应」「掉线」。课程设计语言也是应用层的连上华为 IoTDA / EMQX串口打印publish ok。方案测试要的是中间那些层是否可观察TCP 端口 1883 或 8883 通不通CONNECT 里 ClientId、Username、KeepAlive 填了什么CONNACK 返回码是 0 还是 4/5鉴权失败常见订阅是否在重连之后补上断 Wi-Fi 之后是 TCP 重传、MQTT 超时还是业务还在傻发云端命令在断线窗口里丢了重连后补不补农业终端那种「12 小时拷机、采集任务被 MQTT 堵住」的故事正确讲法是第 3 篇的阻塞加上本篇的会话。不是「我做过物联网」。HTTP 是短连接一次请求一次 TCP完了就拆。MQTT 是长连接TCP 挂在那里用 KeepAlive 探活用 PUBLISH 推送。测短连接看超时和状态码测长连接还要看发现断线的时间和重连后的状态机。2. 最小原理2.1 三个角色和三个不要混的词词是什么测试时问什么Broker中间的 MQTT 服务器Mosquitto、IoTDA、EMQX地址、端口、TLS、账号是否对Client设备或 MQTTXClientId 是否唯一、会不会互踢Topic主题路径不是 IP能否订阅、通配符、权限Payload载荷常常是 JSONJSON 对不对是第 11 篇本篇先问有没有 PUBLISH不要把 Topic 写成 URL。不要把 ClientId 当成密码。不要把「能 ping 通 broker 主机」当成 MQTT 已连接——那只到 IP 层最多到 TCP 还没做。2.2 状态图默写到能不看稿[Wi-Fi GOT IP] | v [TCP SYN, SYN-ACK, ACK] 第 6 篇端口 1883 明文 / 8883 TLS | v [TLS 握手] 若 8883失败则 Follow Stream 乱码且无 mqtt 过滤器 | v [MQTT CONNECT] ClientId / KeepAlive / 用户名密码或设备密钥 / Clean Session | v [MQTT CONNACK] Return Code 0 才算会话建立 非 0协议、ClientId、鉴权、未授权……先停在这里不要发业务 | -- SUBSCRIBE - SUBACK -- PUBLISH - (QoS1 还有 PUBACK) -- PINGREQ - PINGRESP 按 KeepAlive 周期 | -- 主动 DISCONNECT -- TCP FIN / RST 对端关了或中间设备踢了 -- 静默两边都以为还在 KeepAlive 发现之前的黑洞测试口诀没有 CONNACK0后面全是噪音。2.3 CONNECT 里方案测试必看的字段在 Wireshark 点开 MQTT CONNECT第 8 篇本机 Mosquitto 实验字段你要记录典型故障Protocol Version3.1.1 很常见版本和 broker 不一致直接被踢ClientId是否空、是否唯一两台设备同一 ClientId后上线踢先上线Keep Alive秒太长发现晚太短弱网误踢有的云平台有上下限Clean Session0/1影响重连后 broker 是否还记订阅和未发消息测重连必记Username / Password有没有带不要把真密钥贴博客错密钥常见 TCP 成功、CONNACK 非 0Will有无遗嘱拷机死机后云端能否收到离线产品有要求才测农业终端连 IoTDA设备密钥错往往已经完成 TCP甚至 TLS死在 CONNACK。学生却去改传感器 CRC。分层错了。2.4 CONNACK 返回码先记这些MQTT 3.1.1 常见码含义测试动作0接受才能测订阅和发布1协议版本不可接受对版本不要对密码2标识符被拒绝查 ClientId3服务器不可用查 broker 进程、配额4用户名或密码错误鉴权不是 Wi-Fi5未授权ACL / 产品策略MQTT 5 用 Reason Code更细。学生板和 IoTDA 仍大量是 3.1.1。缺陷单写「CONNACK rc4」不要写「连不上云」。2.5 KeepAlive 不是心跳灯KeepAlive N 秒客户端应在 N 秒内有控制报文没有业务就发 PINGREQ。Broker 通常等 1.5N 还没动静就认为死了拆连接。两个测试结论必须亲手做出来步骤在第 4 节N 很大例如 300s你拔网线后云端可能 5 分钟还显示在线。远程命令在这窗口里丢失。农业终端如果 10 分钟才发现断线大棚阀门指令已经晚了。N 很小例如 10s且网络抖动PING 丢两次就被踢重连风暴CPU 和日志都被重连占满第 3 篇阻塞会叠加。产品要在「发现够快」和「别误踢」之间取数。方案测试的工作是测出这条曲线不是替产品经理拍脑袋。2.6 QoS设备上报常用 1不是 2QoS保证开销设备侧典型0最多一次发完不管最低频繁、可丢的遥测1至少一次有 PUBACK中上报、命令可接受重复2恰好一次四步握手高嵌入式少用超时和状态机复杂测 QoS1 必须故意制造重复断在 PUBLISH 已发出、PUBACK 未回。重连后设备若再发云端应幂等同一阀门不要切两次。测的是产品和云不是 MQTT 规范背诵。QoS 不跨过断线自动补齐一切。会话、离线队列、retain、Clean Session 搅在一起。本篇作业只要求你能指出「这次是 QoS0 丢了还是 QoS1 没等到 PUBACK」。2.7 重连后必须重新订阅Clean Session1很常见重连是新会话旧订阅没了。设备若只在第一次SUBSCRIBE掉线重连后看起来「已连接」却收不到云端命令。这是上云缺陷里的常客。测试方法订阅命令主题断网或杀客户端等重连 CONNACK0在设备再发 SUBSCRIBE 之前从云端推一条看丢不丢再看设备补订阅之后是否恢复缺陷单分层MQTT 会话不是射频。2.8 TLS 和明文8883 / TLS 下Wireshark 过滤器mqtt常常为空Protocol 是 TLSv1.2。第 8 篇已经警告 Follow Stream 乱码不是芯片坏了。测试策略实验室允许明文 1883用它看字段产品强制 TLS用串口日志、broker 侧日志、或可注入的测试证书不要为了抓包关闭产品安全当量产结论IoTDA 一类平台通常是 TLS 设备密钥。学生没有板时用 Mosquitto 明文把字段练会再到板上只核对「错密钥停在 CONNACK」。3. 掉线 6 步检查单贴工位本篇作业要默写1 射频 RSSI / 扫得到吗 / 天线 2 关联 CONNECTED 还在吗 / AP 列表还有设备吗 3 IP GOT IP 还在吗 / ping 网关 / DHCP 租约 4 TCP 还有没有重传、RST、FIN端口对不对 5 MQTT 最后一次 PING/PUBLISH 距今多久CONNACK 是否曾非 0 6 业务 JSON、主题、云端鉴权、UI 状态每一步只问「这一层的合格证据还在不在」。第 1 步死了不要在第 6 步改字段名。第 4 步 SYN 都没有不要猜 QoS。农业终端口述示例「弱网后 APP 丢命令。串口 RSSI -84仍有 GOT IP。热点抓包看到 TCP retransmission随后没有 PING70 秒后新的 SYN 和 CONNECT。KeepAlive 60s发现时间和协议相符。先优化发现时间或本地缓存命令不先改土壤湿度 JSON。」4. 手把手实验4.1 本机 Broker MQTTX必做安装 Mosquitto监听127.0.0.1:1883允许匿名仅本机实验。不要把匿名 broker 暴露到公网。安装 MQTTX或任意客户端。连接127.0.0.1:1883ClientId 填lab-pc-01KeepAlive 先 60。Wireshark 选 loopback / Adapter for loopback。过滤器mqtt || tcp.port1883。点连接。你现在应看到TCP 三次握手然后 MQTT CONNECT然后 CONNACK rc0。点开 CONNECT抄ClientId、KeepAlive、Clean Session、有无用户名。截图打码后存labs/week10/connect-fields.png。订阅lab/cmd再向lab/cmd发{led:1}。应看到 SUBSCRIBE/SUBACK、PUBLISH。QoS1 时还有 PUBACK。没有这一组截图后面 KeepAlive 实验没有基线。4.2 杀掉客户端看 broker 何时判死KeepAlive60连接成功不要发业务只等 PING。过滤器mqtt.msgtype 12 || mqtt.msgtype 13PINGREQ12PINGRESP13若版本不同就在列表里找 Ping。确认有心跳。在 MQTTX直接杀进程或拔掉客户端网卡本机可结束 MQTTX。看 Wireshark是否还有 PINGTCP 是否 FIN/RSTMosquitto 日志何时打印 disconnected。记录最后一次 PING 时刻 T0broker 判死时刻 T1差值。期望量级大约 1 到 1.5 个 KeepAlive而不是立刻。立刻断开的是你杀 TCP 了过了 5 分钟才断说明 KeepAlive 没按你想的工作检查是否有其他流量刷新了计时或客户端设置没生效。4.3 改 KeepAlive对比发现时间必做对照同一电脑只改这一个变量轮次KeepAlive杀客户端后 broker 日志/抓包判死约备注A20 s填你的秒数B60 sC300 s可以等到 5 分钟等不及就写「180s 仍在线实验中止」并注明环境表写本机 loopback非无线。结论只能外推到「发现时间随 KeepAlive 变」不能外推到大棚现场。把表存labs/week10/keepalive.md。这张表比再讲一遍「MQTT 很轻量」有用。4.4 错密码 / 错密钥应用层鉴权Mosquitto 若你开了密码文件用错密码连。期望TCP 成功CONNECT 发出CONNACK 非 0无 SUBSCRIBE。没有密码就用 MQTTX 连一个错误端口1884当对照那时可能停在 TCP连 CONNECT 都没有。两张图并排错端口只有 SYN 或 RST无 mqtt错密码有 mqtt CONNECT CONNACK 失败这就是第 5 篇「有 IP 上不了业务」的精细版同是应用失败TCP 层表现不同。4.5 板子侧有则做无则写计划Hi3861 农业终端或任何会 MQTT 的固件电脑开热点第 8 篇拓扑设备连热点broker 用电脑 IP:1883 明文测试固件或继续用云但接受 TLS 看不到明文。错密钥期望串口过了 Wi-Fi GOT IP抓包有 SYN有 TLS 或 CONNECTCONNACK 非 0 或 TLS alert。不要出现传感器错误。断 Wi-Fi拔天线或关热点。期望先看到 TCP retransmission网口串口 RSSI 变差或 disconnect在 KeepAlive 到期前云端可能仍显示在线。重连后订阅云端在设备重连瞬间发命令看丢不丢。ESP8266 纯透传用ATCIPSTARTTCP,broker,1883只能证明 TCP。那不是 MQTT 测试报告写「模组停在传输层MQTT 在主控」。AT32ESP8266 天气项目走 HTTP 的本篇用本机 MQTT 及格HTTP 放到第 11 篇。4.6 和任务阻塞叠一次有 RTOS 板第 3 篇采集任务被同步 MQTT publish 堵住。本篇补一句测试弱网下 publish 阻塞 5 秒采集周期 1 秒看采样是否中断。缺陷单可以同时写「应用任务模型」和「MQTT 同步发送」。不要拆成两个互锅的单而又不交叉引用。5. 缺陷单范文标题【MQTT】KeepAlive300s弱网掉线后云端命令丢失设备 4 分多钟仍显示在线 严重级别主要 环境 设备Hi3861 农业终端工程或写本机 MQTTX 模拟并注明非设备 固件版本____ AP电脑热点 lab-ap-01设备 RSSI 基线 -50 Broker本机 Mosquitto 1883 / 或 IoTDA 地址打码 KeepAlive300 捕获网口 pcap热点网卡非空口 前置CONNACK rc0已订阅 cmd 主题QoS1 步骤 1. 从云端发 led1设备响应基线 2. 关闭热点 10s 内从云端再发 led0 3. 观察云端在线状态、pcap、串口 期望掉线后 1 分钟内云端显示离线或命令有失败回执重连后状态可对账 实际 T0 关热点 T8s 网口出现 TCP retransmission T12s 串口 Wi-Fi disconnect T20s 云端仍在线命令无 ACK T260s 新的 TCP SYN CONNECT 期间 led0 丢失设备重连后灯仍亮 附件retrans.pngconnect-fields.pngKeepAlive300uart.txt 初步分层MQTT 发现断线过晚 业务无离线命令队列。射频仅作为注入关热点不是根因。不合格版「弱网 MQTT 不行芯片差」。6. 换成泰芯公开场景会怎么变SoC 方案同样走 lwIP MQTT/HTTP。公开 FPV 文档的检查单可以直接当本篇第 3 节的原厂版分别确认关联、DHCP、默认网卡、网关、DNS、SNTP/TLS 和应用鉴权。连接事件不等于 DHCP 完成。迁移公开事实本篇动作连接事件 ≠ DHCP没 IP 不测 MQTTTLS / 应用鉴权分开错密钥是鉴权证书失败是 TLSCPU1 未 ready 不解释业务启动日志先看 CoreSocket 发送阻塞导致 RTSP 无画MQTT 同步 publish 同样能堵任务第 3 篇AH 1.6 无模组 IP模组透传MQTT 在两边电脑或主控上抓AH 2.4 有 192.168.123.x可在网桥上抓 TCP仍不是空口不要在 AH 频段上测 Mosquitto。国内读者不做 HaLow 发射。7. 30 秒口径MQTT 是 TCP 上的长连接。先三次握手再 CONNECTCONNACK0 才算连上。掉线先看 Wi-Fi 和 IP再看 TCP 重传再看有没有 PING最后才看 JSON。KeepAlive 太长发现断线晚云端命令会丢。重连后要重新订阅。错密钥通常死在 CONNACK不是传感器。我抓的是网口不是空口。8. 作业labs/week10/ env.md state-machine.png # 手画状态图拍照 connect-fields.png # CONNECT 字段 connack-ok.png keepalive.md # 对照表 ping.png auth-fail.png # 错密码或错端口对照 six-steps.md # 6 步检查单用自己的话 bug-keepalive.md # 缺陷单 board.md # 有板写会话无板写「未做设备侧」验收状态图含 TCP 和 CONNACKKeepAlive 至少两档数字6 步里射频和 JSON 不在同一句里当根因。9. 自测题先闭卷ping 通 broker 主机能证明 MQTT 已连接吗CONNACK4 下一步查 Wi-Fi 还是密钥KeepAlive60broker 可能等多久才判死为什么重连后收不到命令先猜哪一条QoS1 保证不丢到什么程度过滤器mqtt为空一定没发 MQTT 吗HTTP 天气和 MQTT 上报在连接模型上差什么弱网丢命令为什么可以不是芯片射频问题ClientId 重复会怎样本篇作业能不能用第 8 篇同一 AP 拓扑抓设备 MQTT10. 学生常见翻车一掉线就改 JSON 字段。把 TLS 失败说成主题拼错。把 MQTT 两秒一包当打流打流是第 12 篇。简历写精通 MQTT 协议栈实际只调过一个云平台示例。Clean Session 没记重连问题无法回归。把 CONNACK 非 0 写成「模组 AT 错误」。KeepAlive 实验同时换了 broker 和客户端数字不能比。用空口 pcap 找 CONNECT。11. 下一篇预告第 11 篇《配网成功不等于产品可用错密码、坏 JSON、掉电回连和本地云端抢状态》。CONNECT 会了产品仍可能死在密码存进 Flash 了没有、坏 JSON 卡死 UI、本地按键和云端命令打架。那是业务测试不是再讲一遍协议。附录 A. 自测题参考答案不能。只到 IP最多证明主机活着。要 TCP 端口和 CONNACK。密钥/账号。Wi-Fi 已在 CONNECT 之前完成。常见约 1.5×6090 秒量级以实际 broker 为准要用实验填。没重新 SUBSCRIBE或会话/权限或命令发在离线窗口且无离线队列。至少一次可能重复不保证断线期间的离线存储那是 broker/会话配置。不一定。TLS、选错网卡、不是 1883 明文。HTTP 短连接MQTT 长连接 KeepAlive 订阅状态。发现过晚、无本地缓存、重连未订阅、TCP 死了 MQTT 没感知。射频只是注入。后上线踢先上线拷机像随机掉线。不能指望看见设备 MQTT。必须热点/网关拓扑或本机 loopback。附录 B. 公开资料TXW82x FPV已连接但不能联网的分层应用鉴权与 TLS 分开Socket 阻塞第 3 篇同步网络调用堵住采集第 6、8 篇TCP 与网口 MQTTMQTT 3.1.1 OASIS 规范CONNACK 码以你 broker 实际日志为准第 10 篇完12. 点击级CONNECT 字段你到底点哪里第 8 篇已经能让列表出现MQTT。本篇把树展开到能填缺陷单。过滤器输入mqtt回车。若空改tcp.port 1883。仍空选错网卡、TLS、或根本没连。找 Info 列含Connect Command的那一行单击。中间详情树展开MQ Telemetry Transport Protocol-Connect Command。你现在应看到类似Protocol Name: MQTT Version: 4 // 3.1.1 Connect Flags Clean Session: True User Name Flag / Password Flag Keep Alive: 60 Client ID: lab-pc-01 User Name: 有则展开截图打码下一行常是Connect Ack。展开看Return Code: 0。非 0 时 Wireshark 会用文字说 rejected。把数字抄进缺陷单不要只写「连不上」。Follow TCP Stream明文应看见可读的客户端 ID 碎片TLS 乱码则停改看串口。Windows 装 Mosquitto官网安装包勾 Service 或手动mosquitto -v -c mosquitto.conf。配置里listener 1883、allow_anonymous true仅本机实验。防火墙放行 1883。MQTTX 主机填127.0.0.1不是localhost的 IPv6 坑若连的是::1而你抓 IPv4 回环列表是空的。过滤器改tcp.port1883两边都看见再收窄。13. 报文类型速查测的时候对照 Info 列值名字你什么时候该看见看不见说明什么1CONNECTTCP 之后立刻停在 TCP端口、TLS、路由2CONNACKCONNECT 后 1 秒内broker 没回进程、ACL、防火墙单边3PUBLISH上报或命令连着但不发业务没跑或主题权限4PUBACKQoS1 发布后对端没确认会重发或堆积8/9SUBSCRIBE/SUBACK连上后立刻重连后缺失就是本篇经典缺陷12/13PINGREQ/PINGRESP空闲时按 KeepAlive长时间既无业务也无 PING客户端没按规范或连接已死两边还不知道14DISCONNECT正常下线没有它只有 RST异常断开不要背值要会在列表里认名字。作业从你的 pcap 数每种各几包写在msg-count.md。14. 农业终端把简历项目讲成测试故事时间轴下面数字是教学示例。你交作业必须换成自己串口里的秒。T0.0 AT/Wi-Fi 已 GOT IPRSSI -52近 T0.3 TCP SYN - SYN-ACK - ACK 1883 或 8883 T0.4 TLS 握手若 IoTDA T0.8 MQTT CONNECT ClientIdagri-xxxx KeepAlive60 T0.9 CONNACK rc0 T1.0 SUBSCRIBE cmd topic QoS1 T1.1 SUBACK T2.0 开始每 2s PUBLISH 土壤湿度 QoS1有 PUBACK错密钥注入只改密钥不拔天线T0.3 TCP 成功甚至 TLS 成功 T0.8 CONNECT 仍发出 T0.9 CONNACK rc4 或 5或 TLS alert 此后无 SUBSCRIBE 串口传感器仍在打印 —— 不要把锅给 CRC弱网注入走到 RSSI ~ -82KeepAlive300 的坏参数T0 云端显示在线灯可控 T10 关热点或走进电梯 T12 网口 retransmission串口 Wi-Fi disconnect T20 云端仍在线发现窗口 T25 云端下发关灯无 PUBACK灯仍亮 T260 新 SYN CONNECT未再 SUBSCRIBE 则此后命令全丢口述就按这条时间轴不要说「我做过物联网云平台」。15. QoS1 重复你要故意制造的一次MQTTX 发 QoS1 到设备订阅的命令主题。在 PUBLISH 出现后、PUBACK 出现前杀热点窗口很短多试几次写 N/M。恢复网络。看设备是否再执行一次灯是否闪两次。产品若要求幂等第二次应忽略同一报文 ID 或同一业务序号。没有报文 ID 日志就看灯。缺陷标题「【应用】QoS1 重传导致阀门执行两次」。分层在业务幂等不是射频。QoS0弱网丢命令是预期除非产品宣称可靠。测的是「丢了有没有提示」不是「UDP 式 MQTT 必须不丢」。16. HTTP 短连接 vs MQTT 长连接测试清单对照检查HTTP 天气MQTT 上报传输层每次 GET 新 TCP或 keep-alive 短一条 TCP 挂很久成功证据状态码 200 bodyCONNACK 0 PUBACK/业务掉线发现下一次请求超时KeepAlive / TCP 超时重连后一般无订阅状态必须重新 SUBSCRIBE抓包过滤器http或tlsmqtt或tls典型误测只看串口「已发送」只看「connected」AT32ESP8266 天气走 HTTP本篇用本机 MQTT 及格但要在board.md写清课程设计是 HTTP迁移的是「应用层成功证据」不是假装做过 IoTDA。17. 合格会话长什么样2026-xx-xx 第 10 篇 拓扑loopback Mosquitto MQTTX另电脑热点 设备有则 CONNECTClientIdlab-pc-01 KeepAlive60 Clean1 CONNACKrc0 KeepAlive 实验 20s - broker 日志约 __ s 判死 60s - __ s 错端口 1884仅 TCP RST无 mqtt 错密码CONNECT CONNACK 非 0若未开密码则写未做 6 步检查单已默写见 six-steps.md 未做空口、TLS 解密、IoTDA 真密钥密钥不进 Git18. 给开发的最短转述版本 ____。热点拓扑网口 pcap。 CONNACK rc____。KeepAlive____。 关热点后 TCP 重传从 T__s新 SYN 在 T__s。 离线窗口内命令 ____ 条丢失。 重连后 SUBSCRIBE有/无。 请先看会话状态机不是传感器。