FreeSWITCH如何开启Event Socket Language支持

作者:王冠霖
来源:FreeSWITCH中文社区
原文:https://mp.weixin.qq.com/s/SwSY6LX4x3iA799ss6UOTA

FreeSWITCH如何开启Event Socket Language支持

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对象的方法来发送命令,如ExecuteSend等,以及接收事件,如ReadEventPrettyPrint等。

下面是一个简单的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对象的方法来接收事件,如ReadEventPrettyPrint等,以及发送命令,如ExecuteSend等。

下面是一个简单的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 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论