本文描述了生成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", "");
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "callee_num", "");
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","","","exten not avaliable")

fscli中运行:

/event json  CUSTOM calltest1::calltest1_sub
luarun /tmp/.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": "",
"Event-Calling-File": "switch_cpp.cpp",
"Event-Calling-Function": "Event",
"Event-Calling-Line-Number": "",
"Event-Sequence": "",
"callee_uuid": "86896a7a-3dc3-4175-aaa1-cdcbfd9bd566",
"caller_num": "",
"callee_num": "",
"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","")
event.addHeader("callee_num","")
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',''
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","")
e.addHeader("callee_num","")
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

欢迎补充

生成freeswitch事件的几种方式的更多相关文章

  1. Android_安卓为按钮控件绑定事件的五种方式

    一.写在最前面 本次,来介绍一下安卓中为控件--Button绑定事件的五种方式. 二.具体的实现 第一种:直接绑定在Button控件上: 步骤1.在Button控件上设置android:onClick ...

  2. Java添加事件的四种方式

    Java添加事件的几种方式(转载了codebrother的文章,做了稍微的改动) /** * Java事件监听处理——自身类实现ActionListener接口,作为事件监听器 * * @author ...

  3. nodejs触发事件的两种方式

    nodejs触发事件的两种方式: 方式之一:通过实例化events.EventEmitter //引入events模块 var events = require('events'); //初始化eve ...

  4. 为input标签绑定事件的几种方式

    为input标签绑定事件的几种方式 1.JavaScript原生态的方式,直接复制下面的代码就会有相应的效果 <!DOCTYPE html><html><head> ...

  5. android点击事件的四种方式

    android点击事件的四种方式 第一种方式:创建内部类实现点击事件 代码如下: package com.example.dail; import android.text.TextUtils; im ...

  6. JS与JQ绑定事件的几种方式.

    JS与JQ绑定事件的几种方式 JS绑定事件的三种方式 直接在DOM中进行绑定 <button onclick="alert('success')" type="bu ...

  7. jQuery绑定事件的四种方式:bind、live、delegate、on

    1.jQuery操作DOM元素的绑定事件的四种方式 jQuery中提供了四种事件监听方式,分别是bind.live.delegate.on,对应的解除监听的函数分别是unbind.die.undele ...

  8. jQuery---on注册事件的2种方式

    on注册事件的2种方式 on注册事件的语法 on注册简单事件 // 这个是p自己注册的事件(简单事件) $("p").on("click", function ...

  9. jq绑定事件的4种方式

    jQuery提供了多种绑定事件的方式,每种方式各有其特点,明白了它们之间的异同点,有助于我们在写代码的时候进行正确的选择,从而写出优雅而容易维护的代码.下面我们来看下jQuery中绑定事件的方式都有哪 ...

随机推荐

  1. SQL Server 索引和表体系结构(聚集索引)

    聚集索引 概述 关于索引和表体系结构的概念一直都是讨论比较多的话题,其中表的各种存储形式是讨论的重点,在各个网站上面也有很多关于这方面写的不错的文章,我写这篇文章的目的也是为了将所有的知识点尽可能的组 ...

  2. javascript中字符串的比较规则

    弄清这个还是很重要的,在字符排序中很有用处 非空字符串 > 空字符串 从第一个字符的charCode开始比较,大的就大 所有的字符都相同,就比较长度,长的大 '0'>'' '2'>' ...

  3. web标准之道——笔记

    字体设置 sans和sans-serif为通用字体,具体哪个字体被最终应用由浏览器决定,通用字体只有在其他字体都无效时才会被当作代替方案.通用字体应该放在最后面 sans衬线字体 容易阅读,一般使用在 ...

  4. ElasticSearch 5学习(8)——分布式文档存储(wait_for_active_shards新参数分析)

    学完ES分布式集群的工作原理以及一些基本的将数据放入索引然后检索它们的所有方法,我们可以继续学习在分布式系统中,每个分片的文档是被如何索引和查询的. 路由 首先,我们需要明白,文档和分片之间是如何匹配 ...

  5. Task三个列子的分享

    这次要分享的是C#Task任务的几个列子,感觉最实用的是封装的分页任务执行方法,这个方法步奏也是目前在我工作中执行多任务常用的,不知道各位也有这用的情况,那么开始吧. 1.顺序任务执行 //顺序任务执 ...

  6. [C#] Linq To Objects - 如何操作字符串

    Linq To Objects - 如何操作字符串 开篇语: 上次发布的 <LINQ:进阶 - LINQ 标准查询操作概述>(90+赞) 社会反响不错,但自己却始终觉得缺点什么!“纸上得来 ...

  7. Java正则速成秘籍(一)之招式篇

    导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...

  8. NSSortDescriptor 的使用

    NSSortDescriptor  是什么 ? 你可以将它看做是对一个排序规则的描述者  因为我们可以使用它来对我们数组中的对象进行排序操作 假设现在有这样一个需求: 数组里面有十个Person对象 ...

  9. 使用PowerShell 监控运行时间和连接情况

    概念 Powershell 是运行在windows机器上实现系统和应用程序管理自动化的命令行脚本环境.你可以把它看成是命令行提示符cmd.exe的扩充,不对,应当是颠覆. powershell需要.N ...

  10. Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...