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相当于强制使用ipv4

b) 考虑到网络可能发生抖动,在发送命令前,建议参考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使用)相关推荐

  1. springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据

    SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...

  2. Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几

    Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...

  3. 在k8s中使用gradle构建java web项目镜像Dockerfile

    在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...

  4. Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常

    kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...

  5. SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos

    SpringBoot项目使用nacos kotlin demo见Gitte 一.引入依赖 提示:这里推荐使用2.2.3版本,springboot与nacos的依赖需要版本相同,否则会报错. maven ...

  6. OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3

    OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...

  7. Gradle错误提示:Java home supplied via ‘xxx.xxx.xxx‘ is invalid

    Gradle错误提示:Java home supplied via 'org.gradle.java.home' is invalid 描述:在使用idea采用gradle进行依赖的管理功能,当想切换 ...

  8. 查看Hotspot源码,查看java各个版本源码的网站,如何查看jdk源码

    java开发必知必会之看源码,而看源码的第一步则是找到源码

  9. java基本类型转换,随记

    java基本类型转换: double double 转 long double random = Math.round(Math.random()*10000); long l = new Doubl ...

最新文章

  1. Asp.Net 使用 GDI+ 绘制3D饼图入门篇源码
  2. 机器视觉+常识+概念
  3. python之常见问题集锦
  4. Elasticsearch Query DSL基础介绍
  5. 微信中H5同层Video播放器接入教程
  6. 五一黄金周之二:可以吃人的博物馆
  7. 基于boost asio实现的支持ssl的通用socket框架
  8. PyTorch 入坑八:卷积与转置卷积
  9. VBA基本语法及基本使用
  10. 基于Vivado的程序下载
  11. PLSQL修改表字段长度报ORA-25150错
  12. 通过HTML5 JS实现CAD在线看图,CAD浏览器,HTML5画布和Javascript /浏览器开发的性能限制...
  13. rplidar适配说明
  14. 分享33个超棒的海洋地貌风光图片
  15. 证监会拟将QFII、RQFII两项制度合二为一
  16. win 10 设置透明图表显示为黑色方块问题
  17. WebRTC技术详解
  18. FLV文件(H264 + AAC)格式超详细分析
  19. 中国互联网还不到躺平的时候!
  20. 宝宝生活点滴(2009.12)

热门文章

  1. 前端性能优化学习 08 资源加载优化
  2. protues仿真扩展51单片机片外RAM的方法
  3. 问题:鸿蒙安装自开发APP软件显示签名不一致
  4. 计算机科学与技术论文提纲,计算机科学与技术专业论文提纲格式模板 计算机科学与技术专业论文提纲怎样写...
  5. KindEditor使用简介
  6. 黑盒测试方法之正交实验法
  7. EPSON LS3-401S机器人学习笔记 5 - 坐标系
  8. curses函数说明
  9. 电信无线网固定ip参数
  10. 常用端口号及其对应作用