跳到主要内容

图 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 抽象基类。切协议只需要:

  1. 修改 Application::InitializeProtocol()new WebsocketProtocol 还是 new MqttProtocol
  2. 服务器对应改实现;
  3. 其它所有代码不变。

一句话讲清

"WebSocket 是单通道一气呵成,简单但弱网怕丢包;MQTT+UDP 是双通道分工,复杂但移动场景更稳。两套实现都实现同一个抽象接口,业务层无感切换。"

关联章节

  • /05-protocols 整章