外观
移动端交互(大屏侧)
大屏与移动端通过 WebSocket 长连接 通信,移动端的提问、模式切换等指令经后端转发到大屏,大屏的回答再经后端回推移动端。
一、WebSocket 通道
{ws|wss}://{VITE_AI_APP_HOST}/ws/digital-human
?clientType=screen|mobile&clientId=xxx[&pairingCode=xxx]- 协议随页面协议自动切换(https → wss);
- 心跳 30 秒 一次
HEARTBEAT_REQ; - 大屏端断线指数退避自动重连:最多 5 次,延迟
min(1000 × 2^n, 30000)ms。
消息类型:
| type | 方向 | 说明 |
|---|---|---|
SCREEN_REGISTER | 后端 → 大屏 | 下发屏幕端 clientId |
PAIRING_SUCCESS | 后端 → 双端 | 携带 { deviceIp, deviceName, userAgent, pairedAt },大屏插入"📱 xxx 已配对" |
PAIRING_FAIL | 后端 → 手机 | 断开并提示原因 |
COMMAND | 手机 → 大屏 | { text, type: 'text'|'voice', mode, knowledgeCategory? } |
RESPONSE | 大屏 → 手机 | 字符串 / { text } / { error } / { text, subtype:'search', searchResult } |
DISCONNECT | 后端 → 双端 | 携带原因,大屏显示"📱 xxx 已断开连接" |
KICKED | 后端 → 手机 | 被大屏踢出,弹提示后 store.reset() 回到扫码页 |
HEARTBEAT_REQ / HEARTBEAT_RESP | 双向 | 保活 |
模式同步采用 piggyback
移动端不发送独立的 MODE_CHANGE 消息(后端可能不识别并断开连接),而是把 mode 挂在 COMMAND 载荷里,大屏收到后先 setMode 再处理,保证两端模式一致。
二、大屏侧指令处理
大屏收到移动端 COMMAND 后进入 handleMobileCommand(实现位于 core/connection.js):
- 取出
text/type/mode/knowledgeCategory; - 按当前模式走
interactive/expert/demo分支; - 渲染回答并触发 TTS 播报;
- 通过
RESPONSE将结果回推移动端渲染。
移动端侧的扫码、遥控面板与问答链路,见 移动端与大屏交互。