咨询:Node.js脚本如何捕获FreeSWITCH的CHANNEL_ANSWER事件
解决Node.js捕获FreeSWITCH CHANNEL_ANSWER事件的问题
问题分析
从你提供的日志来看,FreeSWITCH已识别到呼叫接听(Channel [sofia/external/+1122334455] has been answered、Callstate Change EARLY -> ACTIVE),但未向Node.js脚本推送CHANNEL_ANSWER事件,核心原因通常是事件未主动订阅或呼叫发起方式导致事件跟踪失效。
解决步骤
1. 主动订阅CHANNEL_ANSWER事件
连接FreeSWITCH后必须明确订阅目标事件,否则不会收到推送。以常用的freeswitch-node库为例:
const FreeSwitch = require('freeswitch'); const fsClient = new FreeSwitch({ host: '你的FS服务器IP', port: 8021, password: '你的ESL密码' }); fsClient.connect(); fsClient.on('connect', () => { // 订阅CHANNEL_ANSWER事件(plain格式便于解析) fsClient.api('event plain CHANNEL_ANSWER', (err) => { if (err) console.error('事件订阅失败:', err); }); }); // 监听CHANNEL_ANSWER事件 fsClient.on('CHANNEL_ANSWER', (eventData) => { console.log('呼叫已应答:', eventData); // 执行后续呼叫流任务 });
2. 用uuid_originate精准跟踪呼叫
普通originate命令可能无法绑定事件到当前呼叫,改用uuid_originate生成唯一呼叫UUID,确保事件能被精准捕获:
const { v4: uuidv4 } = require('uuid'); fsClient.on('connect', () => { const callUuid = uuidv4(); // 发起带UUID的呼叫 fsClient.api(`uuid_originate ${callUuid} sofia/external/+1122334455 &echo`, (err) => { if (err) console.error('呼叫发起失败:', err); }); // 可选:仅订阅该UUID的CHANNEL_ANSWER事件,减少冗余推送 fsClient.api(`event plain CHANNEL_ANSWER ${callUuid}`, (err) => { if (err) console.error('指定UUID事件订阅失败:', err); }); });
3. 备选方案:监听CHANNEL_STATE事件
如果CHANNEL_ANSWER仍无法触发,可通过CHANNEL_STATE事件的ACTIVE状态判定呼叫接听:
fsClient.on('CHANNEL_STATE', (eventData) => { if (eventData.state === 'ACTIVE') { console.log('呼叫已应答(通过状态变更):', eventData); // 执行后续任务 } });
4. 验证FreeSWITCH事件配置
确保event_socket.conf.xml未过滤CHANNEL_ANSWER事件,默认配置无需修改,可检查:
<configuration name="event_socket.conf" description="Socket Client"> <settings> <param name="listen-ip" value="0.0.0.0"/> <param name="listen-port" value="8021"/> <param name="password" value="ClueCon"/> <!-- 确认未设置exclude-events排除CHANNEL_ANSWER --> </settings> </configuration>
内容的提问来源于stack exchange,提问作者aIi.i
相关产品推荐
相关产品推荐

