图 6 - WebSocket vs MQTT+UDP 协议对比
两种协议都能用,到底选哪个?这张图把差异点列清楚。
如果上方图无法显示,点这里看 PNG 版本

核心差异
WebSocket 方案:控制 + 音频共用一条 WSS 长连接
设备 ⇄ WSS(TLS)⇄ 云端
↑
文本帧:JSON-RPC 控制(hello/abort/tts.start)
二进制帧:BP2/BP3 包头 + Opus 音频
特点:
- 一条通道搞定所有事,运维简单
- TCP 保序保送达——但弱网丢包会让音频卡
- 懒启动:只在需要传音频时(
OpenAudioChannel)才连 - 适合 Wi-Fi 稳定场景
MQTT+UDP 方案:控制和音频分两条通道
设备 ⇄ MQTTS ⇄ 云端 (控制信令,常驻在线)
│
设备 ⇄ UDP+AES ⇄ 云端 (音频流,按需开闭)
特点:
- MQTT 走 TCP 保证信令送达;UDP 走 datagram 容忍少量丢包
- 适合移动网络 / 4G / IoT 场景,弱网下信令不掉、音频可以丢几个包
- 加密:UDP 流用 AES-128-CTR 流加密(密钥由 MQTT hello 协商)
- 自动重连:esp_timer 定时尝试,
alive_sentinel 防野指针
选型决策表
| 你的情况 | 选 |
|---|---|
| Wi-Fi 良好环境(家用) | WebSocket(简单) |
| 4G 移动场景 | MQTT+UDP(弱网友好) |
| 大量设备并发 | MQTT+UDP(MQTT 天生适合 IoT 扇出) |
| 想最简单上线 | WebSocket |
| 对延迟敏感(语音助手) | MQTT+UDP(UDP 路径更短) |
| 服务器开发力量薄 | WebSocket(已有现成服务器框架) |
同样的上层代码
不管选哪个,上层代码完全感知不到——两者都实现同一个 Protocol 抽象基类。切协议只需要:
- 修改
Application::InitializeProtocol()里new WebsocketProtocol还是new MqttProtocol; - 服务器对应改实现;
- 其它所有代码不变。
一句话讲清
"WebSocket 是单通道一气呵成,简单但弱网怕丢包;MQTT+UDP 是双通道分工,复杂但移动场景更稳。两套实现都实现同一个抽象接口,业务层无感切换。"
关联章节
/05-protocols整章