北京做网站设计公司,wordpress博客模板缺少插件,ui培训机构设计,制作宣传片视频1简介
在开启Java ESL Client编程之前#xff0c;请先阅读《FreeSWITCH权威指南》学习什么是FreeSWITCH Event Socket。
Java连接FreeSWITCH的ESL可以采用两种模式#xff1a;inbound和outbound。 Inbound模式#xff1a;Java应用作为客户端主动连接到FreeSWITCH的内置TCP…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 LibraryESL交互能够实现以下操作 连接管理建立与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
groupIdorg.freeswitch.esl.client/groupId
artifactIdorg.freeswitch.esl.client/artifactId
version0.9.2/version
/dependency2.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_number1001}可以设置1001方显示名字默认是0000000
public static final String CALL_BRIDGE {origination_caller_id_number1002}user/1001 bridge(user/1002);
// 给1001打电话channel启动echo app类似汤姆猫 并修改名字和号码
public static final String CALL_CHANNEL_CHANGE_NAME {origination_caller_id_nameZhang San,origination_caller_id_number1234}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_nameZhang San,origination_caller_id_number1234}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_stringG729\,PCMU}user/1001 echo 或者下面的
public static final String CALL_ESCAPE_CODEC {absolute_codec_stringG729^^: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 nameapply-inbound-acl valueloopback.auto/在acl.conf.xml中增加
list nameloopback.auto defaultallow node typeallow cidr0.0.0.0/
/list
/***********************************************/
list nameloopback.auto defaultallow node typeallow cidr0.0.0.0/0/
/listreloadxml
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