freeswitch模块之event_socket

时间:2016-09-27 01:51:56   收藏:0   阅读:6404

这是我之前整理的关于freeswitch mod_event_socket的相关内容,这里记录下,也方便我以后查阅。

mod_event_socket以socket的形式,对外提供控制FS一种途径, 缺省的IP是127.0.0.1,TCP端口是8021,可以在外部通过sokcet执行API/APP命令。

连接模式

连接分两种模式: inbound/outbound
mod_event_socket 的默认加载模式是inbound,outbound模式需要在dialplan的配置文件中设置。

InBound模式由于是可以主动连接并可长期稳定保持,且此通道有且只有一个,心跳、外呼和注册等动作必须通过此种连接完成;

OutBound模式由于是在外线呼入和内线呼出的时候才会触发socket连接事件,所以是不稳定的,且由于同一时间呼入数量不唯一,所以此连接的数目也是动态变化的,但是由于其每个来电建立一个socket连接,所以在大负荷情况下不会造成命令和事件的堵塞。

使用inbound模式

1、修改acl配置:

配置autoload_configs/acl.conf.xml文件:

<list name="domains" default="deny">
  <!-- domain= is special it scans the domain from the directory to build the ACL -->
  <node type="allow" domain="$${domain}"/>
  <!-- use cidr= if you wish to allow ip ranges to this domains acl. -->
  <!-- <node type="allow" cidr="192.168.0.0/24"/> -->
  <node type="allow" cidr="192.168.168.0/24"/>
  <node type="allow" cidr="127.0.0.0/24"/>
</list>

2、修改esl配置:

配置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="domains"/>
    <!--<param name="apply-inbound-acl" value="loopback.auto"/>-->
    <!--<param name="stop-on-bind-error" value="true"/>-->
  </settings>
</configuration>

3、重启freeswitch

4、通过inbound方式使用freeswitch python示例代码如下:

import socket
import json
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((127.0.0.1, 8021))
# send auth
sock.send(auth ClueCon\r\n\r\n)
# send command
sock.send(event json ALL\r\n\r\n)
#sock.send(‘event plain ALL\r\n\r\n‘)
while True:
    print sock.recv(10240)

使用outbound模式

1、编辑conf/dialplan/default.xml,增加如下内容:

<extension name="123456789 Entrance">
    <condition field="destination_number" expression="^123456789$">           
      <action application="socket" data="127.0.0.1:9000 async full" />       
      <action application="playback" data="$${hold_music}"/>
      <action application="hangup" data="" /> 
    </condition>
</extension>

2、启动监听服务器 监听listen-ip:listen-port(如在Linux下可以通过 nc -v -l 9000),

然后拨打配置的电话号码(本例中为123456789) 即可收到Connection from 127.0.0.1 port 9000 [tcp/*] accepted 的消息, 键入connect\n\n即可进入OutBound模式

 

通过socket控制freeswitch

 

可以通过任何支持socket的语言控制freeswitch,这里以python为例子描述怎么通过socket控制freeswitch。

 

 

通过freeswitch提供的ESL库进行控制 

这里以python为例描述下ESL库的基本使用及api接口。

安装ESL

以python为例进行安装:

cd libs/esl/
make pymod
make pymod-install

ESL示例

ESL接口介绍

eslSetLogLevel函数

该函数用于设置服务器的日志级别,使用方式如下:

eslSetLogLevel(loglevel)

其中loglevel是一个整数变量,从0到7,含义如下:

0 是 EMERG
1 是 ALERT
2 是 CRIT
3 是 ERROR
4 是 WARNING
5 是 NOTICE
6 是 INFO
7 是 DEBUG

ESLconnection对象

ESLconnection对象维护与freeswitch之间的连接,以发送命令并进行事件处理。 成员函数列表如下:

ESLevent对象

当接收一个事件时,用户将获得一个ESLevent对象,这个对象包含各种帮助函数变量 来帮助解析和处理收到的事件。

con = ESL.ESLconnection("127.0.0.1", "8021", "ClueCon")
con.events("json", "all");
eventData = con.recvEvent()

eventData即为ESLevent对象

ESLevent对象成员函数列表如下:

本文github地址:

https://github.com/mike-zhang/mikeBlogEssays/blob/master/2016/20160926_freeswitch模块之event_socket.md

欢迎补充  

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!