如何在Freeswitch JavaScript中检测外呼时用户电话的振铃状态
在FreeSWITCH中用JavaScript检测外呼振铃状态的方法
方法1:监听CHANNEL_STATE事件捕捉状态变更
这是最可靠的方式,通过监听通道状态变化事件,精准捕捉从DOWN到RINGING的状态切换:
// 绑定通道状态变更事件 session.addEventListener('CHANNEL_STATE', function(event) { const newState = event.getHeader('Channel-State'); const oldState = event.getHeader('Old-Channel-State'); // 检测状态从DOWN变为RINGING if (newState === 'RINGING' && oldState === 'DOWN') { console.log('外呼已进入振铃状态'); // 在这里添加你的业务逻辑,比如发送通知、记录振铃日志等 } }); // 发起外呼(示例) session.execute('originate', '{ignore_early_media=false}user/1000 &park()');
注意:ignore_early_media=false确保能收到振铃事件,部分场景下默认会忽略早期媒体导致无法捕获RINGING状态。
方法2:轮询会话当前状态(应急方案)
如果事件监听无法满足需求,可以短间隔轮询会话状态,但不推荐长期使用(可能影响性能):
function monitorRingState() { const currentState = session.getState(); if (currentState === 'RINGING') { console.log('当前会话处于振铃状态'); // 处理业务逻辑 return; } // 500ms后再次轮询,避免阻塞事件循环 setTimeout(monitorRingState, 500); } // 发起外呼后启动监听 session.execute('bridge', 'sofia/gateway/my_gateway/13800138000'); monitorRingState();
额外提示
- 如果是桥接呼叫(B_LEG),需要获取桥接会话后再监听状态:
session.addEventListener('CHANNEL_BRIDGE', function(event) { const bLegSession = session.getBridgedSession(); bLegSession.addEventListener('CHANNEL_STATE', function(bEvent) { const state = bEvent.getHeader('Channel-State'); if (state === 'RINGING') { console.log('B_LEG进入振铃状态'); } }); }); - 确保会话对象在状态变更前已完成事件绑定,避免错过事件触发。
内容的提问来源于stack exchange,提问作者Mr.Hien
相关产品推荐
相关产品推荐

