Freeswitch代码

1.引入依赖

 Freeswitch依赖版本

<dependency><groupId>org.freeswitch.esl.client</groupId><artifactId>esl-client</artifactId><version>0.10.1</version>
</dependency>

2.代码

import org.freeswitch.esl.client.inbound.Client;
import org.freeswitch.esl.client.inbound.IEslEventListener;
import org.freeswitch.esl.client.internal.Context;
import org.freeswitch.esl.client.internal.IModEslApi;
import org.freeswitch.esl.client.transport.event.EslEvent;
import org.freeswitch.esl.client.transport.message.EslMessage;
import sun.management.resources.agent;import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class ClientTest {private static class DemoEventListener implements IEslEventListener {// @Overridepublic void eventReceived(EslEvent event) {System.out.println("eventReceived:" + event.getEventName());}// @Overridepublic void backgroundJobResultReceived(EslEvent event) {System.out.println("backgroundJobResultReceived:" + event.getEventName());}@Overridepublic void onEslEvent(Context ctx, EslEvent eslEvent) {System.out.println("eventReceived:" + eslEvent.getEventName());System.out.println("EventBody********:" + eslEvent.getEventHeaders().toString());String eventName = eslEvent.getEventName();//这里仅演示了CHANNEL_开头的几个常用事件if (eventName.startsWith("CHANNEL_")) {String calleeNumber = eslEvent.getEventHeaders().get("Caller-Callee-ID-Number");String callerNumber = eslEvent.getEventHeaders().get("Caller-Caller-ID-Number");switch (eventName) {case "CHANNEL_CREATE":System.out.println("发起呼叫, 主叫:" + callerNumber + " , 被叫:" + calleeNumber);break;case "CHANNEL_BRIDGE":System.out.println("用户转接, 主叫:" + callerNumber + " , 被叫:" + calleeNumber);break;case "CHANNEL_ANSWER":System.out.println("用户应答, 主叫:" + callerNumber + " , 被叫:" + calleeNumber);break;case "CHANNEL_HANGUP":String response = eslEvent.getEventHeaders().get("variable_current_application_response");String hangupCause = eslEvent.getEventHeaders().get("Hangup-Cause");System.out.println("用户挂断, 主叫:" + callerNumber + " , 被叫:" + calleeNumber + " , response:" + response + " ,hangup cause:" + hangupCause);break;default:break;}}}}public static void main(String[] args) throws InterruptedException {SocketAddress host = new InetSocketAddress("192.168.5.97", 8021);String password = "ClueCon";int timeoutSeconds = 10;Client inboundClient = new Client();try {inboundClient.connect(host, password, timeoutSeconds);inboundClient.addEventListener(new DemoEventListener());inboundClient.setEventSubscriptions(IModEslApi.EventFormat.PLAIN, "all");/*<--注册分机-->*/EslMessage eslMessage1 =inboundClient.sendApiCommand("callcenter_config agent set contact", "21009@default user/1000");System.out.println("#####dial eslMessage: "+eslMessage1.getHeaders().toString());System.out.println("#####dial eslMessage: "+eslMessage1.getBodyLines().toString()+"=&&="+eslMessage1.getBodyLines().get(0));/*<--查询分机状态-->*/// EslMessage eslMessage=inboundClient.sendApiCommand("list_users", "group default user 1000");//System.out.println("#####eslMessage: "+eslMessage.getHeaders().toString());//System.out.println("#####eslMessage: "+eslMessage.getBodyLines().get(0));/*<--播放欢迎语-->*///inboundClient.sendBackgroundApiCommand("originate", "user/1000 &playback(/usr/local/freeswitch/sounds/huanying.wav)");//inboundClient.sendBackgroundApiCommand("callcenter_config agent set status", "21009@default 'Available'");/*<--就绪-->*///inboundClient.sendBackgroundApiCommand("callcenter_config agent set status", "21009@default 'Available'");/*<--登出-->*///inboundClient.sendBackgroundApiCommand("callcenter_config agent set status", "21009@default 'Logged Out'");/*<--拨打电话异步(没有事件消息)-->*///inboundClient.sendBackgroundApiCommand("originate", "user/1000 1001");/*<--拨打电话同步-->*///EslMessage eslMessage1=inboundClient.sendApiCommand("originate", "user/1000 1001");//System.out.println("#####dial eslMessage: "+eslMessage1.getHeaders().toString());//System.out.println("#####dial eslMessage: "+eslMessage1.getBodyLines().toString()+"&&"+eslMessage1.getBodyLines().get(0));/*<--登录到queue-->*///inboundClient.sendBackgroundApiCommand("callcenter_config tier add", "support@default 21009@default 1 1");//callcenter_config tier set [key(state|level|position)] [queue name] [agent name] [value] //*<--登录到queue-->*/// inboundClient.sendBackgroundApiCommand("callcenter_config tier add", "support@default 21009@default 1 1");//EslMessage eslMessage1=inboundClient.sendApiCommand("callcenter_config tier add", "support@default 21009@default 1 1");;//#####dial eslMessage: [-ERR Tier already exist!]&&-ERR Tier already exist!//System.out.println("#####dial eslMessage: "+eslMessage1.getHeaders().toString());//System.out.println("#####dial eslMessage: "+eslMessage1.getBodyLines().toString()+"&&"+eslMessage1.getBodyLines().get(0));/*<--这个queue未就绪-->*/// support@default 21009@default on break//inboundClient.sendBackgroundApiCommand("callcenter_config tier set state", "support@default 21009@default on break");System.out.println("###################Fs excuted start############");} catch (Exception e) {System.out.println("connect fail error: "+e);}//health-checkScheduledExecutorService service = new ScheduledThreadPoolExecutor(1);service.scheduleAtFixedRate(() -> {System.out.println(System.currentTimeMillis() + " " + inboundClient.canSend());if (!inboundClient.canSend()) {try {//重连inboundClient.connect(host, password, timeoutSeconds);inboundClient.cancelEventSubscriptions();inboundClient.setEventSubscriptions(IModEslApi.EventFormat.PLAIN, "all");} catch (Exception e) {System.out.println("connect fail");}}}, 1, 500000000, TimeUnit.MILLISECONDS);System.out.println("other process ...");}
}

3.模拟请求,包括异步和同步方法

登录,查询分机状态用同步方法,就绪未就绪,拨打电话用异步方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/133597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VR全景如何助力乡村振兴,乡村发展在哪些方面用到VR全景技术

引言&#xff1a; 乡村振兴是当今中国发展的重要战略&#xff0c;也是推动农村经济社会全面发展的关键举措。在这一过程中&#xff0c;虚拟现实&#xff08;VR&#xff09;全景技术正逐渐崭露头角&#xff0c;为乡村振兴提供了机遇。 一&#xff0e;VR全景技术的概念和应用 1…

[科研图像处理]用matlab平替image-j,有点麻烦,但很灵活!

做材料与生物相关方向的同学应该对image-j并不陌生&#xff0c;前几天有个师兄拜托我用image-j分析一些图片&#xff0c;但使用过后发现我由于不了解image-j的工作流程而对结果并不确信&#xff0c;而且image-j的功能无法拓展&#xff0c;对有些图片的处理效果并不好&#xff0…

在Google Kubernetes集群创建分布式Jenkins(一)

因为项目需要&#xff0c;在GKE的集群上需要创建一个CICD的环境&#xff0c;记录一下安装部署一个分布式Jenkins集群的过程。 分布式Jenkins由一个主服务器和多个Agent组成&#xff0c;Agent可以执行主服务器分派的任务。如下图所示&#xff1a; 如上图&#xff0c;Jenkins Ag…

ASO优化之为应用创建屏幕截图的技巧(下)

屏幕截图可以激发潜在用户对我们的应用程序的好奇心和兴趣。我们可以使用它们来吸引用户对产品页面的关注&#xff0c;解释应用程序&#xff0c;并强调其解决用户问题的能力。 1、美化屏幕截图背景。 为了使我们的屏幕截图更加有趣和美观&#xff0c;需要考虑使用背景。设计不…

【微服务】一体化智慧工地管理平台源码

智慧工地系统是一种利用人工智能和物联网技术来监测和管理建筑工地的系统。它可以通过感知设备、数据处理和分析、智能控制等技术手段&#xff0c;实现对工地施工、设备状态、人员安全等方面的实时监控和管理。 一、智慧工地让工程施工智能化 1、内容全面&#xff0c;多维度数…

Day1 ARM基础

【ARM课程认知】 1.ARM课程的作用 承上启下 基础授课阶段&#xff1a;c语言、数据结构、linux嵌入式应用层课程&#xff1a;IO、进程线程、网络编程嵌入式底层课程&#xff1a;ARM体系结构、系统移植、linux设备驱动c/QT 2.ARM课程需要掌握的内容 自己能够实现简单的汇编编…

登录Tomcat控制台,账号密码输入正确但点击登录没反应不跳转到控制台页面

在tomcat-users.xml里面可以查看登录tomcat控制台的账号密码&#xff0c;如果账号密码输入正确还是登录不进去&#xff0c;则很有可能是tomcat的账号被锁了&#xff08;可在catalina.xxx.log里面查看&#xff09;。tomcat账号被锁定后默认情况是不访问控制台后5分钟自动解锁&am…

持续集成交付CICD:安装Jenkins Slave(从节点)

目录 一、实验 1.安装Jenkins Slave&#xff08;从节点&#xff09; 二、问题 1.salve节点启动jenkins报错 2.终止命令行后jenkins从节点状态不在线 一、实验 1.安装Jenkins Slave&#xff08;从节点&#xff09; &#xff08;1&#xff09;查看jenkins版本 Version 2.…

Elasticsearch:搜索架构

Elasticsearch 全文检索的复杂性 为了理解为什么全文搜索是一个很难解决的问题&#xff0c;让我们想一个例子。 假设你正在托管一个博客发布网站&#xff0c;其中包含数亿甚至数十亿的博客文章&#xff0c;每个博客文章包含数百个单词&#xff0c;类似于 CSDN。 执行全文搜索…

11月7日 mybatis缓存

mybatis的缓存 缓存的条件&#xff1a;必须要有存在的数据 一级缓存: SqlSession级别缓存.存储的数据.只能在同一个SalSession有效.默认开启 二级缓存: SqlSessionFactory级别的缓存. SqlSessionFactory只有一个的,单例,全局共享的,不同的 SqlSession共享&#xff0c;默认没有…

基于Java+SpringBoot+Mybaties-plus+Vue+ElementUI 失物招领小程序 设计与实现

一.项目介绍 失物招领小程序 用户登录、忘记密码、退出系统 发布失物 和 发布招领 查看我发布的失物和招领信息 失捡物品模块可以查看和搜索所有用户发布的信息。 二.环境需要 1.运行环境&#xff1a;java jdk1.8 2.ide环境&#xff1a;IDEA、Eclipse、Myeclipse都可以&#…

Linux系统下一些配置建议整理

1. 【推荐】高并发服务器建议调小 TCP 协议的 time_wait 超时时间。 说明&#xff1a;操作系统默认 240 秒后&#xff0c;才会关闭处于 time_wait 状态的连接&#xff0c;在高并发访问下&#xff0c;服 务器端会因为处于 time_wait 的连接数太多&#xff0c;可能无法建立新的…

总结Kibana DevTools如何操作elasticsearch的常用语句

一、操作es的工具 ElasticSearch HeadKibana DevToolsElasticHQ 本文主要是总结Kibana DevTools操作es的语句。 二、搜索文档 1、根据ID查询单个记录 GET /course_idx/_doc/course:202、term 匹配"name"字段的值为"6789999"的文档 类似于sql语句中的等…

电子式电表和智能电表哪个更适合家用?

随着科技的发展&#xff0c;家用电力设备也在不断升级。电子式电表和智能电表作为两种常见的电表类型&#xff0c;究竟哪个更适合家用呢&#xff1f;今天&#xff0c;小编将会从多个角度进行全面分析&#xff0c;帮助大家做出明智的选择。 一、工作原理及准确性比较 1.电子式电…

工业控制系统产业联盟理事长辛耀中一行莅临麒麟信安考察交流

11月4日下午&#xff0c;工业控制系统产业联盟理事长辛耀中率联盟专家莅临麒麟信安考察交流&#xff0c;并先后来到麒麟信安、湖南欧拉生态创新中心展厅参观&#xff0c;麒麟信安董事长杨涛、高级副总裁陈松政、副总裁王攀等热情接待。 在麒麟信安展厅&#xff0c;副总裁王攀对…

JSP 学生成绩查询管理系统eclipse开发sql数据库serlvet框架bs模式java编程MVC结构

一、源码特点 JSP 学生成绩查询管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;比较流行的servlet框架系统具有完整的源代码和数据库&#xff0c;eclipse开发系统主要采用B/S模式 开发。 java 学生成绩查询管理系统 代码下载链接…

解决SpringBoot项目端口被占用的问题

问题描述&#xff1a; 在Window环境下&#xff0c;运行SpringBoot 项目时&#xff0c;出现端口被占用的问题&#xff1a; 解决方案&#xff1a; 1. 查看对应端口的进程号 netstat -ano | findstr 80802. 查看对应进程号的信息 tasklist | findstr 477963. 根据进程号 kill 进程…

【Web】在前端中,HTML<meta>标签

<meta>实例 <head><meta name"description" content"免费在线教程"><meta name"keywords" content"HTML,CSS,XML,JAVASCRIPT"><meta name"author" content"runoob"><meta char…

2.3 - 网络协议 - ICMP协议工作原理,报文格式,抓包实战

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 ICMP协议 1、ICMP协议工作原理2、ICMP协议报文格式…

[C/C++]数据结构 链表OJ题: 反转链表

描述: 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表 示例: 方法一: 让链表指向反向 如图所示: 代码思路: struct ListNode* reverseList(struct ListNode* head) {struct ListNode* n1NULL;struct ListNode* n2head;struct ListNode*…