FreeSWITCH小结:呼叫的发起与跟踪
需求描述##
虽然现有的FreeSWITCH功能已经很强大,但是很多情况下,为了配合业务上的功能,还需要做一些定制开发。
有一个基本需求是:如何控制fs外呼,并跟踪外呼后的一系列状态。
解决方案##
下面我就把自己现有的解决方案跟大家分享下,以便抛砖引玉,引出大家更好的方案。
我的方案也简单,在呼叫之前,指定呼叫的uuid,然后根据该uuid跟踪呼叫到完整状态。
1.获取可用的通道UUID
所以说freeswitch考虑比较周到,连获取uuid的方法都提供了!
当然,你也可以使用自己到方式来生成uuid。不过,一旦uuid出现重复,可是会出现比较麻烦的问题,所以还是使用freeswitch的官方提供的方法比较靠谱。
命令如下:
create_uuid
该命令会返回一个可用的uuid。
2.发起呼叫###
无需多说,此处originate命令登场,不过和平时使用区别的地方是需要指定呼叫的uuid。
下面是两种指定方法,可选择性试用:
方案一:在呼叫时,指定A腿uuid
originate {origination_uuid=xxxxx}user/60401 60402
方案二:在呼叫时,同时指定A腿和B腿的UUID
originate {origination_uuid=xxxxx}user/60401 &bridge({origination_uuid=yyyyy}user/60402)
在使用该命令后,通过命令show channels就可看到两个新创建的通道和指定的通道uuid,xxxxx和yyyyy。
此处留给大家自己去验证了!
同时也感谢杜老大的书,这条命令是从他的书上学来的。
3.跟踪呼叫###
跟踪呼叫,说白了,其实很简单,只是有的人可能没留意到而已,就是利用FreeSWITCH的事件机制进行跟踪。关于事件如何订阅,不是这里的重点,略去不说。
下面先说说一些基本常识:
1、跟呼叫相关的通道事件有如下几个:
Channel_Create:通道创建事件
Channel_Progress:通道振铃事件
Channel_Answer:通道应答事件
Channel_Bridge:通道桥接事件
Channel_Hangup:通道挂断事件
2、通道事件的Unique_ID字段与我们呼叫前指定的UUID相同,这个也是我们能跟踪的前提。
有了上面两个条件之后,跟踪就变得简单和美妙起来!在呼叫开始前,将呼叫对象与uuid的对应关系存到数据库中,在收到不同的事件后,根据事件的Unique_ID找到对应的呼叫对象,然后更新它的呼叫状态即可。
4.注意事项###
1)Channel_Create事件比较特殊,含有的内容比较少,所以处理起来要特别注意。
该事件是在呼叫开始Routing之前就被抛出来,换句话说,你在dialplan中定义的任何变量都不会被读取到。如果这点没注意到的话,会导致判断逻辑出现问题。
2)Channel_Bridge事件中同时含有A腿和B腿的UUID,具体字段我是不打了,感兴趣的可以自己看看
FreeSWITCH小结:呼叫的发起与跟踪的更多相关文章
- FreeSWITCH小结:关于export的原理介绍及应用
FreeSWITCH小结:关于export的原理介绍及应用 Export原理 普通export用法 在dialplan中经常会用到export,如下所示: <action application ...
- FreeSWITCH在呼叫失败的情况下播放语音提示
看到好多网友问到这个问题.一般我们在打电话时会听到“您拨的电话正在通话中,请稍后再拨....”,或“电话无应答...”之类的提示,我们在 freeswitch 里也可以这样做. 其实很简单,默认的配置 ...
- FreeSWITCH小结:关于sip的UDP、TCP与MTU
1.关于SIP的UDP与MTU的关系 如果sip消息的大小超过了MTU,则有可能被网络中的某一节点分片,而UDP处理分片会有很大的问题,从而导致sip消息传输失败.要解决该问题的话,两种方案: 1)减 ...
- SIP协议 会话发起协议(一)
会话发起协议(SIP)是VoIP技术中最常用的协议之一.它是一种应用层协议,与其他应用层协议协同工作,通过Internet控制多媒体通信会话. SIP - 概述 以下是有关SIP的几点注意事项 - S ...
- 【转】SIP协议 会话发起协议
转自:https://www.cnblogs.com/gardenofhu/p/7299963.html 会话发起协议(SIP)是VoIP技术中最常用的协议之一.它是一种应用层协议,与其他应用层协议协 ...
- 基于OpenSIPS做注册服务下,场景A打B,一方发起BYE挂断后收到500,另一方无法挂断的问题
基于OpenSIPS做注册服务下,场景A打B,一方发起BYE挂断后收到500,另一方无法挂断的问题 最近在工作中遇到一个看似很奇怪的,排除起来很费劲,但最后的解决方式又及其简单的问题,下面我们 ...
- [百科] - SIP(会话发起协议)
SIP(会话发起协议)SIP是类似于HTTP的基于文本的协议.SIP可以减少应用特别是高级应用的开发时间.由于基于IP协议的SIP利用了IP网络,固定网运营商也会逐渐认识到SIP技术对于他们的深远意义 ...
- 开源软交换系统 FreeSwitch 与 Asterisk 比较
Asterisk 与freeswitch都是流行的开源软交换服务器,Asterisk出现的比较早,大概在1999年开始此项目,应该是最流行的开源软交换服务器,整个社区上下游都已经很成熟. freesw ...
- PJSUA2开发文档--第七章 呼叫 Calls类
7 呼叫Calls 呼叫由Call类处理 7.1 子类化Call类 要使用Call类,应用程序应创建子类,如: class MyCall : public Call { public: MyCal ...
随机推荐
- ES6的let和const命令
刚开始学习es6,心里有点方,因为看了前言,感觉要用什么bebal来翻译成es5的代码,才能在各个平台上兼容运行,还有node各种运行环境. 不过自己也去百度了一些,发现还是有一丢丢的困难. 言归正传 ...
- [bug]超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
引言 自己弄了一个小项目——日程管理系统,在初始化日期时,查询了数据库,每个日期就会查询一次数据库,就导致了这个问题. 问题 出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小. Desc ...
- 推荐一篇讲arm架构gcc内联汇编的文章
这是来自ethernut网站的一篇文章,原文链接: http://www.ethernut.de/en/documents/arm-inline-asm.html 另外,据说nut/os是个不错的开源 ...
- Unity3d通用工具类之生成文件的MD5
今天我们来写写工具类,这个类有什么用呢? 也就是无论你做什么项目,这个工具类你都可以拿来用,之所以通用,是可以适用所有项目. 这节我主要讲如何生成文件的MD5码. 那么这个MD5是个什么鬼东西,读者可 ...
- 基于Nginx的开墙方案
Kubernetes集群内部通过服务名能进行相互调用,但如果Kubernetes中的pod需要调用外部服务,而且这些外部服务是属于不同的安全区域,就面临开墙的问题,因为Kubernetes Pod能够 ...
- Spring与Quartz的整合
Quartz Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制.Quartz允许开发人员根据时间间隔来调度作业.它实现了作业和触发器的多 ...
- 使用MyEclipse 2014构建Maven项目的两种方法
前提: MyEclipse已配置Maven,具体步骤见http://blog.csdn.net/haishu_zheng/article/details/51492491 方法一: 1 File--& ...
- DevExpress 项目目录列表参考(收集的 350个cs project)
DevExpress.ExpressApp.Tools\DBUpdater\DBUpdater.csproj DevExpress.BonusSkins\DevExpress.BonusSkins.c ...
- 如何安装MySQL软件
1 双击EXE进行安装,在"Developer Components(开发者部分)"上左键单击,选择"This feature, and all subfeatures, ...
- 聊聊iOS中网络编程长连接的那些事
1.长连接在iOS开发中的应用 常见的短连接应用场景:一般的App的网络请求都是基于Http1.0进行的,使用的是NSURLConnection.NSURLSession或者是AFNetworking ...