java esl連接freeswitch(一)之環境搭建

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實例運行

未完待續.....

發佈了85 篇原創文章 · 獲贊 16 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章