与Lua之类的嵌人式语言不同,通过 Event Socket方式,可以使用运行在 FREESWITCH外部的程序控制 Freeswitch。它可以通过 Socket方式使用 FREESWITCH提供的所有的APp程序和API命令。
FREESWITCH是一个B2BUA,当Bob呼叫 Alice时,首先电话会到达 FREESWITCH(通过SIP),建立个单腿的 Channel(a-leg),然后电话进人路由状态, FREESWITCH查找 Dialplan,然后可以通过以下动作建立一个到 TCP Server的连接:
<action application="socket"data="127.0.0.1: 8040"/>
到此为止,还是只有一个 Channel.。其中 socket是一个App,它会先把这个 Channel置为Park状态,然后 FREESWITCH作为一个TCP客户端连接到 TCP Server上,把当前呼叫的相关信息告诉它,并询问下一步该怎么做。当然,这里 FREESWITCH跟 TCP Server说的语言称为ESL,该语言只有它们两个人懂,与SIP及RTP没有任何关系。也就是说,TCP server只是发布控制指令,并不实际处理语音数据。接下来, TCP Server收到 FREESWITCH的连接请求后,进行决策,如果它认为Bob想要呼叫Aice(根据来话信息和主被叫号码判断),它就给 FREESWITCH发一个执行 bridge App的消息,告诉它应该继续呼叫Aice(给Aice发 SIP INVITE消息)。在Bob挂机之前, FREESWITCH会一直向 TCP Server汇报 Channel I的相关信息,所以这个 TCP Server就可掌握这路电话所有的详细信息,也可以在任何时间对它们发号施令。
在内连模式下, FREESWITCH作为一个服务器,而用户的程序可以作为一个 TCP Client主动连接到 FREESWITCH上。同样, FREESWITCH允许多个客户端连接。每个客户端连接上来以后,可以订阅 FREESWITCH的一些内部事件。上面我们说过, FREESWITCH要通过Eventsocket向外部发送信息,这些信息就是以事件的形式体现的。同样,在内部好多功能也是事件驱动的。用户的 ICP Client I收到这些事件后,可以通过执行App和API来控制 FREESWITCH的行为。对于外连模式来讲,由于 Socket来自一个App,而且它所连接的 TCP Server也像是这个App功能的一部分,它们在 Alice这个 Channel的内部工作,与之相连的 ICP Server发布的命令通常也是让 Freeswitch执行一些Ap。只是在使用 bridge APP 1桥接到Bob后这个 Socket Server又好像是一个中间人或第三者。
我们使用如下 Dialplan进行测试:
<extension name="socket">
<condition field="destination number" expression="1234">
<action application="socket"data="localhost: 8040 async full"/>
</condition
</extension>
当电话呼叫1234时, FREESWITCH便会使用 Outbound i模式,使用 socket App i启动Socket连接。注意这里的两个参数 async和full。其中, async a表示异步执行。默认是同步的,比如在同步状态下,如果 FREESWITCH正在执行 playback操作,而 playback是阻塞的,因而在 playback完成之前向它发送任何消息都是不起作用的,但异步状态可以进行更灵活的控制。当然,异步状态增加了灵活性的同时也增加了开发的复杂度,另一个参数f指明可以在外部程序中使用全部的API,默认只有少量的API是有效的。
好了,电话来了,由于我们还没有准备好 TCP Server,因此连接会失败,电话就断掉了。下面我们需要实现一个 TCP Server,在这里我们使用 netcat这个工具来讲解。netcat是一般 Linux系统自带的一个工具,它可以启动一个 Socket,做服务器或客户端。如果作为客户端,你可以认为它类似于你更熟悉的 telnet命令。虽然它叫 netcat,但程序的名字是nc。如果系统默认没有安装,可以尝试使用下列命令来安装
yum install netcat
开一个终端A,启动一个 Server A,监听8040端口(其中-1表示监听,即 listen;-k表示客户端断开后继续保持监听。注意,有些版本的 netcat参数稍有不同,使用时请查看相关的man文档)。
nc -1-k localhost 8040
拿起电话拨打1234,电话路由到 Socket, FREESWITCH就会连到 Server A上。这时候你听不到任何声音,因为 Channel处于Park状态。但是你在 Server A里也看不到任何连接的迹象。不过,如果你打开另一个终端,使用如下命令可以显示8040端口已处于连接( ESTABLISHED)状态。
FREESWITCH启动后会启动一个 Eventsocket TCP Server,IP、端口号和密码均可以在conf/autoload configs/ event socket. conf,xml文件里配置。在此,我们还使用nc作为客户端,使用以下命令连接Fre_ SWITCH
nc localhost 8021
连接上以后,你会看到如下消息:
content-type: auth/request
这表示已经连接上 FREESWITCH的 Socket了,并且它告诉你,应该输入密码进行验证。这时我们输入“ auth Clue Con”,记得按两下回车。 FREESWITCH默认监听在8021端口上,默认的密码是 Clue Con,因此我们在上面使用了这些默认值,当然需要的话也可以根据情况在 conf/autoload configs/event socket. conf xml中修改。
本文发布于:2024-02-02 05:57:44,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170682466541816.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |