freeswitch实战三(eventSocket)

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)
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值