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

如何仅让空闲的Twilio SIP端点响铃(无需完整PBX)

问题

我通过Twilio Functions实现了基于SIP域的Twilio直连SIP呼叫,支持多SIP客户端呼入呼出,未部署额外PBX。当前SIP呼入采用并行配置,所有已注册且在线的SIP端点都会响铃,实现代码如下:

const dialer = twiml.dial({
            ringTone: "de",
            action: "https://...",
            timeout: 25,
            answerOnBridge: true,
            callerId: event.From
        })
        
dialer.sip('sip:accounta@demo1.sip.twilio.com');
dialer.sip('sip:accounta@demo2.sip.twilio.com');
dialer.sip('sip:accounta@demo3.sip.twilio.com');

这段代码在SIP域的“来电”事件中触发,运行正常。但存在问题:新来电时所有SIP电话都会响铃,包括正在通话中的设备。

无需部署完整PBX的情况下,有没有办法仅让当前未处于通话状态的SIP端点响铃?我想到两种可能方案:

  • 使用Twilio Sync收集所有呼叫状态变化数据,再据此在代码中仅添加空闲的SIP端点;
  • 寻找能在通话期间自动注销SIP的软电话(手动用MicroSIP可实现,但需坐席每次手动登录/注销)。

是否有更优解决方案?

解决方案

方案一:利用Twilio Call API实时查询活跃呼叫(更优)

无需额外依赖Sync,直接在Twilio Functions中调用Twilio的Call API,过滤出当前处于in-progress状态的呼叫,提取对应的SIP端点,生成Dial指令时排除这些忙碌端点即可。

具体实现步骤:

  1. 在Twilio Functions中直接使用内置的Twilio Client(无需额外安装依赖);
  2. 调用calls.list()方法,筛选状态为in-progress且目标地址匹配你的SIP域格式的呼叫;
  3. 从活跃呼叫中提取正在通话的SIP地址,生成忙碌端点集合;
  4. 从所有SIP端点中筛选出空闲的,添加到Dialer指令中。

示例代码片段:

exports.handler = async function(context, event, callback) {
  const twiml = new Twilio.twiml.VoiceResponse();
  const client = context.getTwilioClient();

  // 获取当前处于通话中的呼叫
  const activeCalls = await client.calls.list({
    status: 'in-progress',
    to: 'sip:*@demo*.sip.twilio.com' // 匹配你的SIP域格式
  });

  // 提取正在通话的SIP端点,存入Set去重
  const busyEndpoints = new Set(activeCalls.map(call => call.to));

  // 定义所有可用的SIP端点
  const allEndpoints = [
    'sip:accounta@demo1.sip.twilio.com',
    'sip:accounta@demo2.sip.twilio.com',
    'sip:accounta@demo3.sip.twilio.com'
  ];

  // 筛选出空闲的SIP端点
  const freeEndpoints = allEndpoints.filter(endpoint => !busyEndpoints.has(endpoint));

  if (freeEndpoints.length > 0) {
    const dialer = twiml.dial({
      ringTone: "de",
      action: "https://...",
      timeout: 25,
      answerOnBridge: true,
      callerId: event.From
    });

    freeEndpoints.forEach(endpoint => dialer.sip(endpoint));
  } else {
    // 无空闲端点时的兜底处理,比如播放提示或转语音信箱
    twiml.say('当前所有坐席忙,请稍后再拨');
  }

  callback(null, twiml);
};

方案二:优化Twilio Sync状态同步方案

如果倾向于使用Sync,建议结合Twilio呼叫状态Webhook来自动同步端点状态,而非依赖客户端上报:

  • 在Twilio控制台配置呼叫状态Webhook,当呼叫进入in-progress状态时,将对应SIP端点标记为忙碌;
  • 当呼叫结束(状态为completed/canceled)时,将端点标记为空闲;
  • 来电处理的Function中,读取Sync存储的空闲端点列表,生成Dial指令。

这种方式比客户端上报更可靠,避免软电话异常导致状态不同步的问题。

不推荐自动注销SIP的软电话方案

该方案依赖软电话的兼容性,频繁注销/注册还可能导致SIP域的注册状态不稳定,坐席操作体验较差,不建议作为长期解决方案。

内容的提问来源于stack exchange,提问作者masp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:50:43