Freeswitch使用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模式

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

[WARNING] mod_event_socket.c:2641 IP 192.168.1.56 Rejected by acl 

打开注释apply-inbound-acl ,value改成成lan 

重启freeswitch

python示例代码如下:

import socket
import json

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('192.168.1.79', 8021))
# send auth
sock.send("auth ClueCon\n\n".encode("utf-8"))
# send command
sock.send('event plain all\n\n'.encode("utf-8"))
# sock.send('event plain ALL\r\n\r\n')
while True:
    data = sock.recv(10240)
    print(data.decode("utf-8"))

使用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。

  • auth
    语法:

    auth <password>
    

    当用户第一次通过mod_event_socket连接到freeswitch时,必须进行认证,认证示例:

    sock.send(“auth ClueCon\r\n\r\n”)
  • api
    执行freeswitch的API命令,阻塞执行。
    语法:
    api 
    示例:

    sock.send('api originate user/1000 &echo\r\n\r\n')
    sock.send('api originate user/1001 &echo\r\n\r\n')

    socket会将上述两条指令同时发送给freeswitch,但freeswitch按顺序阻塞执行。

  • bgapi
    功能和api相同,非阻塞执行。
    语法:
    bgapi 
    示例:

    sock.send('bgapi originate user/1000 &echo\r\n\r\n')
    sock.send('bgapi originate user/1001 &echo\r\n\r\n')
    

    socket会将上述两条指令同时发送给freeswitch,同时执行。

  • event
    启动或停止事件流。
    语法:
    event

    format : plain、json、xml
    Event types : 参考freeswitch事件类型
    示例:

    sock.send('event json ALL\r\n\r\n')
    

    接收freeswitch所有事件,并以json格式返回。

  • noevents
    关闭上一个event开启的事件
    语法 :
    noevents

    示例:

    sock.send('noevents\r\n\r\n')
    
  • divert_events
    脚本注册接收事件的函数分转到event socket上。
    语法:
    divert_events

  • filter
    设置event socket接收事件的类型。
    语法:
    filter

    示例:
    只订阅CHANNEL_EXECUTE事件

    sock.send('filter Event-Name CHANNEL_EXECUTE\r\n\r\n')
    

    只订阅uuid为34602e08-557a-494a-af47-99e9d55e26ed的事件

    sock.send('filter Unique-ID 34602e08-557a-494a-af47-99e9d55e26ed\r\n\r\n')
    
  • filter delete
    取消订阅的事件。
    语法:
    filter delete

    示例:

    sock.send('filter  delete  Event-Name CHANNEL_EXECUTE\r\n\r\n')    
    sock.send('filter  delete  Unique-ID 34602e08-557a-494a-af47-99e9d55e26ed\r\n\r\n')
    
  • nixevents
    设置event socket禁止接收的事件类型。
    语法:

    nixevents <event types | ALL| CUSTOM custom event sub-class>         
    

    示例:
    不订阅HEARTBEAT事件

    sock.send('nixevent HEARTBEAT\r\n\r\n')   
    
  • sendevent
    发送一个事件到系统队列中。
    语法:

    sendevent  <event-name>          
    

    示例(消息内容):

    sendevent SOME_NAME
    Event-Name: CUSTOM
    Event-Subclass: albs::Section-Alarm
    Section: 33
    Alarm-Type: PIR
    State: ACTIVE
    
  • sendmsg

    给一个uuid发送一个消息,可以执行其他模块的应用接口,也可以挂断电话等。
    语法:

    sendmsg <uuid>       
    

    示例(消息内容):

    sendmsg <uuid>
    call-command: execute
    execute-app-name: playback
    execute-app-arg: /tmp/test.wav
    
  • execute
    执行一个拨号规则的应用。
    语法:

    sendmsg <uuid>      
    call-command: execute
    execute-app-name: <one of the applications>
    execute-app-arg: <application data>
    loops: <number of times to invoke the command, default: 1>
  • hangup 对活动的呼叫挂机。
    语法:

    sendmsg <uuid>
    call-command: hangup
    hangup-cause: <one of the causes listed below>

     

  • nomedia

    控制freeswitch是否处于实时的媒体路径,这个命令支持用户对指定的通道启用或关闭媒体处理。

    语法:

    sendmsg <uuid>
    call-command: nomedia
    nomedia-uuid: <noinfo>

     

  • log 语法:

    log <level>       
    

    设置日志级别。

  • nolog

    禁止日志。

  • linger

    告诉freeswitch当一个通道挂机时不要关闭socket连接,直到收取相关通道的最后一个事件。

  • nolinger

    关闭上次开启的linger命令。

 

Python-ESL:https://freeswitch.org/confluence/display/FREESWITCH/Python+ESL

参考:

https://www.cnblogs.com/MikeZhang/archive/2016/09/27/freeswitch_mod_vent_socket_20160926.html


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM