实时通信:Socket.IO
后端WsGateway使用Socket.IO默认路径/socket.io/,与HTTP同端口;不是STOMP,也不是随意发送JSON即可兼容的裸WebSocket。反向代理须转发升级请求及长轮询。
客户端在CONNECT的auth.token传访问Token,不能将Token放查询URL;服务端校验签名、过期、type、Redis sid和当前账号状态。成功发送realtime.ready。Token过期或会话撤销会断开,客户端先通过HTTP刷新,再建立新连接。
| 事件 | 方向 | 内容与处理 |
|---|---|---|
| realtime.ready | 后端→客户端 | 连接就绪;重新读取有权限的HTTP设备快照 |
| device.updated | 后端→客户端 | deviceId、isOnline、shadow、lastOnlineAt、updatedAt、sequence |
| devices.refresh | 后端→客户端 | 空对象;共享/解绑导致权限变化,重新拉取列表 |
推送时读取当前拥有者、有效共享及管理员角色;取消分享不会依赖前端主动隐藏。sequence是当前进程内序号,不是跨重启永久游标,不用它替代重新读取。
设备在线依据Redis约120秒TTL与PostgreSQL最后在线时间,后台每10秒扫描过期;因此断电常在约120至130秒变离线。新心跳与过期扫描竞争时使用条件更新,避免迟到扫描覆盖新状态。客户端退后台/断网回来必须重连并恢复HTTP快照,事件不保证离线补发。
当前连接表在单进程内,未接Socket.IO跨实例适配;共享MQTT订阅不自动解决前端连接跨节点广播。全局CORS的HTTP配置也不等于WS已经实现同样白名单,当前Gateway为origin=*,对外接入仍靠Token与业务授权。
