Skip to content

实时通信: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与业务授权。