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
啟動或停止事件流。
語法:
eventformat : 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