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服務器
<configuration name="event_socket.conf" description="Socket Client"> <settings> <param name="listen-ip" value="0.0.0.0"/> <param name="listen-port" value="8021"/> <param name="password" value="ClueCon"/> </settings> </configuration>
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依賴包
<!-- freeswitch -->
<dependency>
<groupId>org.freeswitch.esl.client</groupId>
<artifactId>org.freeswitch.esl.client</artifactId>
<version>0.9.2</version>
</dependency>
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實例運行
未完待續.....