event socket创建过程
usr/local/freeswitch/bin/freeswitch 运行freeswitch
/media/sf_share/freeswitch-1.6.20 文件安装目录
外连
1. nc -l -k localhost 8040 启动监听
2. nc localhost 8040 开启终端监听
3. ctrl+c退出B终端,电话拨打1234,链接到8040,
4. 回到A终端输入connect然后打两下回车,会出现
Event-Name: CHANNEL_DATA
Core-UUID: 5ed01200-5c09-11e9-8ae3-6733192b29d4
...
5. 测试播放一段音乐
sendmsg
call-command:execute
execute-app-name:playback
execute-app-arg:local_stream://moh
6. 结束,把上面得playback改为hangup再发一遍,电话就挂断了
内连
freeswitch启动后会启动一个ecventsocket tcp server,ip,端口和密码都可以在conf/autoloadconfigs/eventsocket.conf.xml 中配置
1. 使用nc localhost 8021链接freeswitch,会出现
Content-Type: auth/request
2. 输入 “auth ClueCon”按两下回车,显示以下表示成功
Content-Type: command/reply
Reply-Text: +OK accepted
3. 可以使用命令控制freeswitch
1. api version 查看freeswitch版本
2. api status 查看状态
3. api sofia status 查看sofia状态
4. event plain ALL订阅所有事件
5. 订阅某一个事件
event plain <事件名称>
event plain CHANNEL_CREATE
event socket命令
1. auth <密码> 第一个需要发送得命令,用于向freeswitch认证,例: auth ClueCon
2. api <command> <args> 其中command和args分别是freeswitch实际得命令和参数
3. bgapi <command> <args> api执行时间比较长,有一段时间会得不到响应,可以使用bgapi将命令放到后面执行;
1. 会建立一个任务(job),并返回job-UUID;
2. 执行完成后fs会产生一个BACKGROUND_JOB事件,事件中带了job-UUID和命令执行结果
3. fs允许自己提供job-UUID(要保证全局唯一)
4. linger和nolinger
1. 当channel挂断时,fs会断开与socket得连接,可能有一些channel相关得事件还没有发送过去避免这种“丢失”事件,tcp server告诉fs在断开之后逗留(“linger”)一段时间,等待把所有事件发完
linger <seconds> 延时10秒 linger 10
2. linger开启后悔了,使用nolinger命令撤销,没有参数
5. event [type] <events>
1. event用于订阅事件,type(时间类型)有plain、json、xml三种,默认plain(纯文本)
2. events可以指定事件得名字,ALL表示订阅全部事件,事件之间用空格隔开
3. 订阅CUSTOM事件(自定义事件),它具体的类型是在Subclass中指定得,如指定订阅Subclass为"sofia::register"事件:
1. event plain CUSTOM sofia::register
2. 可以一次订阅多个
event plain CUSTOM sofia::register sofia::unregister
3. 使用多个event命令混合订阅
event plain CHANNEL_ANSWER CUSTOM sofia::register sofia::unregister
4. 参数中一旦出现CUSTOM后面就不能跟普通得事件类型了
5. CUSTOM事件只能逐一订阅,不能使用ALL
6. HEARTBEAT是一个特殊事件,每20秒产生一次,用于回报fs得当前状态,当20秒没有收到fs事件,可以认为网络或fs异常
6. myevents
1. 主要用于outbound模式,在outbound模式中,外部得TCP server可以通过myevents订阅与该channel相关得所有事件
2. 使用格式myevents <type><UUID>
myevents
myevents json
myevents xml
myevents 289dwd-af35-47de-9a58-754191454d0d2
7. divert_events
1. 作为InputCallback产生的,当channel通过setInputCallback()函数安装了相关的回调函数并遇到某些事件,如收到用户按键(DTMF)或语音识别的结果(DETECTED_SPEECH),产生InputCallback时间,默认是在嵌入式脚本的回调函数捕捉,通过使用diver_events,可以将这些时间转发到Event Socket,外部程序中也能收到相关事件
8. filter
1. filter用于安装一个过滤器,只做“虑入”,把符合条件的过滤进来,可以同时使用多个过滤器
2. 格式:filter <EventHeader> <ValueToFilter>
3. 例如:订阅所有事件,只接受匹配主叫号码1001事件
event plain all
event filter Caller-Caller-ID-Name 1001
4. 取消过滤器
先接受三个过滤器
event plain all
filter Unique-id uuid1
filter Unique-id uuid2
filter Unique-id uuid3
filter delete 取消所有的过滤器
filter delete Unique-ID uuid2 取消与uuid2相关的过滤器liru
9. nixevent与noevent
1. nixevent与event相反,是取消订阅事件
nixevent CHANNEL_CREATE
nixevent all
2. noevent相当于“nixevent all”取消所有event订阅
10. log订阅日志
1. 格式:log <level>
1. level包含(数目越高越详细):
0-CONSOLE
1-ALERT
2-CRIT
3-ERR
4-WARNING
5-NOTICE
6-INFO
7-DEBUG
2. log info 或 log 6
11. nolog log的反义词,关闭使用log命令订阅的日志
12. exit 告诉fs关闭socket连接
13. sendevent
1. 通过sendevent可以向fs的事件系统发送事件
2. 格式:sendevent <event-name>
例如发送MESSAGE消息
sendevent SEND_MESSAGE
profile: internal
user: 1002
host: 192.168.0.126
content-type: text/plain
content-length: 10
hello 1002
使用ESL开发
创建独立的ESL应用
1.创建目录和分离esl源文件
1. 创建一个myesl目录,然后创建一个myesl.c的文件。
2. 直接把fs源码目录下的testclient.c中的内容原样复制过来。
3. 将/usr/local/freeswitch/lib目录下的libesl.a 拷贝到源码/media/sf_share/freeswitch-1.6.20/libs/esl目录下
4. 创建一个MakeFile文件,保存在myesl.c相同的目录,内容如下
ESLPATH = /media/sf_share/freeswitch-1.6.20/libs/esl
CFLAGS = -I$(ESLPATH)/src/include
LIBESL = $(ESLPATH)/.libs/libesl.a
#LIBESL = $(ESLPATH)/libesl.a
all: myesl charge acd
myesl: myesl.c
gcc $(CFLAGS) -o myesl myesl.c $(LIBESL) -ldl -lm -lpthread
4. 然后make编译生成myesl运行文件,然后执行
1. make myesl.c 编译
2. ./myesl 执行
2.在https://github.com/seven1240/myesl中有ESL书写的案例
1. ESL空中充值服务charge.c
2. acd呼叫中心 acd.c
3. inbuound模式实现IVR icharge.c
步骤:
1. 编辑charge.c等案例文件,在main函数中设置连接的地址为:“127.0.0.1”,端口号为8021。
2. 修改Makefeile如下
ESLPATH = /media/sf_share/freeswitch-1.6.20/libs/esl
CFLAGS = -I$(ESLPATH)/src/include
LIBESL = $(ESLPATH)/.libs/libesl.a
all: myesl charge acd
myesl: myesl.c
gcc $(CFLAGS) -o myesl myesl.c $(LIBESL) -ldl -lm -lpthread
charge: charge.c
gcc $(CFLAGS) -o charge charge.c $(LIBESL) -ldl -lm -lpthread
acd: acd.c
gcc $(CFLAGS) -o acd acd.c $(LIBESL) -ldl -lm -lpthread
3. 在myesl目录下make编译,会执行all后面的所有的.c文件,生成对应的可执行文件
4. 配置freeswitch设置连接
1. vi ../autoload_configs/event_socket.conf.xml
2. 默认的监听地址配置
<param name="listen-ip" value="192.168.0.126"/>
3. 去掉下面的注释
<!-- <param name="apply-inbound-acl" value="lan"/> -->
4. freeswitch中重启mod_event_socket模块
5. diaplan中添加socket
<!--eventsockt外连配置-->
<extension name="socket">
<condition field="destination_number" expression="^12345$">
<action application="socket" data="127.0.0.1:8040 async full"/>
</condition>
</extension>
5. 执行可执行文件,设置监听
6. 手机拨打12345建立连接,执行esl内部操作
3.java esl_client的使用配置
下载地址:https://github.com/esl-client/esl-client
1. 下载项目到本地
2. 复制项目的src文件到IntelliJ Idea的gradle项目目录下
3. 修改idea的sources->language level选择8
4. IDEA Error:java: Compilation failed: internal java compiler error错误解决办法:
File-->Setting...-->Build,Execution,Deployment-->Compiler-->Java Compiler 设置相应Module的target bytecode version的合适版本(跟你jkd版本一致)
5. 运行文件main函数,注意连接地址为freeswitch地址(192.168.0.1)