1.freeswitch拨打分机号
2.吃透mrcp协议
3.opensips简介
4.freeswitch sip tcp链接断开通知的源码编写方法
freeswitch拨打分机号
电话语音服务中,涉及一种复杂场景——总机分机落地。下载客户拨打总机号码后,源码需额外拨入分机号以接通特定电话。下载分机号拨打通常在总机接通后,源码通过语音提示,下载源码起名由总机接收号码后转接分机。源码分机号转接与自动语音应答(IVR)实现相似,下载均基于DTMF(双音多频)编码收号。源码本文不探讨总机分机落地细节,下载而是源码聚焦于如何通过Freeswitch自动拨打分机。
操作环境包括CentOS 7.0及以上版本、下载Freeswitch v1.8.7以及GCC 4.8.5。源码
Freeswitch提供“send_dtmf”应用接口,下载方便发送DTMF码,源码此功能源代码位于mod_dptools模块。应用方法简明,格式如下。
实例展示拨号计划的配置,包括C++代码示例。
修改fs配置文件/usr/local/freeswitch/conf/dialplan/test.xml,app破解完整源码以实现拨号计划。
通过freeswitch命令行使用originate发起呼叫,随后调用拨号计划ext_test发送DTMF。
实例:fs呼叫服务器上的号码,接通后发送DTMF码,日志如下。
总结Freeswitch使用时遇到的两个问题:发送DTMF码时,可能与放音语音叠加,且发送DTMF码的app执行并非即时,需待有媒体流传输时开始。
原计划将源代码流程详述,但代码调用逻辑较为复杂,涉及多模块间跳转,后续将单独章节解析。
Freeswitch通过“send_dtmf”接口实现自动拨打分机功能,但在实际操作中需注意相关问题与优化。
吃透mrcp协议
要深入理解MRCP协议,理解其处理流程、SIP信令流程以及协议的具体步骤至关重要。仅仅通过搭建Freeswitch和UnimrcpServer,网站源码的种类并确保二者之间的通信顺畅,并不足以自认为已经吃透。 真正的吃透意味着你需要深入了解每个环节,这包括但不限于:源码解析:研究Freeswitch的源代码,理解其内部逻辑和处理机制。
实践应用:利用Java或Node等编程语言,构建一个实际的语音转写服务,结合SIP和MRCP v2协议,实现自定义客户端与百度、腾讯、讯飞MRCP服务器的交互。
近期,我的探索进一步深化,我不仅实现了Java版本的MRCP客户端,还开发出了纯Java的MRCP服务器,实现了客户端和服务器之间的双向通信。 当前的挑战包括:大规模压测:测试服务器在高并发情况下的性能。
扩展性:支持与不同ASR服务的集成,以增强功能多样性和兼容性。
opensips简介
在众多sip服务器中,thinkphp易支付源码主要分为两大类:一类侧重于媒体和业务服务器,比如freeswitch/asterisk,另一类侧重于代理和负载服务器,如opensips/kamailio。今天我们来介绍下opensips。
OpenSIPS是用于处理语音、视频、即时消息、在线状态以及其他SIP扩展的开源SIP代理服务器。它被运营商、电信公司或ITSP广泛应用于Class4/5平台、中继、企业/虚拟PBX解决方案、会话边界控制器、应用服务器、前端负载解决方案、IMS平台、呼叫中心等。
OpenSIPS推荐用于各种SIP场景和服务,其特点包括高吞吐量、千月源码弹窗路由和集成的灵活性以及有效的应用程序构建。它提供了超过个模块,用于SIP处理、后端操作、集成和路由逻辑。
接下来,我们介绍OpenSIPS的通用编译安装和配置启动流程。
开发环境需满足以下条件:CentOS版本6或以上、OpenSIPS版本2.4.9、GCC/C++版本4.4.7。
编译安装分为几个步骤:安装依赖库,如hiredis;然后从源码安装包中进行编译安装,有多种方法可选,如方法1或方法2。
安装完成后,目录结构默认位于/usr/local/opensips,需要检查安装目录。
创建数据库时需确保无数据库已存在,执行相应命令。
防火墙设置需根据不同版本的CentOS进行相应配置,例如CentOS6和CentOS7。
配置日志时,修改opensips.cfg和rsyslog.conf文件,新增logrotate.d/opensips文件,并设置定时任务,重启rsyslog服务。
设置TCP最大连接数限制,可通过用户级别、Linux系统级别调整,若服务器作为客户端时还需配置端口范围。通过查看sysctl.conf,使配置立即生效。
使用Linux下查看TCP连接数及状态的命令,统计特定端口的连接数,分析异常情况并封禁IP。
启动脚本可设置为开机自动启动,使用开机自动启动命令。启停命令提供启动和停止选项,启动时如果失败应检查日志文件。
配置文件主要用于配置OpenSIPS作为注册服务器的信令代理和负载节点。增加网关数据,配置sip软终端,并进行加载测试,通过sip软终端注册和发起呼叫,测试信令和媒体的连通性。
总的来说,OpenSIPS作为负载均衡的代理网关,性能优秀。通过配置文件,可以实现常见的网关功能,具体操作请参考OpenSIPS的子模块介绍和接口文档。
freeswitch sip tcp链接断开通知的编写方法
在进行freeswitch集群操作时,确保sip用户在线状态的实时性十分重要。为了实现这一目标,我们需要将sip用户注册情况传递至用户中心。对于sip注册情况,监控mod_sofia事件即可轻松解决。然而,断线通知则需采取额外措施。
断线事件分为两种情况。首先,正常断线通常由linphone用户代理在断开连接时发送一个带有expires字段值为0的sip注册包,这是默认的心跳值。为处理此类事件,仅需在sofia.c或sofia_reg.c中进行相应配置即可。
第二种情况更为复杂,当客户端程序崩溃时,linphone不会发送注册包,直接造成tcp连接中断。此时,我们需要捕捉这一事件并作为用户断线通知上报给用户中心。实现这一目标的关键在于深入分析freeswitch源代码,追踪事件流转路径。
通过在console界面输入“sofia loglevel all 9”,可查看到相关debug代码执行路径。在其中,当tcp连接断开时,freeswitch将调用agent_tp_error()处理函数。遗憾的是,当前版本的freeswitch并未对此事件进行处理。
为解决这一问题,我们需自行构建事件机制。通过研究freeswitch代码结构,可以发现其具备一定的灵活性。我们可以在fs代码中加入自定义事件回调函数,并将其注册至指定处理流程,以便插件处理。
首先,在nta.c中添加事件回调函数。随后,通过注册机制将此回调函数与特定事件id关联。通过nua_stack_tevent()函数,将事件抛给事件分发中心,此事件id应为nua_i_tp_error_report,但可根据实际需求进行自定义命名。在发现tcp断开事件后,只需在agent_tp_error()函数中调用事件驱动代码,即可触发事件。
将此事件逻辑集成至mod_sofia模块代码中,具体操作路径为sofia.c文件内的our_sofia_event_callback()函数。在其中添加对应事件id,并实现处理函数sofia_handle_tp_error_report(),用于上报用户中心关于用户离线的消息。
对于如何将IP和端口映射回原始用户名的问题,解决方案相对简单。在用户注册时记录下IP地址和端口号,通过此信息即可在后续事件处理中匹配回用户身份,完成用户离线消息的准确上报。
至此,通过自定义事件机制与模块集成,实现对tcp断开事件的及时捕捉与处理。这不仅增强了用户集群中心对sip用户在线状态的实时监控能力,也为下一步分布式系统中点对点呼叫、会议集群发起呼叫等应用场景提供了可靠依据。