FreeSWITCH Java ESL Client Demo
1简介
在开启Java ESL Client编程之前,请先阅读《FreeSWITCH权威指南》学习什么是FreeSWITCH Event Socket。
Java连接FreeSWITCH的ESL可以采用两种模式:inbound和outbound。
-
Inbound模式:Java应用作为客户端主动连接到FreeSWITCH的内置TCP服务器上,默认监听8021端口。连接成功后,Java应用可以订阅FreeSWITCH的各种事件通知,并对特定事件进行处理,也可以向FreeSWITCH发送命令。例如,通过Java应用可以获取来电事件,并且可以控制呼叫流程,如发送异步API命令发起呼叫 。
-
Outbound模式:Java应用作为服务器端,FreeSWITCH作为客户端连接到Java应用。这种模式下,需要在FreeSWITCH配置中指定Java应用的IP和端口。当有来电时,FreeSWITCH会连接到Java应用,Java应用可以根据业务需求对通话进行处理,如播放音乐或转接呼叫 。
选择哪种模式取决于具体的业务需求。如果需要监控所有来电情况或实现自助语音服务,inbound模式可能更合适。而如果需要对来电进行人工客服分配,outbound模式可能更简单 。另外,Java ESL客户端库支持这两种模式,并且提供了丰富的API来处理ESL连接和事件 。
在实际开发中,开发者可以根据需要选择适合的连接模式,并利用Java ESL客户端提供的接口来实现与FreeSWITCH的交互。
Java ESL客户端通过与FreeSWITCH的Event Socket Library(ESL)交互,能够实现以下操作:
-
连接管理:建立与FreeSWITCH的连接,并处理连接的生命周期,包括断开和重连。
-
事件订阅:订阅FreeSWITCH产生的各种事件,如呼叫开始、结束、通道变更等。
-
事件处理:接收并处理来自FreeSWITCH的事件通知,允许应用根据事件执行业务逻辑。
-
发送API命令:向FreeSWITCH发送同步或异步API命令来控制呼叫流程,例如发起呼叫、挂断、转接等。
-
执行异步命令:发送异步命令并接收结果,如查询呼叫状态、执行数据库操作等。
-
同步命令执行:发送同步命令并等待其执行结果,适用于需要即时反馈的操作。
-
设置呼叫变量:在呼叫过程中设置或修改呼叫变量,以控制FreeSWITCH的行为。
-
用户和设备管理:通过API命令管理SIP用户、分机、IVR流程等。
-
呼叫录音:控制呼叫录音的开始和停止。
-
呼叫监听和监视:监听特定呼叫的音频流或监视呼叫状态。
-
发送DTMF:向正在通话的通道发送DTMF信号。
-
应用执行:在呼叫中执行特定的FreeSWITCH应用,如播放音乐、发送短信等。
-
错误处理:处理与FreeSWITCH连接或命令执行过程中可能出现的错误。
-
日志记录:记录与FreeSWITCH交互的日志信息,方便问题排查。
-
自定义协议支持:实现自定义的ESL协议命令,以支持FreeSWITCH的高级特性。
-
多线程和并发处理:支持多线程环境下的并发调用和事件处理。
-
资源管理:管理与FreeSWITCH的连接资源,优化连接使用效率。
Java ESL客户端作为一个强大的工具,允许开发者通过编程方式与FreeSWITCH进行交互,实现复杂的呼叫处理和通信应用(fs_cli)。
2实现
2.1maven依赖
<dependency>
<groupId>org.freeswitch.esl.client</groupId>
<artifactId>org.freeswitch.esl.client</artifactId>
<version>0.9.2</version>
</dependency>
2.2代码
package org.example;import org.freeswitch.esl.client.IEslEventListener;
import org.freeswitch.esl.client.inbound.Client;
import org.freeswitch.esl.client.transport.event.EslEvent;/*** @author yrz* @create 2024/08/20*/
public class ESLClient {private static final String HOST = "10.192.33.34";private static final int PORT = 8021;private static final String PASSWORD = "ClueCon";private static String job_UUID = null;public static void main(String[] args) {InBound();}private static void InBound() {final Client client = new Client();try {client.connect(HOST, PORT, PASSWORD, 20);System.out.println("连接成功");} catch (Exception e) {System.out.println("连接失败");}client.addEventListener(new IEslEventListener() {@Overridepublic void eventReceived(EslEvent event) {if (event.getEventName().equals("CHANNEL_ANSWER")) {System.out.println("通道应答");} else if (event.getEventName().equals("HEARTBEAT")) {System.out.println("收到心跳 --> " + event.getEventBodyLines());job_UUID = client.sendAsyncApiCommand("status", null);System.out.println("Job_UUID --> " + job_UUID);} else if (event.getEventName().equals("CHANNEL_DESTROY")) {System.out.println("通道销毁");} else if (event.getEventName().equals("CHANNEL_HANGUP_COMPLETE")) {//挂断System.out.println("通道挂断完成");} else if (event.getEventName().equals("CHANNEL_CREATE")) {System.out.println("通道创建");}}@Overridepublic void backgroundJobResultReceived(EslEvent event) {String uuid = event.getEventHeaders().get("Job-UUID");if (job_UUID.equals(uuid)) {for (String s : event.getEventBodyLines()) {System.out.println(s);}}}});client.setEventSubscriptions("plain", "all");}
}
/*
播打电话
String originate = client.sendAsyncApiCommand("originate", CallEnum.CALL_BRIDGE);
类型
//相当于1001给1002打电话 {origination_caller_id_number=1001}可以设置1001方显示名字(默认是0000000)
public static final String CALL_BRIDGE = "{origination_caller_id_number=1002}user/1001 &bridge(user/1002)";
// 给1001打电话,channel启动echo app(类似汤姆猫) 并修改名字和号码
public static final String CALL_CHANNEL_CHANGE_NAME = "{origination_caller_id_name='Zhang San',origination_caller_id_number=1234}user/1001 &echo";
//等价于 user/1001 &echo
public static final String CALL_DIALPLAN_XML = "user/1001 echo inline";
// 给1001通话,channel启动playback app(播放录音)
public static final String CALL_PLAYBACK = "{origination_caller_id_name='Zhang San',origination_caller_id_number=1234}user/1001 &playback(/播放文件路径)";
// 顺振 第一个呼叫失败,呼叫第二个,以此类推
public static final String CALL_PARAMAGNETIC_RESONANCE = "user/1001|user/1002 &echo";
// 同振 同时呼叫 谁先接听谁通话,另一个挂断
public static final String CALL_WITH_VIBRATION = "user/1001,user/1002 &echo";
// 服务器先给1001打,1001接听后进入dialplan,找到1002这个exten,最后执行&echo
public static final String CALL_EXTEN = "user/1001 1002";
// 在1001接听后进入public dialplan查找路由
public static final String CALL_DIALPLAN_CONTEXT = "user/1001 1002 XML public";
// 在呼叫时,在SDP里面向对方提供G729 PCMU编码,但在执行是会缺少PCMU编码 需要转义字符\或者^^: {absolute_codec_string=G729\,PCMU}user/1001 &echo 或者下面的
public static final String CALL_ESCAPE_CODEC = "{absolute_codec_string=G729^^:PCMU}user/1001 &echo";
*/
3问题处理
3.1mod_event_socket.c:2674 IP ::ffff Rejected by acl “loopback.auto”
event socket默认监听地址为127.0.0.1。
在event_socket.conf.xml配置文件中,取消该行注释:
<param name="apply-inbound-acl" value="loopback.auto"/>
在acl.conf.xml中增加:
<list name="loopback.auto" default="allow"> <node type="allow" cidr="0.0.0.0"/>
</list>
/***********************************************/
<list name="loopback.auto" default="allow"> <node type="allow" cidr="0.0.0.0/0"/>
</list>
reloadxml
reloadacl
4参考文档
https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Client-and-Developer-Interfaces/Java-ESL/Java-ESL-Client_7144076/
https://github.com/esl-client/esl-client
https://sunxiaodou.com/2017/08/02/java-esl-freeswitch/
https://blog.csdn.net/qq_40170041/article/details/127015890
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
FreeSWITCH Java ESL Client Demo
1简介 在开启Java ESL Client编程之前,请先阅读《FreeSWITCH权威指南》学习什么是FreeSWITCH Event Socket。 Java连接FreeSWITCH的ESL可以采用两种模式:inbound和outbound。 Inbound模式:Java应用作为客户端主动连接到FreeSWITCH的内置TCP…...
![](https://i-blog.csdnimg.cn/direct/5cde990fe7a9421e9e60e685ec5d4f67.png)
手摸手系列之Linux下根据自己的jdk包构建docker镜像
项目在本地导出PDF文件正常,部署到Linux服务器docker容器中导出就报错,百撕不得姐,经查,docker依赖的openjdk版本是8u112版本,而我本地是8u421版本,那就升级jdk的小版本试试。 在docker的中央仓库[点我直达…...
![](https://i-blog.csdnimg.cn/direct/5c4b921e386440d7b9fa4110b17e2a16.png)
tomcat相关
一、部署安装tomcat 在10和20上安装tomcat [root10 ~]# dnf install java-1.8.0-openjdk.x86_64 -y #安装java环境 [root10 ~]# tar zxf apache-tomcat-9.0.93.tar.gz -C /usr/local/ #安装并启动tomcat [root10 ~]# ln -s /usr/local/apache-tomcat-9.0.93/ /usr/local/tomcat…...
![](https://i-blog.csdnimg.cn/direct/677d685204984d6d84c5f1bef8fb2d4c.jpeg)
20240821给飞凌OK3588-C的核心板刷Rockchip原厂的Buildroot并启动
20240821给飞凌OK3588-C的核心板刷Rockchip原厂的Buildroot并启动 2024/8/21 15:22 viewproviewpro-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ viewproviewpro-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh lunch 3. rockchip_rk3588_evb7_…...
![](https://www.ngui.cc/images/no-images.jpg)
服务优雅上下线优雅停机
一、目的 服务发生线程锁住,需要下线服务时,保证请求中的接口不受影响,执行完后,再下线服务 二、步骤 *kill -15时执行改钩子函数 优雅停机 1.当线程锁住 2.运维那边监控到,然后进行kill -15 进程ID 3.代码这边监…...
![](https://img-blog.csdnimg.cn/img_convert/b69f26807510000987831d5c883916c1.png)
什么是生信分析?深入探讨生物信息学的技术、方法与广泛应用
介绍 生物信息学分析,简称生信分析,是一个结合了生物学、计算机科学、信息学和统计学的多学科领域,旨在处理、分析和解释海量的生物数据。随着现代生物技术的发展,尤其是高通量测序(Next-Generation Sequencing, NGS&…...
![](https://www.ngui.cc/images/no-images.jpg)
JavaScript判断数组是否包含某个值
目录: 1.for循环/while循环2.数组的some方法3.数组的filter方法4.array.indexOf5.array.findIndex6.array.includes7.array.find8.set中的has方法 1.for循环/while循环 for循环: function contains(arr, val) {for (var i 0; i < arr.length; i) {if (arr[i] …...
![](https://www.ngui.cc/images/no-images.jpg)
C# - 如何在Windows系统中通过C#添加新的PATH条目至系统和用户环境变量
编写系统环境变量-->系统变量-->path-->添加新的列 01:直接写 using Microsoft.Win32; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace updatesystempath01 {class Program{stati…...
![](https://i-blog.csdnimg.cn/direct/5fbb52cb8c4b435b920339dc22d27543.png)
Unity | Shader基础知识(第二十二集:两次渲染)
目录 一、前言 二、“渲染两次” 三、本次成品介绍 四、第一次渲染代码 五、第二次渲染代码 六、截止目前的所有代码 七、调整代码 八、总结 一、前言 之前一直讲的shader文件中,都只写了一次CG代码。 为了大家对这部分的整体理解,我们这次渲…...
![](https://i-blog.csdnimg.cn/direct/b9faa7874e1a4e1e8ca9a6f365464f17.jpeg)
鸿蒙Harmony实战开发:Arkts构造函数
构造函数 类声明可以包含用于初始化对象状态的构造函数。 构造函数定义如下: constructor ([parameters]) {// ... } typescript 如果未定义构造函数,则会自动创建具有空参数列表的默认构造函数,例如: class Point {x: numbe…...
![](https://www.ngui.cc/images/no-images.jpg)
@vueuse/core使用useColorMode实现主题颜色切换
useColorMode 是一个在前端开发中常用的自定义钩子(Hook),尤其在需要支持深色模式和浅色模式切换的场景下。这个钩子可以根据用户的选择或系统设置动态调整页面样式。 一、安装和引入 npm install vueuse/core # 或者 yarn add vueuse/…...
![](https://img-blog.csdnimg.cn/img_convert/48f28c25bf4d86cb2f746fe8e3e69d3b.png)
生信分析入门:从基础知识到实践操作的全方位指南
随着生物学研究的数字化转型,生物信息学(简称生信)分析已经成为现代生命科学研究中的关键工具。对于刚开始接触生信分析的初学者来说,这个领域可能看起来复杂而陌生。然而,通过系统的学习和实践,生信分析可…...
![](https://www.ngui.cc/images/no-images.jpg)
【STM32 FreeRTOS】内存管理
除了FreeRTOS提供的动态内存管理方法,标准的C库也提供了函数malloc()和函数free()来实现动态的申请和释放内存。 为啥不用标准的C库自带的内存管理算法?因为标准C库的动态管理方法有如下缺点: 占用大量的代码空间,不适合用在资源…...
![](https://www.ngui.cc/images/no-images.jpg)
vue3+vite+cesium配置参考
在vite项目中使用Cesium的配置 关键: 资源目录的复制;CESIUM_BASE_URL的正确配置 //vite.config.js // ... // 安装打包复制资源插件,手动复制不需要 // npm i vite-plugin-static-copy import { viteStaticCopy } from vite-plugin-static-c…...
![](https://i-blog.csdnimg.cn/direct/c128934d3c654401aec911ef64410558.png)
WEB应用服务器TOMCAT
知识点 一 、WEB技术 1、前端三大核心技术 1.1 HTML HTML ( HyperText Markup Language )超文本标记语言,它不同于一般的编程语言。超文本 即超出纯文本的范畴,例如:描述文本颜色、大小、字体等信息,或使…...
![](https://www.ngui.cc/images/no-images.jpg)
maven打包jar后运行提示“没有主清单属性”问题的几种解决方案
常用的几种maven项目打包后,jar运行提示“没有主清单属性”问题的解决方案,大部分都是要修改pom.xml文件,同时有几种自己常用的配置文件,主要供自用,勿喷。 第一种: <build><plugins><plug…...
![](https://i-blog.csdnimg.cn/direct/06e9982331f441a19440d0c8380aecbb.png)
计算机毕业设计选题推荐-民宿可视化分析-Python爬虫-随机森林算法
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...
![](https://i-blog.csdnimg.cn/direct/141a6a8e7c53479e987bec68e56fbe28.png)
WKWebView加载项目中网页的资源图片路径异常
问题原因,将含有html的文件通过如下方式引入到工程中: 这种处理方式,当应用程序变以后,引入的文件会被全部放在Resources目录下,而忽略你原本的文件路径信息。因此导致出问题。 解决方案: 采用如下方式引…...
![](https://i-blog.csdnimg.cn/direct/67952b2813134a2c81c1e658981d7a29.jpeg#pic_center)
算法全面剖析
算法 查找算法: 顺序查找: 基本思想: 顺序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功&am…...
![](https://i-blog.csdnimg.cn/direct/08a6464445934e758c3228e5092b95c0.png)
tp5php7.4配置sqlserver问题汇总
先修改database.php文件 查看php版本选择sqlserver扩展 通过百度网盘分享的文件:sqlserver 链接:https://pan.baidu.com/s/1zrIV8VWQZM9miLpyH01Aww?pwdxdgx 提取码:xdgx 通过我的分享链接复制自己需要的dll到php的ext下 在php.ini里添加扩…...
![](https://www.ngui.cc/images/no-images.jpg)
C语言随笔:字面量
字面量(Literal)是指程序源代码中直接写出的固定值。字面量用于表示数据常量,它们在程序编译时被直接解析并用于程序运行。 常见的字面量类型 整数字面量(Integer Literals) 描述:表示整数值。示例&#x…...
![](https://i-blog.csdnimg.cn/direct/964b2e9fe12f4962897392e8ccad0eec.png)
chainlit的基本概念聊天对话中的元素
文本消息是聊天机器人的组成部分,但我们通常希望向用户发送的不仅仅是文本,还包括图像、视频等。 这就是元素出现的地方。每个元素都是一段内容,可以附加到Message或Step 并显示在用户界面上。 chainlit支持的元素如下: 文本元…...
![](https://www.ngui.cc/images/no-images.jpg)
【LeetCode:3】无重复字符串的最长子串(Java)
题目链接 3. 无重复字符串的最长子串 题目描述 给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: s “bbb…...
![](https://www.ngui.cc/images/no-images.jpg)
C#对字典使用Linq查询
Dictionary<int, int> dic new Dictionary<int, int>();dic.Add(1, 2);dic.Add(2, 3);dic.Add(3, 4);dic.Add(4, 5);dic.Add(5, 6);//筛选键var keys dic.Where(item > item.Key > 2).Select(item > item.Key);foreach (var item in keys){Console.Writ…...
![](https://www.ngui.cc/images/no-images.jpg)
【Vue】Vue基础
系列文章目录 第二章 Vue基础(1) 文章目录 系列文章目录第一节:Vue介绍一、Vue介绍二、Vue项目创建三、项目结构介绍 第二节:组合式API一、基本介绍二、setup介绍三、setup上指定组件名称 第三节:响应式变量一、使用r…...
![](https://i-blog.csdnimg.cn/direct/3f97dea913744a5fba2d7bcea8714f0a.png)
贪心 + 分层图bfs,newcoder 76652/B
目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 https://ac.nowcoder.com/acm/contest/76652/B 二、解题报告 1、思路分析…...
![](https://www.ngui.cc/images/no-images.jpg)
如何在Linux上部署Java Web应用程序
在Linux上部署Java Web应用程序是一个常见的任务,本文将介绍一种常用的方法,分为以下几个步骤: 准备服务器 首先,你需要准备一台运行Linux操作系统的服务器。你可以选择使用各种不同的Linux发行版,如Ubuntu、CentOS等…...
![](https://img-blog.csdnimg.cn/img_convert/ecc42894101295da612341650d086576.jpeg)
SpringBoot 整合 Excel 轻松实现数据自由导入导出
01、背景介绍 在实际的业务系统开发过程中,操作 Excel 实现数据的导入导出基本上是个非常常见的需求。 之前,我们有介绍一款非常好用的工具:EasyPoi,有读者提出在数据量大的情况下,EasyPoi 会占用内存大,…...
![](https://www.ngui.cc/images/no-images.jpg)
PyTorch 基础学习(13)- 混合精度训练
系列文章: 《PyTorch 基础学习》文章索引 基本概念 混合精度训练是深度学习中一种优化技术,旨在通过结合高精度(torch.float32)和低精度(如 torch.float16 或 torch.bfloat16)数据类型的优势,…...
![](https://i-blog.csdnimg.cn/direct/7772a09176354393abf15e7ae5aef7fd.png)
Mycat分片-垂直拆分
目录 场景 配置 测试 全局表配置 续接上篇:MySQ分库分表与MyCat安装配置-CSDN博客 续接下篇:Mycat分片-水平拆分-CSDN博客 场景 在业务系统中, 涉及以下表结构 ,但是由于用户与订单每天都会产生大量的数据, 单台服务器的数据 存储及处理能力是有限…...
![](/images/no-images.jpg)
国际贸易综合服务平台/企业seo优化服务
Target runtime xxx is not define. 运行时库没找到解决方法:1. 工程目录的.settings2. 找到runtime name为runtime com.genuitec.runtime.generic.jee60的文件3. 修改为当前的运行时库,比如Apache tomcat v7.0 <script>window._bd_share_config{…...
![](/images/no-images.jpg)
中国智慧团建网站/灰色推广
<h2>PHP介绍</h2> PHP 重写PHP解释器并改称 Hypertext Preprocessor PHP5支持了面向对象的编程 PHP的优点 1,语法简单 2,学习成本低 3,开发效率高 4,跨平台 5,开发部署方便 6,开源框架非常丰富(如 ThinkPHP) 7,开源CMS系统非常丰富(如:Joomla,WordPress) 8,开源网…...
![](/images/no-images.jpg)
哪个视频网站有潮汕做爰视频/google浏览器下载
半岛记者 王磊7月8日上午,没有考试科目,即墨萃英中学高三17班班主任雒仁涛和往常一样坐在教室前面的门口,一边做着手头的工作,一边陪伴着他的每一个学生。对于送过15届高三毕业班的班主任来说,高考送考已经是轻车熟路&…...
![](https://img-blog.csdnimg.cn/img_convert/4751e4d1c7abe41f7e66927ee4fbee1c.png)
泉州哪里建设网站/搜索关键词排行榜
写在开头: 说下我的经历吧。湖南大学毕业,学的是软件工程,那时候比较贪玩,专业知识学的不是很扎实,毕业后就在长沙本地找了家互联网公司工作了。 到今年六月份的话刚好毕业了五年了,同期和我一起出来的同学…...
![](/images/no-images.jpg)
怎样注册自己网站/西安seo优化培训
中级后端程序员提升薪资的重要点在于:1.项目经验:支付,通知,微信,IM,短信等公用模块快迅实现。2.代码质量:抽象封装,日志规范,发布流程,快速定位。3.性能优化…...
![](https://qzs.qzone.qq.com/qzone/space_item/orig/9/81177_dec5.jpg)
课程培训网站模板下载/软文推广文章范文1000
开通黄钻 下载地址汇总android genymotion :http://files2.genymotion.com/genymotion/genymotion-2.5.4/genymotion-2.5.4-vbox.exehttp://www.my97.net/dp/demo/resource/2.4.asp#m242 日历插件转载于:https://www.cnblogs.com/ygw1010/p/6564262.html...