FreeSwitcch(java使用)
FreeSwitcch安装(此处以Win系统为例)
转载:https://blog.csdn.net/angellee1988/article/details/101615596
安装地址:https://files.freeswitch.org/windows/installer/x64/(我安装的是1.10.7的)
FreeSwitcch配置
默认安装位置:C:\Program Files\FreeSWITCH
用户连接配置
可参照:https://blog.csdn.net/angellee1988/article/details/101615596的配置,
FreeSwitch默认设置了20个用户,如果需要更多的用户,那么只需要简单的三步就可以完成。
在conf/directory/default/中增加一个用户配置文件 修改拨号计划(Dialplan)使其它用户可以呼叫它
重新加载配置使其生效
要添加用户Jason,分机号是1020,只需要到conf/directory/default目录下,将1000.xml拷贝到1020.xml,然后打开1020.xml,将所有1000都改为1020,并把effective_caller_id_name的值改为Jason,然后保存退出。如:
接下来,打开 conf/dialplan/default.xml,找到
<condition fied=“destionation_number” expression=“^(10[01][0-9]) $” >
行,将其改为:<condition field=“destionation_number”
expresstion=“^(10[01][0-9]|1020) $” >保存退出,回到控制台,然后执行reloadxml命令或按快捷键F6,使新的配置生效,那么新用户1020便添加成功。
freeSwitch的外呼配置
1.找到FreeSWITCH\conf\sip_profiles\internal.xml文件
//第133行左右将 <param name="local-network-acl" value="localnet.auto"/>
// 改为 <param name="local-network-acl" value="lan"/><!-- <param name="local-network-acl" value="localnet.auto"/> --><param name="local-network-acl" value="lan"/>
2.找到FreeSWITCH\conf\vars.xml文件
参考 :https://www.jianshu.com/p/84cc0c6d1d66
//约314行<X-PRE-PROCESS cmd="stun-set" data="external_sip_ip=你的ip"/>
3.找到FreeSWITCH\conf\autoload_configs\acl.conf.xml文件
//将12行-16行,改成如下<list name="lan" default="allow"><!-- <node type="deny" cidr="192.168.42.0/24"/> --><!-- <node type="allow" cidr="192.168.42.42/32"/> --><node type="allow" cidr="0.0.0.0/0"/></list>
FreeSwitcch使用
SIP软件的使用
https://www.microsip.org/downloads(软电话的软件)
可修改和配置用户
前端demo
下载地址:https://download.csdn.net/download/weixin_41922440/78129707
javaj和FreeSwitch连接(esl)
可参照:https://www.cnblogs.com/yjmyzz/p/freeswitch-esl-java-client-turorial.html
- 包引入
<dependency><groupId>org.freeswitch.esl.client</groupId><artifactId>org.freeswitch.esl.client</artifactId><version>0.9.2</version>
</dependency>
- 主要程序连接
package com.cnblogs.yjmyzz.freeswitch.esl;import org.freeswitch.esl.client.IEslEventListener;
import org.freeswitch.esl.client.inbound.Client;
import org.freeswitch.esl.client.inbound.InboundConnectionFailure;
import org.freeswitch.esl.client.transport.event.EslEvent;/*** @author 菩提树下的杨过*/
public class InboundApp {public static void main(String[] args) throws InterruptedException {Client client = new Client();try {//连接freeswitchclient.connect("localhost", 8021, "ClueCon", 10);client.addEventListener(new IEslEventListener() {@Overridepublic void eventReceived(EslEvent event) {String eventName = event.getEventName();//这里仅演示了CHANNEL_开头的几个常用事件if (eventName.startsWith("CHANNEL_")) {String calleeNumber = event.getEventHeaders().get("Caller-Callee-ID-Number");String callerNumber = event.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 = event.getEventHeaders().get("variable_current_application_response");String hangupCause = event.getEventHeaders().get("Hangup-Cause");System.out.println("用户挂断, 主叫:" + callerNumber + " , 被叫:" + calleeNumber + " , response:" + response + " ,hangup cause:" + hangupCause);break;default:break;}}}@Overridepublic void backgroundJobResultReceived(EslEvent event) {String jobUuid = event.getEventHeaders().get("Job-UUID");System.out.println("异步回调:" + jobUuid);}});client.setEventSubscriptions("plain", "all");//这里必须检查,防止网络抖动时,连接断开if (client.canSend()) {System.out.println("连接成功,准备发起呼叫...");//(异步)向1000用户发起呼叫,用户接通后,播放音乐/tmp/demo1.wavString callResult = client.sendAsyncApiCommand("originate", "user/1000 &playback(/tmp/demo.wav)");System.out.println("api uuid:" + callResult);}} catch (InboundConnectionFailure inboundConnectionFailure) {System.out.println("连接失败!");inboundConnectionFailure.printStackTrace();}}
}
代码稍微解释一下:
a)18行,连接fs的用户名、密码、端口,可以在freeswitch安装目录下conf/autoload_configs/event_socket.conf.xml
找到
<configuration name="event_socket.conf" description="Socket Client"><settings><param name="nat-map" value="false"/><param name="listen-ip" value="0.0.0.0"/><param name="listen-port" value="8021"/><param name="password" value="ClueCon"/><!--<param name="apply-inbound-acl" value="loopback.auto"/>--><!--<param name="stop-on-bind-error" value="true"/>--></settings>
</configuration>
强烈建议,把第4行listen-ip改成0.0.0.0(或具体的本机ip地址),默认的::是ipv6格式,很多情况会导致esl
client连接失败,改成0.0.0.0相当于强制使用ipv4b) 考虑到网络可能发生抖动,在发送命令前,建议参考60行的做法,先判断canSend()
c) 61行,client.sendAsyncApiCommand
这里以异步方式,发送了一个命令给fs(即:呼叫1000用户,接通后再放段声音)。异步方式下,命令是否发成功当时并不知道,但是这个方法会返回一个uuid的字符串,fs收到后,会在backgroundJobResultReceived回调中,把这个uuid再还回来,参见上面贴出的输出结果。(基于这个机制,可以做些重试处理,比如:先把uuid存下来,如果约定的时间内,uuid异步回调还没回来,可以视为发送失败,再发一次)重要提示:esl java client
0.9.2这个版本,inbound模式下,长时间使用有内存泄露问题,网上有很多这个介绍及修复办法,建议生产环境使用前,先修改esl client的源码。
需要注意新用户的添加和SIP的开启,只有满足呼叫用户都是在用户列表中的,且被呼叫对象已经注册,才回呼叫成功
java后端动态生成用户的方法
需要注意的是,这个生成需要以管理员身份运行IDEA
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class FreeSwitchUtils {public static void CreateFreeswitchUser(Long sipId) throws IOException, InterruptedException {String template = "C:\\Program Files\\FreeSWITCH\\conf\\directory\\default\\";String templateContent = read(template + "1000.xml");//创建指定用户String newUser = StringUtils.leftPad(sipId + "", 3, '0');String newContent = templateContent.replaceAll("1000", newUser);String newFileName = template + newUser + ".xml";write(newFileName, newContent);System.out.println(newFileName + " done!");}static String read(String fileName) throws IOException {File f = new File(fileName);if (f.exists()) {FileInputStream fs = new FileInputStream(f);String result = null;byte[] b = new byte[fs.available()];fs.read(b);fs.close();result = new String(b);return result;} else {return null;}}static void write(String fileName, String fileContent) throws IOException {File f = new File(fileName);if (f.exists()) {f.delete();}FileOutputStream fs = new FileOutputStream(f);fs.write(fileContent.getBytes());fs.flush();fs.close();}
}
查看对象是否注册:sofia status profile internal reg
FreeSwitcch(java使用)相关推荐
- springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据
SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...
- Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几
Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...
- 在k8s中使用gradle构建java web项目镜像Dockerfile
在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...
- Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常
kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...
- SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos
SpringBoot项目使用nacos kotlin demo见Gitte 一.引入依赖 提示:这里推荐使用2.2.3版本,springboot与nacos的依赖需要版本相同,否则会报错. maven ...
- OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3
OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...
- Gradle错误提示:Java home supplied via ‘xxx.xxx.xxx‘ is invalid
Gradle错误提示:Java home supplied via 'org.gradle.java.home' is invalid 描述:在使用idea采用gradle进行依赖的管理功能,当想切换 ...
- 查看Hotspot源码,查看java各个版本源码的网站,如何查看jdk源码
java开发必知必会之看源码,而看源码的第一步则是找到源码
- java基本类型转换,随记
java基本类型转换: double double 转 long double random = Math.round(Math.random()*10000); long l = new Doubl ...
最新文章
- Asp.Net 使用 GDI+ 绘制3D饼图入门篇源码
- 机器视觉+常识+概念
- python之常见问题集锦
- Elasticsearch Query DSL基础介绍
- 微信中H5同层Video播放器接入教程
- 五一黄金周之二:可以吃人的博物馆
- 基于boost asio实现的支持ssl的通用socket框架
- PyTorch 入坑八:卷积与转置卷积
- VBA基本语法及基本使用
- 基于Vivado的程序下载
- PLSQL修改表字段长度报ORA-25150错
- 通过HTML5 JS实现CAD在线看图,CAD浏览器,HTML5画布和Javascript /浏览器开发的性能限制...
- rplidar适配说明
- 分享33个超棒的海洋地貌风光图片
- 证监会拟将QFII、RQFII两项制度合二为一
- win 10 设置透明图表显示为黑色方块问题
- WebRTC技术详解
- FLV文件(H264 + AAC)格式超详细分析
- 中国互联网还不到躺平的时候!
- 宝宝生活点滴(2009.12)