文档章节

生成freeswitch事件的几种方式

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 00:47
字数 635
阅读 110
收藏 0

本文描述了生成freeswitch事件的几种方式,这里记录下,也方便我以后查阅。

  • 操作系统:debian8.5_x64
  • freeswitch 版本 : 1.6.8

在freeswitch代码中加入事件

产生内置事件(以SWITCH_EVENT_MODULE_LOAD为例):

switch_event_t *event;
if (switch_event_create(&event, SWITCH_EVENT_MODULE_LOAD) == SWITCH_STATUS_SUCCESS)
{
    switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "type", "endpoint");
    switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "name", ptr->interface_name);
    switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "key", new_module->key);
    switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "filename", new_module->filename);
    switch_event_fire(&event);
}

产生自定义事件:

if (switch_event_create_subclass(&event,SWITCH_EVENT_CUSTOM,"calltest1::calltest1_sub") == SWITCH_STATUS_SUCCESS)
{
    switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "callee_uuid", "86896a7a-3dc3-4175-aaa1-cdcbfd9bd566");
    switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "caller_num", "1000");
    switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "callee_num", "1001");
    switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "failed_reason", "exten not avaliable");
    switch_event_fire(&event);
}

使用嵌入式脚本生成freeswitch事件

使用lua生成freeswitch事件

/tmp/1.lua内容如下:

function fire_failed_event(callee_uuid,caller_num,callee_num,failed_reason)
    local event = freeswitch.Event("CUSTOM","calltest1::calltest1_sub")
    event:addHeader("callee_uuid",callee_uuid)
    event:addHeader("caller_num",caller_num)
    event:addHeader("callee_num",callee_num)
    event:addHeader("failed_reason",failed_reason)
    event:fire()
end

fire_failed_event("86896a7a-3dc3-4175-aaa1-cdcbfd9bd566","1000","1001","exten not avaliable")

fscli中运行:

/event json  CUSTOM calltest1::calltest1_sub
luarun /tmp/1.lua

事件内容如下:

{
        "Event-Subclass":       "calltest1::calltest1_sub",
        "Event-Name":   "CUSTOM",
        "Core-UUID":    "ae0f2919-f45f-450c-8d8f-4c9c555032b6",
        "FreeSWITCH-Hostname":  "localhost",
        "FreeSWITCH-Switchname":        "localhost",
        "FreeSWITCH-IPv4":      "192.168.1.101",
        "FreeSWITCH-IPv6":      "::1",
        "Event-Date-Local":     "2016-09-23 16:54:41",
        "Event-Date-GMT":       "Fri, 23 Sep 2016 08:54:41 GMT",
        "Event-Date-Timestamp": "1474620881330278",
        "Event-Calling-File":   "switch_cpp.cpp",
        "Event-Calling-Function":       "Event",
        "Event-Calling-Line-Number":    "262",
        "Event-Sequence":       "347438",
        "callee_uuid":  "86896a7a-3dc3-4175-aaa1-cdcbfd9bd566",
        "caller_num":   "1000",
        "callee_num":   "1001",
        "failed_reason":        "exten not avaliable"
}

使用python生成freeswitch事件

脚本/usr/local/freeswitch/scripts/test11.py 内容如下:

import freeswitch
import uuid

def fsapi(session,stream,env,args):
    event = freeswitch.Event("CUSTOM","calltest1::calltest1_sub")
    event.addHeader("callee_uuid",str(uuid.uuid4()))
    event.addHeader("caller_num","1000")
    event.addHeader("callee_num","1001")
    event.addHeader("failed_reason","pytest reason")
    event.fire()
    freeswitch.consoleLog("info","fire ")

运行效果参考lua实现的demo

通过ESL发送事件

也可以通过freeswitch的ESL接口的sendEvent函数进行发送事件

ESL库方式

freeswitch提供的有ESL开发库,这里以python为例展示下通过ESL实现事件的发送:

import ESL

pbxHost,pbxPort = '192.168.1.101','8021'
pbxAuth = 'Cluecon'

con = ESL.ESLconnection(pbxHost,pbxPort,pbxAuth)    
e = ESL.ESLevent("CUSTOM","calltest1::calltest1_sub")
e.addHeader("callee_uuid","42e36a32-d6c9-4fac-841d-95bbab9ce2f5")
e.addHeader("caller_num","1000")
e.addHeader("callee_num","1001")
e.addHeader("failed_reason","pytest reason")

con.sendEvent(e)

运行效果参考lua实现的demo

使用socket方式

如果在某些场合不适合使用ESL(比如windows下想使用ESL), 或者发现ESL有bug(之前发现python版的ESL有内存泄漏), 可以直接使用socket直接发送,示例如下:

