当前位置: 首页 > 工具软件 > ESL > 使用案例 >

【FreeSwitch开发实践】 ESL简介

拓拔君博
2023-12-01


前言

本文主要对freesiwtch ESL做一个简要介绍,ESL全称Event Socket Libray是freeswitch中一组socket的函数库。



一、什么是Event Socket

1.1 简介

要了解ESL首先要先了解什么是Eevent Socket,Event Socket可以使运行在freeswitch外部的程序控制freeswitch, 可以使用socket的方式使用freeswitch提供的所有API和App,因为几乎几乎任何语言都支持socket,所以它几乎可以跟任务语言进行通信。
也就是说Event Socket其实就是Socket,而且还是TCP协议的, Event Socket只是一个freeswitch特定TCP自定义接口。而Event Socket只提供对外TCP接口,让外部可以调用freeswitch内部提供的App和API。

有了上面的介绍,ESL就简单明了了,ESL就是Event Socket的一组封装库, 是一组实现。

1.2 两种模式

Event Socket分成两种模式,内连模式(Inbound)和外连模式(Outbound)。这里所说的内和外是针对freeswitch而言的。
外连模式:freeswitch作为一个TCP Client,而用户程序作为一个TCP Client连接到freeswitch。而TCP Server是干什么的呢,其实TCP Server需要用户自己实现,建立连接后,freeswitch会将会话Channel的所有消息都发送给TCP Server, TCP Server可以决定是不是干预通电话,而且可以在任何阶段进行干预。
内连模式:freeswitch作为一个TCP Server,而用户程序作为一个TCP Client连接到freeswitch。用户程序可以通过事件订阅获取freeswitch的各种状态。

二、ESL协议简介

ESL协议类似于Http协议或SIP协议,是TCP之上的协议,这里通过一些ESL命令对ESL协议作一个简单介绍。
在centos7.6下安装telnet命令,使用telnet连接到FreeSwitch的8021端口,尝试一些简单命令,如api versionapi status等,如下:

[root@p-l27-4-8 ~]# telnet 10.27.4.8 8021
Trying 10.27.4.8...
Connected to 10.27.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 2021-10-24 16:39:33Z 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 2021-10-24 16:39: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

auth 命令验证密码, ClueCon是event_socket.conf.xml中配置的默认密码。
通过api version、api status可以大致了解,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: 消息体长度
<消息体>


三、常用ESL命令

下面对几个常见ESL命令作一个简单的介绍:

3.1 api

api api命令用于执行freeswitch内部api或app,是同步执行的,freswitch内部api或app未执行完成,api命令不会返回。

3.2 bgapi

bgaip 和api命令类似,但它是异步执行的,它不需要等待freeswitch内部api或app执行完成,马上就可以退出来。

3.3 event

event [plain | xml | json] event_name event命令用于订阅freeswitch的各种事件, 分别支持plain文本类型、xml类型和json类型的事件数据模式返回。
订阅所有事件:

/event plain ALL

订阅普通事件命令示例:

/event plain CHANNEL_ANSWER CHANNEL_HANGUP CHANNEL_HANGUP_COMPLETE

订阅自定义事件命令示例:

/event plain CUSTOM my_custom_event_1

其中CUSTOM是所有自定义事件的事件名称, my_custom_event_1是subclass,所有自定义事件都必须有subclass,而且不能相同。

3.4 noevents /nixevent

noevents/nixevent 取消订阅事件,示例如下:

/nixevent plain CHANNEL_ANSWER CHANNEL_HANGUP CHANNEL_HANGUP_COMPLETE

四、ESL支持的语言

前面说到ESL是对Event Socket的一组封装库,理论上来说只要支持Socket的语言都可以实现ESL。已知支持ESL语言有C、Perl、PHP、Python、Ruby、Lua、Java、Javascript、Tcl及C#、VB等。
后续文章会有JS、C语言的ESL使用示例,敬请期待。

总结

本文对ESL作了简要介绍,分别对Event Socket、ESL协议和ESL命令分别进行了介绍。

 类似资料: