Sip.js 0.20.0连接Asterisk长连接异常:离开标签页无法接来电如何保活?
SIP.js 0.20.0 维持Asterisk长连接解决标签页休眠问题
针对长时间切换标签页后无法接收来电的问题,可通过以下几种策略维持SIP长连接:
1. 调整SIP.js的心跳配置
浏览器后台标签会限制WebSocket的活跃性,需缩短心跳间隔以避免连接被判定为闲置。在UA初始化时配置更频繁的心跳参数:
const ua = new SIP.UA({ uri: 'sip:your-account@your-asterisk-domain', transportOptions: { wsServers: 'wss://your-asterisk-websocket-endpoint', keepAliveInterval: 15, // 每15秒发送一次心跳PING keepAliveMaxMissed: 3 // 连续3次未收到响应则触发重连 }, // 其他必要配置(授权、媒体等) });
建议将心跳间隔设为10-15秒,短于浏览器后台对WebSocket的闲置判定阈值(多数浏览器为30秒)。
2. 利用页面可见性API动态调整连接策略
通过监听标签页前后台状态,针对性强化后台时的连接维持:
document.addEventListener('visibilitychange', () => { if (document.hidden) { // 标签页后台时,主动发送PING并缩短心跳频率 if (ua.transport && ua.transport.isConnected()) { window.backgroundPingTimer = setInterval(() => { if (ua.transport.isConnected()) { ua.transport.send('PING'); } }, 10000); // 后台每10秒发一次PING } } else { // 回到前台时清除后台定时器,恢复默认心跳 if (window.backgroundPingTimer) { clearInterval(window.backgroundPingTimer); window.backgroundPingTimer = null; } // 检查连接状态,异常则立即重连 if (!ua.isConnected()) { ua.connect(); } } });
该API能精准捕捉标签页状态变化,避免后台时因浏览器节流导致连接中断。
3. 调整Asterisk端的WebSocket配置
在Asterisk的配置文件中延长WebSocket超时时间,并开启主动PING:
# res_websocket.conf [general] websocket_timeout = 300 ; 设置为5分钟超时 websocket_ping_interval = 10 ; Asterisk每10秒主动向客户端发PING
让服务器端主动参与连接维持,减少因服务器侧超时断开的概率。
4. 规避浏览器后台资源限制
- 避免在后台标签运行过多占用资源的脚本,降低浏览器主动冻结连接的可能;
- 部分浏览器对后台WebSocket限制极严,可尝试将心跳包改为
navigator.sendBeacon发送(需适配SIP协议格式),但优先使用SIP.js原生PING机制。
通过上述组合策略,可实现绝大多数场景下的持续连接,仅在浏览器被系统强制冻结等极端情况才会断开,能大幅提升后台标签的来电接收稳定性。
内容的提问来源于stack exchange,提问作者shaolong_zheng
相关产品推荐
相关产品推荐

