freeswitch: ESL中如何自定义事件及自定义事件的监听

虽然freeswitch已经内置了一些标识的事件,比如:CHANNEL_CREATE(发起呼叫时触发),CHANNEL_HANGUP_COMPLETE(电话挂断时触发)...,但是有时候我们想根据业务需求,新增一些自定义的事件,比如:客人进线后,如果分配到了一个空闲的客服,希望触发一个特定的事件。

 

可参考以下代码(注:以下所有代码依赖的esl-client,来自于github上的最新代码

ESL outbound外联模式下,onConnect方法中的上述代码,相当于每次进线,都触发一个自定义事件,然后调用echo,让主叫方听到自己的声音。

 

测试一下,可以在inbound中监控该事件,主要代码如下:

 执行结果 :

这里有几个要注意的地方:

1. 系统自带的默认通道变量,比如Caller-ANI,在自定义事件中并不能通过赋值的方式篡改。比如上面的示例中,我们把Caller-ANI想改成999999,但是没未生效。

2. 每一次自定义事件的触发,设置的业务变量(比如:上面的MY-VAR-1),只在本次事件中有效,并不象freeswitch自带的变量,可以一直传递到后面的事件中。

3. 如果需要添加自定义变量,且一直能向下传递到所有事件中,可以用export导出变量

1
exe.export("MY-VAR-2", "something", true);

而且用export导出的变量,在取值时,要加上variable_前缀,即:

1
event.getEventHeaders().get("variable_MY-VAR-2");

 

另外还有一个大坑,可能是esl-client代码的问题,在inbound订阅事件时,可以指定订阅指定事件,上面的示例中,我们用的是ALL,即订阅所有事件。

inboundClient.setEventSubscriptions(IModEslApi.EventFormat.PLAIN, "ALL");

根据setEventSubscriptions源码的注释说明,可以用类似 “A B C”的方式,指定订阅事件A, B ,C 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * Set the current event subscription for this connection to the server.  Examples of the events
 * argument are:
 * <pre>
 *   ALL
 *   CHANNEL_CREATE CHANNEL_DESTROY HEARTBEAT
 *   CUSTOM conference::maintenance
 *   CHANNEL_CREATE CHANNEL_DESTROY CUSTOM conference::maintenance sofia::register sofia::expire
 * </pre>
 * Subsequent calls to this method replaces any previous subscriptions that were set.
 * </p>
 * Note: current implementation can only process 'plain' events.
 *
 * @param format can be { plain | xml }
 * @param events { all | space separated list of events }
 * @return a {@link CommandResponse} with the server's response.
 */
@Override
public CommandResponse setEventSubscriptions(EventFormat format, String events) {
    checkConnected();
    return clientContext.get().setEventSubscriptions(format, events);
}

但现实是残酷的,当我们换成后

1
2
inboundClient.setEventSubscriptions(IModEslApi.EventFormat.PLAIN, "CHANNEL_CREATE CHANNEL_HANGUP CHANNEL_HANGUP_COMPLETE CHANNEL_DESTROY CUSTOM");
            

居然发现inbound模式下的CUSTOM事件无法订阅成功(注:解决方法,见评价区1楼ctgu_czy的回复,感谢ctgu_czy)

上述完整示例代码见: https://github.com/yjmyzz/esl-client/blob/master/src/test/java/org/freeswitch/esl/client/CustomEventTest.java

posted @   菩提树下的杨过  阅读(3235)  评论(2编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2020-03-01 spring项目run起来的最小依赖
2016-03-01 dubbox 的各种管理和监管
2010-03-01 使用GoogleAPI加载各种js框架
2010-03-01 jQuery扩展以及gzip压缩测试
点击右上角即可分享
微信分享提示