FreeSwitch ESL详解
FreeSwitch ESL详解
FreeSwitch的ESL(Event Socket Library)是FreeSwitch中一组socket函数库,它简化了通过Event Socket进行的通信,使得开发者可以使用更高级的API来操作,而不是直接处理底层的TCP套接字通信。本文将详细介绍ESL的概念、作用、连接模式、常用命令以及协议格式,并通过Telnet连接示例展示如何与FreeSwitch进行交互。
概述:
ESL全称Event Socket Library,是FreeSwitch中一组socket的函数库,简单来说就是对Event Socket的一种封装库。它简化了通过Event Socket进行的通信,使得开发者可以使用更高级的API来操作,而不是直接处理底层的TCP套接字通信。这些库通常提供了对Event Socket的封装,使得与FreeSwitch的交互变得更加简洁和高效。
支持多种编程语言:
常见的有Python、Java、C++、C、Perl、PHP、Ruby、Lua、JavaScript、Tcl及C#、VB等。
Event Socket概述和作用:
Event Socket (ESL) 是FreeSwitch提供的一个接口,它允许外部程序通过TCP套接字(Socket)与FreeSwitch进行通信。这个接口使用了TCP协议来实现和FreeSwitch的互动。
Event Socket的作用:
- 控制FreeSwitch:外部程序可以通过Event Socket发送命令来控制FreeSwitch,比如发起呼叫、挂断呼叫、获取状态等。
- 访问API和App:它提供了一种方式,让外部程序能够调用FreeSwitch提供的各种API和应用程序接口(App),从而实现对系统的操作和监控。
Event Socket连接模式:
- 内连模式(Inbound):
FreeSwitch启动后,内置了一个TCP Server,默认会监听8021端口,通过ESL,应用程序可以监听该端口,获取FreeSwitch的各种事件通知,这种模式称为Inbound模式。
其主要原理如下:
- FreeSwitch作为一个TCP Server,而用户程序作为一个TCP Client连接到FreeSwitch。
- 用户程序通过事件订阅,获取FreeSwitch的各种状态。
- 用户程序通过同步或异步发送相关指令。
- 外连模式(Outbound):
应用程序起1个端口,监听该端口充当TCP Server,当FreeSwitch收到来电时,会主动连接TCP Server,将相关信息推送给Server端。
Server端应用可以根据自身业务做些处理,发送命令给FreeSwitch(比如:给客人放段音乐或转接到特定目标),通话结束后(比如:主叫方挂断,或被叫方拒接),FreeSwitch会断开连接,直到下次再有来电。该模式称为Outbound模式。
其主要原理如下:
- FreeSwitch作为一个TCP Client,而用户程序作为一个TCP Server,与FreeSwitch建立连接后进行通讯。
- FreeSwitch会将会话Channel的所有消息都发送给TCP Server, TCP Server可以决定是不是干预通电话,而且可以在任何阶段进行干预。
- 修改FreeSwitch的相关配置,否则FreeSwitch不知道TCP Server的IP/Port连接信息。
ESL常用命令:
api:
api命令用于执行FreeSwitch内部API或App,是同步执行的,FreeSwitch内部API或App未执行完成,api命令不会返回。bgapi:
bgapi和api命令类似,但它是异步执行的,它不需要等待FreeSwitch内部API或App执行完成,马上就可以退出来。event:
event命令用于订阅FreeSwitch的各种事件,分别支持plain文本类型、XML类型和JSON类型的事件数据模式返回。
ESL协议格式:
- request请求格式:
command<参数>
Content-Type: text/plain
Content-Length: 消息体长度
<消息体>
- response响应格式:
Content-Type:[text/plain | command/replay | api/response | text/event-plain | text/event-xml | text/event-json
Content-Length: 消息体长度
<消息体>
Telnet连接到FreeSwitch:
提示:telnet连接到FreeSwitch的8021端口,尝试一些简单命令,如api version、api status等
例如:
[root@p-l27-4-8 ~]# telnet 192.168.4.8 8021
Trying 192.168.4.8...
Connected to 192.168.4.8.
Escape character is '^]'.
Content-Type: auth/request
auth ClueCon
Content-Type: command/reply
Reply-Text: +OK accepted
api version
Content-Type: api/response
Content-Length: 113
FreeSWITCH Version 1.10.7-release+git~20211024T163933Z~883d2cb662~64bit (git 883d2cb 2023-11-24 18:29:43Z 64bit)
api status
Content-Type: api/response
Content-Length: 374
UP 0 years, 0 days, 18 hours, 17 minutes, 43 seconds, 43 milliseconds, 753 microseconds
FreeSWITCH (Version 1.10.7-release git 883d2cb 2023-11-24 18:32:33Z 64bit) is ready
16 session(s) since startup
16 session(s) - peak 16, last 5min 16
0 session(s) per Sec out of max 30, peak 1, last 5min 0
1000 session(s) max
min idle cpu 0.00/99.87
Current Stack Size/Max 240K/8192K
后续文章会持续推出Java通过ESL连接FreeSwitch的内容,敬请期待!