使用Twilio<SIP>/<Client>及<Enqueue>/<Queue>时Yealink T31 BLF不亮问题
我正在基于Twilio与Yealink T31硬电话开展项目,使用Twilio的<Client>和<SIP>动词处理呼叫,通过<Enqueue>和<Queue>实现呼叫驻留。已在Yealink控制台选择呼叫驻留的转移模式,使其触发SIP呼叫时指定的referUrl。
当前遇到的问题是:呼叫驻留时Yealink T31的BLF(Busy Lamp Field)指示灯未点亮。理想状态下,发起驻留的电话应显示红色BLF指示灯,网络内其他电话应显示闪烁绿色BLF指示灯。
我的Yealink DSS Key配置如下:
- 驻留码(Park Key):
*10001 - 取回码(Retrieve Key):
*20001
尽管完成上述配置,呼叫驻留时BLF指示灯仍无变化。我知道还需额外配置,但无法确定缺失项。
我调研过PBX系统,但均不符合我的业务场景:产品需接入多企业,每个企业拥有独立的SIP和Client账号。目前我使用Twilio SIP域,为企业号码注册账号并直接在Yealink设备中使用。
参考代码
取回驻留呼叫代码
const response = new twilio.twiml.VoiceResponse() const dial = response.dial(); dial.queue(`${company.data.company_id}_${toFormatted?.toString()?.substring(4)}`); // 格式为companyid_lotNumber return response.toString();
呼叫驻留代码
与上述类似,仅将dial.queue替换为dial.enqueue。
呼叫SIP电话代码
dial = voice_response.dial({ callerId: from, action: `${process.env.ENV_URL}/voice/sip-url`, method: 'POST', referUrl: `${process.env.ENV_URL}/voice/transfer-sip`, }); dial.sip({ statusCallbackEvent: 'answered completed', statusCallback: `${process.env.ENV_URL}/voice/save-logs-callback`, statusCallbackMethod: 'POST', }, sip);
请问我缺失了哪些配置才能让BLF指示灯正常工作?
BLF指示灯未点亮的核心原因是Yealink设备需要实时获取队列/驻留呼叫的状态更新,而Twilio默认不会主动推送这类状态到SIP终端。以下是你缺失的关键配置和调整:
1. 配置Yealink BLF键绑定到队列的SIP URI
Yealink的BLF灯需要绑定到具体的监控对象,你当前只配置了驻留/取回码,但没有把BLF键关联到Twilio的队列地址:
- 进入Yealink T31网页控制台,找到DSS Key配置
- 将对应BLF键的类型设置为
BLF - 输入队列的SIP URI作为监控目标:
sip:[队列名称]@[你的Twilio SIP域],比如队列是company123_1001、SIP域是mydomain.sip.twilio.com,则填入sip:company123_1001@mydomain.sip.twilio.com - 确保该BLF键的
Retrieve字段设置为你的取回码*20001
2. 启用Twilio SIP域的Presence(状态推送)
Twilio需要开启Presence功能才能向SIP终端发送BLF所需的SIP NOTIFY状态通知:
- 登录Twilio控制台,进入你的SIP域配置页面
- 找到
Presence选项,设置为Enabled - 确保
Event Package选择dialog(Yealink支持的状态推送协议)
3. 调整Enqueue/Queue的配置,监听状态变化
在使用<Enqueue>和<Queue>时,需要配置状态回调让Twilio跟踪呼叫状态:
- 当使用
dial.enqueue时,添加statusCallback参数,监听队列的wait和leave事件 - 示例调整(Node.js):
const enqueue = dial.enqueue({ statusCallback: `${process.env.ENV_URL}/voice/queue-status`, statusCallbackEvent: 'wait leave', statusCallbackMethod: 'POST' }); enqueue.queue(`${company.data.company_id}_${toFormatted?.toString()?.substring(4)}`);
4. 确保Yealink设备允许SIP订阅
Yealink需要开启SIP订阅权限才能接收状态通知:
- 在Yealink控制台的
SIP Settings > Advanced中,设置Allow SIP Subscribe为Yes - 检查
SIP Notify相关选项,确保未禁用状态接收
5. 验证SIP NOTIFY消息传输
可以通过Wireshark等抓包工具验证:
- 呼叫驻留后,Twilio应向订阅该队列的SIP终端发送NOTIFY消息,携带呼叫状态
- 如果未收到,检查Twilio SIP域的防火墙/ACL设置,确保允许向Yealink设备发送NOTIFY请求
内容的提问来源于stack exchange,提问作者Ayush T.