import socket  

pbxHost,pbxPort = '192.168.1.101',8021
pbxAuth = 'ClueCon'

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
sock.connect((pbxHost,pbxPort))
sock.send('auth %s\r\n\r\n' % pbxAuth)

tmsg = "sendevent CUSTOM\r\n"
tmsg += "Event-Name: CUSTOM\r\n"
tmsg += "Event-Subclass: calltest1::calltest1_sub\r\n"
tmsg += "callee_uuid: 42e36a32-d6c9-4fac-841d-95bbab9ce2f5\r\n"
tmsg += "caller_num: 1000\r\n"
tmsg += "callee_num: 1001\r\n"
tmsg += "failed_reason: pytest reason\r\n"

sock.send('%s\r\n' % tmsg)

运行效果参考lua实现的demo

本文github地址:

https://github.com/mike-zhang/mikeBlogEssays/blob/master/2016/20160927_生成freeswitch事件的几种方式.md

欢迎补充  

本文转载自:http://www.cnblogs.com/MikeZhang/p/gen_freeswitch_event_20160927.html

AllenOR灵感
粉丝 11
博文 2635
码字总数 83001
作品 0
程序员
私信 提问
freeswitch websocket webrtc

Install the Certificate into FreeSWITCH Replace sipjs.com with the domain name that you used to generate the certificate. cd /etc/letsencrypt/live/sipjs.com echo '' >> /usr/loca......

明月惊鹊
2018/11/16
1K
0
freeswitch实战经验1:服务器向成员主动发起会议邀请

接触过freeswitch的童鞋们都知道,freeswitch自动会议室功能,比如大家都拨3000这个号码,就可以进行电话会议功能了。但是,现在有这么一个场景:现在某个主持人想开电话会议,想直接由frees...

BLUE-魏晓峰
2013/06/17
3.5K
0
FreeSWITCH 1.2.14 发布,电话软交换机

FreeSWITCH 1.2.14 发布,这是一个维护版本,修复了很多 bug。 下载地址:http://files.freeswitch.org/freeswitch-1.2.14.tar.bz2 FreeSWITCH 是一个电话的软交换解决方案,包括一个软电话和...

oschina
2013/10/17
2.4K
0
呼叫中心 设备 识别

先上两张设备图: 某学校的呼叫中心的设备, 但是没有用, 以前有 上海的 人员过来部署的, 他用的是一个电话, 电话上面连的就是D设备 上面的线, 不知道他到底是用的那种方式. 用的华为语音交换机...

panmingguang
2015/01/05
107
0
freeSWITCH编译java esl模块

一、背景 假设源代码路径为/home/freeswitch 二、编译安装libesl.a 1. cd /home/freeswitch(源代码的根目录) 执行./configure,以便生成必要的Makefile文件。 2. cd /home/freeswitch/libs/...

会哭的鳄鱼
2017/10/24
182
0

没有更多内容

加载失败,请刷新页面

加载更多

搭建高可用MongoDB集群(分片)

搭建高可用MongoDB集群(分片) MongoDB基础请参考:https://blog.51cto.com/kaliarch/2044423 MongoDB(replica set)请参考:https://blog.51cto.com/kaliarch/2044618 一、概述 1.1 背景 ......

linjin200
7分钟前
1
0
CDH6.0.1集成tez-0.9.1计算引擎

参考文章: https://www.jianshu.com/p/9fb9f32e1f0f https://www.baidu.com/link?url=OgpwasnZi7H1dySN2T111sseEWDBaCCTC3DFV61G7756YbrkJCA8Y3UFaueyqnfN&wd=&eqid=daeb8b3500049cf3000000......

Sheav
9分钟前
1
0
Vue内置指令的使用

v-model(数据绑定) v-model常用于表单数据的双向绑定,它本质上是一个语法糖。它主要的有两种应用: 在文本框、多行文本、input的下拉框、单选按钮、复选框中的应用 <div id="app"> ...

凌兮洛
10分钟前
1
0
外部来源应用检查-烦死了,终于找到解决设置了

Android 连接usb调试应用的时候: 华为关闭方法:1、设置-安全-更多安全设置,关掉外部来源应用检查。2、设置-系统-开发人员选项-关闭“监控ADB安装应用” 不知道OPPO 怎么关闭的?...

QGlaunch
11分钟前
2
0
6个K8s日志系统建设中的典型问题,你遇到过几个?

作者 | 元乙 阿里云日志服务数据采集客户端负责人,目前采集客户端 logtail 在集团百万规模部署,每天采集上万应用数 PB 数据,经历多次双 11、双 12 考验。 导读:随着 K8s 不断更新迭代,使...

阿里云官方博客
13分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部