freeswitch: ESL中如何自定义事件及自定义事件的监听
虽然freeswitch已经内置了一些标识的事件,比如:CHANNEL_CREATE(发起呼叫时触发),CHANNEL_HANGUP_COMPLETE(电话挂断时触发)...,但是有时候我们想根据业务需求,新增一些自定义的事件,比如:客人进线后,如果分配到了一个空闲的客服,希望触发一个特定的事件。
可参考以下代码(注:以下所有代码依赖的esl-client,来自于github上的最新代码)
@Override
public void onConnect(Context context, EslEvent eslEvent) {
try {
Execute exe = new Execute(context, null);
StringBuilder sbEvent = new StringBuilder();
sbEvent.append("Event-Name=").append("CUSTOM").append(",");
sbEvent.append("Event-Subclass=").append("callcenter::info").append(",");
//自定义事件中的变量(根据业务需求,可自行添加,注:系统变量并不能覆盖,比如下面的Caller-ANI)
sbEvent.append("Caller-ANI=").append("999999").append(",");
//只有业务新增的变量,赋值才有意义
sbEvent.append("MY-VAR-1=").append("abcdefg").append(",");
//触发自定义事件
exe.event(sbEvent.toString()); //其它处理(这里只是示例调用了echo)
exe.echo();
} catch (ExecuteException e) {
e.printStackTrace();
} finally {
context.closeChannel();
}
}
ESL outbound外联模式下,onConnect方法中的上述代码,相当于每次进线,都触发一个自定义事件,然后调用echo,让主叫方听到自己的声音。
测试一下,可以在inbound中监控该事件,主要代码如下:
//inbound test
final Client inboundClient = new Client();
inboundClient.connect(new InetSocketAddress("localhost", 8021), "ClueCon", 10);
inboundClient.setEventSubscriptions(IModEslApi.EventFormat.PLAIN, "ALL");
inboundClient.addEventListener((ctx, event) ->
{
String eventName = event.getEventName();
if (eventName.equalsIgnoreCase("CUSTOM") || eventName.contains("HANGUP_COMPLETE")) {
String ani = event.getEventHeaders().get("Caller-ANI");
String myvar = event.getEventHeaders().get("MY-VAR-1");
System.out.println("INBOUND=> eventName: " + event.getEventName() + ", ani = " + ani + ", myvar = " + myvar);
}
}
执行结果 :

这里有几个要注意的地方:
1. 系统自带的默认通道变量,比如Caller-ANI,在自定义事件中并不能通过赋值的方式篡改。比如上面的示例中,我们把Caller-ANI想改成999999,但是没未生效。
2. 每一次自定义事件的触发,设置的业务变量(比如:上面的MY-VAR-1),只在本次事件中有效,并不象freeswitch自带的变量,可以一直传递到后面的事件中。
3. 如果需要添加自定义变量,且一直能向下传递到所有事件中,可以用export导出变量
exe.export("MY-VAR-2", "something", true);
而且用export导出的变量,在取值时,要加上variable_前缀,即:
event.getEventHeaders().get("variable_MY-VAR-2");
另外还有一个大坑,可能是esl-client代码的问题,在inbound订阅事件时,可以指定订阅指定事件,上面的示例中,我们用的是ALL,即订阅所有事件。
inboundClient.setEventSubscriptions(IModEslApi.EventFormat.PLAIN, "ALL");
根据setEventSubscriptions源码的注释说明,可以用类似 “A B C”的方式,指定订阅事件A, B ,C
/**
* 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);
}
但现实是残酷的,当我们换成后
inboundClient.setEventSubscriptions(IModEslApi.EventFormat.PLAIN, "CHANNEL_CREATE CHANNEL_HANGUP CHANNEL_HANGUP_COMPLETE CHANNEL_DESTROY CUSTOM");
居然发现inbound模式下的CUSTOM事件无法订阅成功(注:解决方法,见评价区1楼ctgu_czy的回复,感谢ctgu_czy)

freeswitch: ESL中如何自定义事件及自定义事件的监听的更多相关文章
- Android自定义之TextView跑马灯的监听
TextView都有跑马灯的效果,如果说让你去监听跑马灯效果的执行,我觉得这个需求有点二了,但是也要实现. 思路: 1.自定义View 继承TextView 这种方法过于麻烦,只是监听一个跑马灯 ...
- ThinkPHP 数据库操作(六) : 查询事件、事务操作、监听SQL
查询事件 查询事件(V5.0.4+) 从 5.0.4+ 版本开始,增加了数据库的CURD操作事件支持,包括: 查询事件仅支持 find . select . insert . update 和 del ...
- ios中键值编码kvc和键值监听kvo的特性及详解
总结: kvc键值编码 1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性) 2. 如果方法属性的关键字和需要数据中的关键字相同的话 ...
- 为不具有change事件的html标签设置监听事件
change事件会在文本内容或选项被更改时触发. 该事件仅适用于<input type="text">和<textarea>以及<select> ...
- 学习Android过程中遇到的问题及解决方法——电话监听
也许有时你会有这样一个需求:通电话时有一个重要的事需要记下来或者和一个陌生人特别是大骗子通话时,这是就想如果能把通话录下来就方便多了.(这才是我写这个代码的目的!!!) 在此过程中,犯了一个很大的错误 ...
- Cloud Foundry中DEA与warden通信完毕应用port监听
在Cloud Foundry v2版本号中,DEA为一个用户应用执行的控制模块,而应用的真正执行都是依附于warden. 更详细的来说,是DEA接收到Cloud Controller的请求:DEA发送 ...
- 监听浏览器tab选项卡选中事件,点击浏览器tab标签页回调事件,浏览器tab切换监听事件
js事件注册代码: <script> document.addEventListener('visibilitychange',function(){ //浏览器tab切换监听事件 if( ...
- vue data中的对象的属性如何使用watch监听
在写项目的时候遇到了一个问题,就是需要动态监听data中一个对象的属性的变化.遇到了许多坑,在此过程中也发现了两种解决方案. 一.通过deep属性实现 data() { return { parent ...
- sencha touch dataview 中添加 button 等复杂布局并添加监听事件
config 中的属性默认都会自动生成 getter setter applier updater 四个方法. applier 在调用 setter 时被调用, updater 在属性值 ...
- bootstrap 事件shown.bs.modal用于监听并执行你自己的代码【写hostmanger关联部门遇到的问题及解决方法】
背景:记录写hostmanger中用户下拉框关联部门遇到的问题及解决方法 问题:需求是展示页面展示用户所属的部门,点击修改按钮后,弹出对应的model,这个时候部门的select要默认选中用户所在的s ...
随机推荐
- 82.9K star!全平台AI助手神器,一键部署轻松搞定!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 项目介绍 轻量极速的AI对话平台,支持Web/iOS/Mac/Android多端运行,轻松接 ...
- 【大前端攻城狮之路】用 Typewriter-SSE 实现打字机效果
在现代 Web 开发中,实现动态文本渲染的需求日益增多.无论是聊天应用.实时通知,还是交互式界面,打字机风格的文本渲染都能显著提升用户体验.最近新写了一个开源的 NPM 包--Typewriter-S ...
- CV中常用Backbone-2:ConvNeXt模型详解及其代码
之前介绍了CV常用Backbon: CV中常用Backbone-1:Resnet/Unet/Vit系列/多模态系列等)以及代码 这里介绍新的一个Backbone:ConvNeXt,主要来自两篇比较老的 ...
- [java与https]第一篇、证书杂谈
一.算法.密钥(对).证书.证书库 令狐冲是个马场老板,这天,他接到店里伙计电话,说有人已经签了租马合同,准备到马场提马,,他二话不说,突突突就去了,到了之后,发现不认识租客. 令狐冲说,你把你租马合 ...
- django实例(1)
Urls.py from django.contrib import adminfrom django.conf.urls import urlfrom cmdb import viewsurlpat ...
- Java Solon v3.3.0 发布(国产优秀应用开发基座)
Solon 框架! Solon 是新一代,Java 企业级应用开发框架.从零开始构建(No Java-EE),有灵活的接口规范与开放生态.采用商用友好的 Apache 2.0 开源协议,是" ...
- C#之BitConverter.ToInt16
byte[] bytes = { 1,3 }; short s = BitConverter.ToInt16(bytes,0); Console.WriteLine(s); 从低位到高位填充: 000 ...
- 对比分析LinkedBlockingQueue和SynchronousQueue
缘起 最近在 review 同事代码时,看到其使用了org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor 来构建线程池,而没 ...
- 五、小程序网络API·天气查询
本节主要介绍使用小程序网络API的相关应用制作一款天气查询小程序.掌握wx.request接口的用法. 前期准备:自行到和风天气官网(https://dev.qweather.com/) 申请API的 ...
- git clone速度慢?教你用最简单的方法解决最恶心的问题!
以前解决Github文件下载速度慢的方法只有挂代理或者导入Gitee,最近又发现一种新的解决方案. 只要把github.com换成hub.fastgit.org就可以解决问题了!具体的在下面的图片 介 ...