java esl连接freeswitch(一)之环境搭建

来源:互联网 发布:部落冲突各本升级数据 编辑:程序博客网 时间:2024/06/05 16:44

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 NULLCOMMENT '容许通话数',
  `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实例运行

未完待续.....

0 0
原创粉丝点击