WebSocket(/ws/v1)
地址为 ws://<IP>:<端口>/ws/v1。无需鉴权,客户端不发送任何消息。
{ "type": "snapshot", "source": { "type": "vmix", "state": "ready", "error": null }, "devices": [{ "id": "k3m9x2qa", "name": "Camera 1", "program": true, "preview": false }]}{ "type": "heartbeat" }- 连接建立后,立即收到一次
snapshot。 - 发生任何变化(Tally、机位增删改、切换台状态)时,都会收到完整的
snapshot;与上一次完全相同时不发送。 - 每 2 秒发送一次
heartbeat。 - 连接的发送缓冲超过上限时,服务端会断开该连接;客户端重连后会收到最新快照。
- 6 秒内未收到任何消息:显示 Unknown,断开并重连。
- 断开后每 2 秒重连一次;App 或页面回到前台时立即重连。重连后收到新的完整快照,直接替换旧状态。
- 快照中找不到本机位 ID 时,显示「机位已删除」。
let ws, watchdogfunction connect() { ws = new WebSocket(`${base.replace(/^http/, 'ws')}/ws/v1`) const alive = () => { clearTimeout(watchdog) watchdog = setTimeout(lost, 6000) } const lost = () => { ws.onmessage = ws.onclose = null ws.close() clearTimeout(watchdog) show('unknown') setTimeout(connect, 2000) } alive() ws.onmessage = (event) => { alive() const message = JSON.parse(event.data) if (message.type === 'snapshot') show(tallyOf(message, deviceId)) } ws.onclose = lost}connect()tallyOf 的实现见显示规则。