问题
I am working on a predictive dialer-like application in which I should detect whether the call was picked up by a voicemail or not.
I am using the follwing:
Server: I am using FreeSWITCH v1.6.11. I built and configured AVMD module.
Client: I am using sipml5 connected to Freeswitch via WSS.
The idea is when Freeswitch detects a beep sound, it will fire an event called AVMD_EVENT_BEEP.
In the following log, I am using a telnet client connected to FreeSWITCH socket. I subscribed to the event via socket and here is the result:
event plain CUSTOM avmd::beep
Content-Type: command/reply
Reply-Text: +OK event listener enabled plain
Content-Length: 737
Content-Type: text/event-plain
Event-Subclass: avmd%3A%3Abeep
Event-Name: CUSTOM
Core-UUID: 1c8e8e58-8b46-11e6-99c3-238295cb19cb
FreeSWITCH-Hostname: debian
FreeSWITCH-Switchname: debian
FreeSWITCH-IPv4: 176.58.104.114
FreeSWITCH-IPv6: 2a01%3A7e00%3A%3Af03c%3A91ff%3Afeae%3Ad2d6
Event-Date-Local: 2016-10-05%2022%3A47%3A21
Event-Date-GMT: Wed,%2005%20Oct%202016%2022%3A47%3A21%20GMT
Event-Date-Timestamp: 1475707641468562
Event-Calling-File: mod_avmd.c
Event-Calling-Function: avmd_fire_event
Event-Calling-Line-Number: 437
Event-Sequence: 2420
Unique-ID: a894fffc-8b4d-11e6-9aa3-238295cb19cb
Call-command: avmd
Beep-Status: DETECTED
Frequency: 1001.084123
Frequency-variance: 0.000203
Amplitude: 12541.343475
Amplitude-variance: 33583.241944
Detection-time: 7320038
On FreeSwitch documentation page https://freeswitch.org/confluence/display/FREESWITCH/mod_avmd, they say "The event is delivered to your ESL socket listener, to command prompt and written to logs. Avmd also sets the channel variable (see "Channel variables")."
Ok that's cool. But what is the purpose if there is no way so the client can detect the event.
I want the client to subscribe to this event and get notified via SIP.
I tried with subscribe Header on sipml5 as follows:
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');
But the problem is, the server is reponding with a BAD EVENT status.
Any idea how I can detect the event on my client? Maybe detecting it on the server and triggering a sip notify to the client?
回答1:
Ok I solved it. As there is no a direct way to do it. I had to make an outbound esl daemon to which Freeswitch will post data if the event is triggered. in my dialplan, I tell Freeswitch to open a connection to the daemon.
Now from that daemon I open a new inbound socket to freeswitch and I send a custom notify event using sendEvent() from esl. Finally Freeswitch will deliver the notify packet to the client.
Hope this helps somebody.
回答2:
with predictive dialers, you usually don't signal these events outsde the dialer. The dialer would have a number of destination numbers, and handle the call establishing by itself. Only when the call is established and confirmed that there's a human on the other end, then the agent is bridged with that call.
来源:https://stackoverflow.com/questions/39891505/voicemail-detection-on-freeswitch