You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 14:17:07