1

我正在开发一个类似预测拨号器的应用程序,在该应用程序中我应该检测呼叫是否被语音邮件接听。

我正在使用以下内容:

服务器:我使用的是 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 通知?

4

2 回答 2

1

好的,我解决了。因为没有直接的方法来做到这一点。我必须创建一个出站 esl 守护程序,如果触发事件,Freeswitch 会将数据发布到该守护程序。在我的拨号方案中,我告诉 Freeswitch 打开与守护程序的连接。

现在,我从该守护进程打开一个新的入站套接字到 freeswitch,并使用来自 esl 的 sendEvent() 发送自定义通知事件。最后 Freeswitch 将通知数据包传递给客户端。

希望这可以帮助某人。

于 2016-10-06T23:21:11.403 回答
1

使用预测拨号器,您通常不会在拨号器之外发出这些事件的信号。拨号器将有多个目标号码,并自行处理建立的呼叫。只有当呼叫建立并确认另一端有人时,代理才会与该呼叫桥接。

于 2016-10-07T06:38:38.760 回答