wss://broker.emqx.io:8084/mqtt,发 CONNECT(client_id ws-spike),收 CONNACK。core/ClientCore 纯函数自动产出 SUBSCRIBE,并在 SUBACK 后发一条 QoS2 PUBLISH(topic sensors/qos2),随后走完 PUBREC → PUBREL → PUBCOMP——这些字节全部由 MoonBit 状态机生成,页面侧一行握手代码都没有。close() 一次模拟断网:onclose → on_transport_close() → 1 秒后重连,最多 3 次,超过就放弃。浏览器侧证据见 README「在线 demo」的无头 Chrome 日志与主页控制台;这里是 Node 侧的 QoS2 协议层记录。
QoS2 发布握手:
PUBLISH(pid=1) → broker 回 PUBREC(0x50 02 00 01)
→ core.feed() 自动产出 PUBREL(0x62 02 00 01)
→ broker 回 PUBCOMP(0x70 02 00 01)
→ 在途清空。全程无手写握手字节。
断线重连:
onclose → on_transport_close() → state = Disconnected → 1s 后 reconnect attempt #1 → 新 CONNECT → 新 CONNACK → 自动 SUBSCRIBE(pid=2) + QoS2 PUBLISH → 继续收 PUBLISH → 最多 3 次(pid 递增 1→2→3)