心跳与重连
WebSocket 是长连接,但网络设备、代理和服务维护都可能中断连接。客户端必须实现心跳、断线检测和重连。
心跳
建议同时使用:
- WebSocket 协议层 Ping/Pong,用于检测网络连接。
session.ping,用于确认应用层消息处理正常。
session.ping 回复:
json
{
"type": "reply",
"requestId": "req_ping_001",
"code": "SUCCESS",
"message": "OK.",
"data": {}
}心跳间隔应遵循 限流与重试,不要用设备状态查询代替心跳。
重连流程
- 检测连接关闭或心跳超时。
- 使用指数退避和随机抖动,避免立即高频重连。
- 使用有效 access token 创建新的 WebSocket ticket。
- 建立新连接。
- 对业务关键设备发送一次
device.state.get,恢复本地状态。 - 恢复事件消费。
每个 ticket 只能使用一次,不能在重连时复用。
事件连续性
WebSocket 不提供断线期间的事件回放。应用应:
- 将重要事件及时持久化。
- 使用
stateUpdatedAt防止旧状态覆盖新状态。 - 重连后查询关键设备,而不是刷新账号下全部设备。
