作者:王冠霖
来源:FreeSWITCH中文社区
原文:https://mp.weixin.qq.com/s/SwSY6LX4x3iA799ss6UOTA
![FreeSWITCH如何开启Event Socket Language支持](https://www.nxrte.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
FreeSWITCH是一个开源的电话交换平台,它提供了丰富的功能和灵活的配置,可以用于实现各种通信场景和需求。
FreeSWITCH的一个重要特性是Event Socket Library(ESL),它是一个用于与FreeSWITCH事件系统交互的C语言库,可以支持多种编程语言,如Python,Ruby,Perl,Java等。ESL可以让应用程序来控制和监控FreeSWITCH的运行状态,执行命令,发送和接收事件,处理呼叫等。
本文将介绍如何在FreeSWITCH中开启Event Socket Language(ESL)支持,以及如何使用golang语言来编写ESL应用程序。本文将分别介绍两种模式:Inbound和Outbound。Inbound模式是指应用程序作为客户端,主动连接到FreeSWITCH的Event Socket服务器,发送命令和接收事件。Outbound模式是指FreeSWITCH作为客户端,主动连接到应用程序的Event Socket服务器,发送事件和接收命令。
开启ESL支持
要开启ESL支持,需要在FreeSWITCH的配置文件中启用mod_event_socket
模块,以及设置相应的参数。mod_event_socket
模块是FreeSWITCH的一个内置模块,它提供了Event Socket服务器的功能,可以监听指定的端口,接受和处理来自ESL客户端的连接和请求。mod_event_socket模块的配置文件位于FreeSWITCH的conf/autoload_configs
目录下,文件名为event_socket.conf.xml
。可以用文本编辑器打开这个文件,进行如下的修改:
- 将listen-ip参数的值设置为0.0.0.0,表示监听所有的IP地址。
- 将listen-port参数的值设置为8021,表示监听8021端口。这个端口可以根据需要进行修改,但要确保不与其他服务冲突。
- 将password参数的值设置为ClueCon,表示连接到Event Socket服务器时需要提供的密码。这个密码也可以根据需要进行修改,但要保证安全性。
- 将apply-inbound-acl参数的值设置为loopback.auto,表示允许本地回环地址(127.0.0.1)的连接。这个参数可以根据需要进行修改,也可以添加其他的访问控制列表(ACL)来限制连接的来源。
- 将nat-map参数的值设置为false,表示不使用NAT映射。这个参数可以根据网络环境进行修改,如果需要使用NAT映射,可以将其设置为true,并提供相应的外部IP地址和端口。
- 将enable-heartbeat参数的值设置为true,表示开启心跳检测。这个参数可以根据需要进行修改,如果开启心跳检测,可以设置heartbeat-interval参数来指定心跳间隔,以及heartbeat-event-details参数来指定心跳事件的详细信息。
修改后的event_socket.conf.xml
文件的内容如下:
<configuration name="event_socket.conf" description="Socket Client">
<settings>
<param name="listen-ip" value="0.0.0.0"/>
<param name="listen-port" value="8021"/>
<param name="password" value="ClueCon"/>
<param name="apply-inbound-acl" value="loopback.auto"/>
<param name="nat-map" value="false"/>
<param name="enable-heartbeat" value="true"/>
<param name="heartbeat-interval" value="20"/>
<param name="heartbeat-event-details" value="true"/>
</settings>
</configuration>
保存并关闭文件后,需要重启FreeSWITCH,或者在FreeSWITCH的控制台中执行reload mod_event_socket
命令,让配置生效。这样,就开启了ESL支持,可以使用ESL客户端来连接到FreeSWITCH的Event Socket服务器了。
使用golang编写ESL应用程序
要使用golang编写ESL应用程序,需要使用一个支持ESL的golang库。在本文中,将使用fiorix/go-eventsocket
库,它是一个简单而高效的ESL库,可以支持Inbound和Outbound模式,以及事件的订阅,过滤,发送和接收等功能。可以使用go get命令来安装这个库:
go get github.com/fiorix/go-eventsocket/eventsocket
安装完成后,就可以在golang代码中导入这个库,并使用它提供的对象和方法来编写ESL应用程序了。下面,将分别给出Inbound和Outbound模式的示例代码。
Inbound模式
Inbound模式是指应用程序作为客户端,主动连接到FreeSWITCH的Event Socket服务器,发送命令和接收事件。要实现这种模式,需要使用eventsocket.Dial
函数来创建一个ESL Connection对象,该对象表示与FreeSWITCH的Event Socket服务器的连接。然后,可以使用ESLconnection对象的方法来发送命令,如Execute
, Send
等,以及接收事件,如ReadEvent
, PrettyPrint
等。
下面是一个简单的Inbound模式的示例代码,它连接到FreeSWITCH的Event Socket服务器,发送一个originate命令,发起一个呼叫,然后接收和打印呼叫相关的事件.
package main
import (
"fmt"
"log"
"github.com/fiorix/go-eventsocket/eventsocket"
)
const dest = "sofia/internal/1000%127.0.0.1"
const dialplan = "&socket(localhost:9090 async)"
func main() {
c, err := eventsocket.Dial("localhost:8021", "ClueCon")
if err != nil {
log.Fatal(err)
}
c.Send("events json ALL")
c.Send(fmt.Sprintf("bgapi originate %s %s", dest, dialplan))
for {
ev, err := c.ReadEvent()
if err != nil {
log.Fatal(err)
}
fmt.Println("\nNew event")
ev.PrettyPrint()
if ev.Get("Answer-State") == "hangup" {
break
}
}
c.Close()
}
Outbound模式
Outbound模式是指FreeSWITCH作为客户端,主动连接到应用程序的Event Socket服务器,发送事件和接收命令。要实现这种模式,需要使用eventsocket.ListenAndServe
函数来创建一个Event Socket服务器,该函数接受一个地址和一个处理函数作为参数,地址表示服务器要监听的IP地址和端口,处理函数表示服务器要对每个连接执行的操作。处理函数的参数是一个ESL Connection对象,该对象表示与FreeSWITCH的Event Socket客户端的连接。然后,可以使用ESL Connection对象的方法来接收事件,如ReadEvent
, PrettyPrint
等,以及发送命令,如Execute
, Send
等。
下面是一个简单的Outbound模式的示例代码,它创建一个Event Socket服务器,监听9090端口,接收通话事件,以及发送一个answer
命令,应答呼叫并播放音频,最后挂掉电话。
package main
import (
"fmt"
"log"
"github.com/fiorix/go-eventsocket/eventsocket"
)
const audioFile = "/opt/freeswitch/sounds/en/us/callie/misc/8000/sorry.wav"
func main() {
eventsocket.ListenAndServe(":9090", handler)
}
func handler(c *eventsocket.Connection) {
fmt.Println("new client:", c.RemoteAddr())
c.Send("connect")
c.Send("myevents")
c.Execute("answer", "", false)
ev, err := c.Execute("playback", audioFile, true)
if err != nil {
log.Fatal(err)
}
ev.PrettyPrint()
for {
ev, err = c.ReadEvent()
if err != nil {
log.Fatal(err)
}
fmt.Println("\nNew event")
ev.PrettyPrint()
if ev.Get("Application") == "playback" {
if ev.Get("Application-Response") == "FILE PLAYED" {
c.Send("exit")
}
}
}
}
要让FreeSWITCH使用Outbound模式,需要在FreeSWITCH的配置文件中设置相应的拨号计划(Dialplan),让FreeSWITCH在收到呼叫时,连接到的Event Socket服务器。FreeSWITCH的拨号计划的配置文件位于FreeSWITCH的conf/dialplan
目录下,文件名为default.xml
。可以用文本编辑器打开这个文件,进行如下的修改:
- 在标签中,添加一个标签,表示匹配所有的呼叫目标。
- 在标签中,添加一个标签,表示执行一个socket命令,连接到上述的Event Socket服务器。
- 在标签中,设置application属性的值为socket,表示执行socket命令,设置data属性的值为127.0.0.1:9090 async full,表示连接到127.0.0.1:8084端口,使用异步和完整模式。
修改后的default.xml
文件的内容如下:
<context name="default">
<extension name="default">
<condition field="destination_number" expression=".*">
<action application="socket" data="127.0.0.1:9090 async full"/>
</condition>
</extension>
</context>
保存并关闭文件后,需要重启FreeSWITCH,或者在FreeSWITCH的控制台中执行reloadxml
命令,让配置生效。这样,就使FreeSWITCH使用Outbound
模式,连接到上述的Event Socket服务器了。
总结
本文介绍了如何在FreeSWITCH中开启Event Socket Language(ESL)支持,以及如何使用Golang语言来编写ESL应用程序。分别介绍了两种模式:Inbound和Outbound。Inbound模式是指应用程序作为客户端,主动连接到FreeSWITCH的Event Socket服务器,发送命令和接收事件。Outbound模式是指FreeSWITCH作为客户端,主动连接到应用程序的Event Socket服务器,发送事件和接收命令。使用fiorix/go-eventsocket库来实现ESL的功能,给出了相应的示例代码和配置文件。通过使用ESL,可以实现与FreeSWITCH的高效和灵活的交互,实现各种通信应用和场景。
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。