FreeSWITCH 是一个电话的软交换解决方案,包括一个软电话和软交换机用以提供语音和聊天的产品驱动。FreeSWITCH 可以用作交换机引擎、PBX、多媒体网关以及多媒体服务器等,他支持很多开发语言,作为java开发者之一如何整合freeswitch呢?
本文是作者开发中实际的运行的项目抽取的一部分,由于比较复杂,故分作几个部分加以分析说明(里面涉及到mq等相关知识)。
第一分部 搭建
1.参考freeswitch wiki
如果正在学习freeswitch,而自己项目又是用到的java 或者对java比较熟悉,如何整合呢,首先参考
https://freeswitch.org/confluence/display/FREESWITCH/mod_event_socket 阅读改wiki细节
具体什么是esl,如何连接上面写的很清楚,要是看不懂,那你最好不要玩freeswitch,因为freeswitch 主要参考书还是他的wiki
2.建数据库表
a 为什么需要表呢?
因为第一考虑到好维护, 第二动态添加多个esl实例(一个freeswitch对应一个监听实例),易于灵活扩展
b. 如何建表
参考usr/local/freeswitch/conf/autoload_configs/event_socket.conf.xml
修改你的freeswitch服务器
reloadxml建表语句 我采用的是MySQL
CREATE TABLE `fs_event_socket` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`hostname` varchar(50) NOT NULL COMMENT 'fs服务名称',
`nat_map` varchar(20) DEFAULT 'false' COMMENT 'nat_map',
`listen_ip` varchar(50) DEFAULT '0.0.0.0' COMMENT 'listen_ip',
`listen_port` int(11) DEFAULT '8021' COMMENT 'listen_port',
`password` varchar(50) DEFAULT 'ClueCon',
`apply_inbound_acl` varchar(50) DEFAULT 'lan',
`stop_on_bind_error` varchar(50) DEFAULT 'true',
`addtime` varchar(20) DEFAULT NULL COMMENT '创建时间',
`updatetime` varchar(20) DEFAULT NULL COMMENT '修改时间',
`connected` int(11) DEFAULT NULL COMMENT 'connected 0-未连接 1-已连接 2 已停止',
`connected_result` varchar(50) DEFAULT NULL COMMENT '连接结果',
`show_calls` int(11) DEFAULT NULL COMMENT '容许通话数',
`enable` int(11) DEFAULT '1' COMMENT '是否启用',
PRIMARY KEY (`id`),
UNIQUE KEY `AK_Key_2` (`hostname`),
UNIQUE KEY `UK_hu886eh9fs7qysallkl0ub6t7` (`hostname`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='fs服务器监听端口';
此处我部署了三个freeswitch服务器,表示我会动态监听三个esl 接口,不需要修改任何代码
数据库表数据:
我们预计的设计界面如下:
3 搭建java环境
a.我用的maven spring web工程,具体怎么搭建可以网上查
http://blog.csdn.net/coolyqq/article/details/51437131 此处是pom文件
此处加入freeswitch依赖包
b.测试
maven测试jar可行性
import java.util.regex.Matcher;
import java.util.regex.Pattern;
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;
import org.freeswitch.esl.client.transport.message.EslMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class EventEslInboundTest {
private static final Logger log = LoggerFactory.getLogger(EventEslInboundTest.class);
private static String host = "10.0.10.46";
private static int port = 8021;
private static String password = "ClueCon";
public static void inBand(){
final Client client = new Client();
try
{
client.connect( host, port, password, 10 );
//client.connect( "10.0.0.85", port, password, 10 );
}
catch ( InboundConnectionFailure e )
{
log.error( "Connect failed", e );
return;
}
//注册事件处理程序
client.addEventListener( new IEslEventListener()
{
public void eventReceived( EslEvent event )
{
System.out.println("Event received [{}]" + event.getEventHeaders());
//记录接听次数和时间
if(event.getEventName().equals("CHANNEL_ANSWER")){
//your code here
}
if(event.getEventName().equals("HEARTBEAT")){
System.out.println("recieved Hearbeat event !" + event.getEventBodyLines());
}
if(event.getEventName().equals("CHANNEL_DESTROY")){
}
if(event.getEventName().equals("CHANNEL_HANGUP_COMPLETE")){
//挂断
}
}
public void backgroundJobResultReceived( EslEvent event )
{
String uuid= event.getEventHeaders().get("Job-UUID");
log.info("Background job result received+:"+event.getEventName()+"/"+event.getEventHeaders());// +"/"+JoinString(event.getEventHeaders())+"/"+JoinString(event.getEventBodyLines()));
}
} );
//定义事件日志输出格式,但是java esl 目前只支持plain格式 ,http://wiki.freeswitch.org/wiki/Event_Socket
//2012-12-25 19:20:30 [ main:426 ] - [ ERROR ] java.lang.IllegalStateException: Only 'plain' event format is supported at present
client.setEventSubscriptions("plain", "all");
// client.close();
}
public static void main(String[] args) {
inBand();
System.out.println("event_socket_test".toUpperCase());
}
}
运行不报错 说明环境搭建成功,可以往下走了
第二部分 java esl socket实例运行
未完待续.....