我正在开发一个类似预测拨号器的应用程序,在该应用程序中我应该检测呼叫是否被语音邮件接听。
我正在使用以下内容:
服务器:我使用的是 FreeSWITCH v1.6.11。我构建并配置了 AVMD 模块。
客户:我正在使用通过 WSS 连接到 Freeswitch 的 sipml5。
这个想法是当 Freeswitch 检测到哔声时,它将触发一个名为 AVMD_EVENT_BEEP 的事件。
在以下日志中,我使用连接到 FreeSWITCH 套接字的 telnet 客户端。我通过套接字订阅了该事件,结果如下:
事件纯自定义 avmd::beep 内容类型:命令/回复 回复文本:+OK 事件侦听器已启用纯文本 内容长度:737 内容类型:文本/事件纯文本 事件子类:avmd%3A%3Abeep 事件名称:自定义 核心 UUID:1c8e8e58-8b46-11e6-99c3-238295cb19cb FreeSWITCH-主机名:debian FreeSWITCH-开关名称:debian FreeSWITCH-IPv4:176.58.104.114 FreeSWITCH-IPv6:2a01%3A7e00%3A%3Af03c%3A91ff%3Afeae%3Ad2d6 事件-日期-本地:2016-10-05%2022%3A47%3A21 事件-日期-GMT:星期三,%2005%20Oct%202016%2022%3A47%3A21%20GMT 事件日期时间戳:1475707641468562 事件调用文件:mod_avmd.c 事件调用函数:avmd_fire_event 事件调用行号:437 事件序列:2420 唯一 ID:a894fffc-8b4d-11e6-9aa3-238295cb19cb 调用命令:avmd 哔声状态:检测到 频率:1001.084123 频变:0.000203 幅度:12541.343475 幅度变化:33583.241944 检测时间:7320038
在 FreeSwitch 文档页面https://freeswitch.org/confluence/display/FREESWITCH/mod_avmd上,他们说“事件被传递到您的 ESL 套接字侦听器、命令提示符并写入日志。Avmd 还设置了通道变量(请参阅“通道变量“)”。
好,这很酷。但是如果没有办法让客户端可以检测到事件,目的是什么。
我希望客户端订阅此事件并通过 SIP 获得通知。
我尝试在 sipml5 上使用 subscribe Header 如下:
var onEvent = function(e){
if(e.type == 'i_notify'){
// process incoming NOTIFY request
console.info('NOTIFY content = ' + e.getContentString());
console.info('NOTIFY content-type = ' + e.getContentType());
}
}
var session = this.newSession('subscribe', {
expires: 200,
events_listener: { events: '*', listener: onEvent },
sip_headers: [
{ name: 'Event', value: 'AVMD_EVENT_BEEP' },
{ name: 'Accept', value: 'text/event-plain' }
],
sip_caps: [
{ name: '+g.oma.sip-im', value: null },
{ name: '+audio', value: null },
{ name: 'language', value: '\"en,fr\"' }
]
});
session.subscribe('sip:xxxxx@mydomain');
但问题是,服务器以 BAD EVENT 状态响应。
知道如何检测客户端上的事件吗?也许在服务器上检测到它并向客户端触发 sip 通知?