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
。可以用文本编辑器打开这个文件,进行如下的修改:
修改后的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
。可以用文本编辑器打开这个文件,进行如下的修改:
修改后的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的高效和灵活的交互,实现各种通信应用和场景。
本文分享自 FreeSWITCH中文社区 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!