Freeswitch(四):使用java esl写一个FreeSwitchEventListener 服务
使用java esl写一个FreeSwitchEventListener 服务
package com.sip; import com.google.common.base.Throwables; import org.freeswitch.esl.client.IEslEventListener; import org.freeswitch.esl.client.inbound.Client; import org.freeswitch.esl.client.outbound.AbstractOutboundClientHandler; import org.freeswitch.esl.client.outbound.AbstractOutboundPipelineFactory; import org.freeswitch.esl.client.outbound.SocketClient; import org.freeswitch.esl.client.outbound.example.SimpleHangupOutboundHandler; import org.freeswitch.esl.client.transport.event.EslEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory;
import java.util.Map; public class FreeSwitchEventListener { private static Logger logger = LoggerFactory.getLogger(FreeSwitchEventListener.class); public static void main(String[] args) { try { final Client inboudClient = new Client(); inboudClient.connect("192.168.1.196", 8021, "ClueCon", 10); inboudClient.addEventListener(new IEslEventListener() { @Override public void eventReceived(EslEvent eslEvent) { System.out.println(eslEvent.getEventName()); String eventname = eslEvent.getEventName(); if ("CHANNEL_HANGUP_COMPLETE".equals(eventname)) { System.out.println("进入挂机完成事件"); Map<String, String> dd = eslEvent.getEventHeaders(); System.out.println("variable_effective_caller_id_number is::::::" + dd.get("variable_effective_caller_id_number")); } } @Override public void backgroundJobResultReceived(EslEvent eslEvent) { System.out.println("事件名称++++"+eslEvent.getEventName()); } }); inboudClient.setEventSubscriptions("plain", "all"); //发送命令 String re= inboudClient.sendAsyncApiCommand("originate", "user/1000 1001"); System.out.println("呼叫结果:" + re); final SocketClient outboundServer = new SocketClient( 8084, new AbstractOutboundPipelineFactory() { @Override protected AbstractOutboundClientHandler makeHandler() {
//这个类可以自己重写一个 return new SimpleHangupOutboundHandler(); } } ); outboundServer.start(); } catch (Throwable t) { Throwables.propagate(t); } } }
pom文件添加以下依赖
<dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.25</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.freeswitch.esl.client</groupId> <artifactId>org.freeswitch.esl.client</artifactId> <version>0.9.2</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>25.1-jre</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.17.Final</version> <type>bundle</type> </dependency> </dependencies>
小人才疏学浅,看官不喜勿喷,谢谢
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构