手机打电话时将对方DTMF数字转为RFC2833发给局域网SIP坐席

news2025/6/4 17:37:48

手机打电话时将对方DTMF数字转为RFC2833发给局域网SIP坐席

--局域网SIP坐席呼叫

上一篇:手机打电话时由对方DTMF响应切换多级IVR语音菜单(完结)

下一篇:安卓App识别手机系统弹授权框包含某段文字-并自动点击确定按钮


  • 一、前

在前期的《手机实时提取SIM卡打电话的信令声音》系列篇章中,我们针对局域网呼叫中心SIP坐席的用户,提供了将手机通话的语音拦截后转发到局域网坐席的能力。

此前的方案中,针对手机SIM卡通话过程中,对方手机拨号盘按键的DTMF数字;由于手机通话默认采用In-band的带内传输方式来传递DTMF,通话的语音数据中已经夹带了DTMF的按键内容。局域网SIP平台或呼叫中心,可以直接采用In-band的方式来直接解析出DTMF按键信息,并根据这个按键做出自己的业务响应和处理。

但是后来我们发现,SIP服务器中开启In-band的方式来解析语音中的内容本身也比较耗费时间,而且配置不同的网关线路识别DTMF按键分别识别【In-band、RFC2833、SIP-Info】这几个类型的解码方式本身也存在时延和准确性的差异,增加了SIP服务器配置的复杂度。(我们仍然建议局域网SIP平台或呼叫中心采用这种服务器解析的方式,因为服务器性能明显要比手机性能要好,准确率也高,而且可以根据原始语音数据挂载各种硬件DTMF解码器

为了降低SIP服务器的部署复杂度,我们基于上一篇章《手机SIM卡打电话时识别对方按下的DTMF按键》中,在手机SDK中已经解析出DTMF数字的基础之上,针对局域网SIP平台的用户,在手机App的设置中增加了【转发解码出的DTMF】的功能:将蓝牙电话SDK中接收到的语音数据,通过软件解码器解析出“In-band的带内传输方式”来传递的DTMF按键值,经由SIP协议建立的RTP/RTCP通道,使用RFC2833,转发给SIP平台

然而比较麻烦的问题是:

1、因为手机处理性能的原因,我们并没有抹去声音数据中In-band传输的DTMF按键内容。这也就意味着App开启这个开关后,按下DTMF一次按键将会有两份DTMF数据在信道中传输(一个In-band语音数据+一个新的RFC2833的RTP数据)。

2、手机SDK软DTMF解码,准确率并不是100%,可能存在解码的误码。

基于以上原因,由于蓝牙方案的SDK并未对通话过程中的语音进行任何加工,有条件的话,还是建议走局域网SIP平台和呼叫中心的用户,直接在服务器或网关中,自行挂载DTMF硬件解码器或软件解码器自己进行解析。手机App设置中,对【转发解码出的DTMF】的开关,默认也是不开启的

体验和下载地址:

智能拨号器App:http://120.78.211.195:8060/Dialer.apk

拨号器SDK示例app:http://120.78.211.195:8060/sdk/SdkDemo.apk

USB蓝牙配件购买路径(参考):https://item.taobao.com/item.htm?_u=pk10l4ccbcd&id=649368472986

  • 二、手机App的界面开关

我们基于蓝牙电话SDK,封装出来的【智能拨号器App】的Android手机App,在插入USB蓝牙配件后默认就已经具有拦截电话通话和将通话语音数据转发给局域网内的SIP平台和坐席的能力。

在这个基础之上,在手机App的设置中增加了【转发解码出的DTMF】的功能:将蓝牙电话SDK中接收到的语音数据,通过软件解码器解析出“In-band的带内传输方式”来传递的DTMF按键值,经由SIP协议建立的RTP/RTCP通道,使用RFC2833,转发给SIP平台。

智能拨号器App中,设置界面的DTMF开关,大致如下图所示:

开启后即可在手机通话过程中,实时的将解码出的DTMF数字,通过RFC2833,转发给SIP平台。

  • 三、SIP平台接收和打印DTMF数字

通话过程中,若对方手机的拨号盘按下了对应的DTMF数字,则局域网SIP平台中将会收到以RFC2833发过来的rtp数据(此处使用《蓝牙电话与FreeSwitch服务器和UA坐席的通话》篇章中搭建的FreeSwitch服务器为例,来介绍SIP平台日志打印和消息转发给坐席的方式)。

界面效果如下图所示:

可以看到,随着通话对方按下不同的按键,FreeSwitch日志中,会不停的刷新DTMF按键值的日志。

(此处有个缺陷:按下按键后,由于手机算力和网络原因,手机SDK解码和手机到局域网SIP平台的传输效率,FreeSwitch日志响应的有快有慢,基本会有三四百毫秒的延迟)

  • 四、本地电脑SIP坐席的接听和抓包

我们通过在本地电脑中,使用Wireshark大白鲨进行抓包,并对通话过程内容进行VOIP的解析。可以清楚的看到,在手机App开启了【转发解码出的DTMF】开关后,SIP平台到本地电脑SIP坐席之间的链路,在通话对方按下DTMF按键后,抓包的数据内容中多出了不少以“RTP EVENT”开头的RFC 2833的rtp数据,传递给了本地电脑的SIP客户端。

界面的展示效果如下图所示:

我们直接使用EyeBeam或x-lite的SIP客户端,按下其数字按键,在抓包内容中也同样是以RFC 2833的rtp数据向SIP平台传输。

这样,SIP服务器就只需要开启对RFC 2833的DTMF识别,就能够捕获到通话双方之间的按键内容,不再需要又开启In-band、又开启RFC2833来进行分类识别了。

双向传输的抓包效果,如下图所示:

  • 五、题外:画蛇添足的一章

前期预研的时候,我们本想在手机App开启了【转发解码出的DTMF】开关后,学FreeSwitch的【spandsp_start_dtmf】函数功能,将In-band带内DTMF转为RFC2833或SIP-Info时,主动抹去声音数据中In-band的DTMF的语音内容。经过一顿努力,发现效果不理想,就暂时不去改变通话声音的原始数据。主要风险有以下两点:

1、抹除算法感觉有点问题,担心消除的不干净(看下面的图)。

2、SDK拦截手机通话声音,之前都是透传原始语音,收发速度很快。现在手机先做DTMF去除的运算,运算完毕后再把结果的语音数据流发出到SIP平台,增大了延迟

语音数据处理的的展示效果如下图所示:

经过深思熟虑,暂时还是别搞去除了,两份DTMF就两份吧,手机性能本身就比不上服务器性能。没有必要为了消除带内DTMF数据,把通话语音的延迟给增大。

  • 六、总结

本文是为了简化SIP平台的部署难度,针对SIM卡电话通话中的DTMF按键的信息,在蓝牙电话SDK到SIP平台的这一段通路中,将蓝牙电话SDK解码出来的DTMF数字,通过RFC2833的协议,使用rtp将DTMF又多发了一份给SIP平台。使SIP平台可以不用特意专门去解析In-band带内DTMF,即可正常获取到对方的按键值。

有利于局域网SIP平台或呼叫中心,能保持原先的业务不动,在不引入新的DTMF解码器硬件和改动模块配置的情况下,快速的将蓝牙电话方案给对接到原有系统中,进行业务功能的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2396346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP Business One:无锡哲讯科技助力中小企业数字化转型的智慧之选

数字化转型,中小企业的必经之路 在当今竞争激烈的商业环境中,数字化转型已不再是大型企业的专利,越来越多的中小企业开始寻求高效、灵活的管理系统来优化业务流程、提升运营效率。作为全球领先的企业管理软件,SAP Business One…

小型语言模型:为何“小”才是“大”?

当说到人工智能(AI)的时候,大家通常会想到那些拥有数十亿参数的超大型语言模型,它们能做出一些令人惊叹的事情。 厉害不厉害?绝对厉害! 但对于大多数企业和开发者来说,实用吗?可能…

秋招Day12 - 计算机网络 - 网络综合

从浏览器地址栏输入URL到显示网页的过程了解吗? 从在浏览器地址栏输入 URL 到显示网页的完整过程,并不是一个单一的数据包从头到尾、一次性地完成七层封装再七层解析的过程。 而是涉及到多次、针对不同目的、与不同服务器进行的、独立的网络通信交互&a…

QT-JSON

#include <QJsonDocument>#include <QJsonObject>#include <QJsonArray>#include <QFile>#include <QDebug>void createJsonFile() {// 创建一个JSON对象 键值对QJsonObject jsonObj;jsonObj["name"] "John Doe";jsonObj[…

IP 风险画像技术略解

IP 风险画像的技术定义与价值 IP 风险画像通过整合 IP 查询数据与 IP 离线库信息&#xff0c;结合机器学习算法&#xff0c;为每个 IP 地址生成多维度风险评估模型。其核心价值在于将传统的静态 IP 黑名单升级为动态风险评估体系&#xff0c;可实时识别新型网络威胁&#xff0…

秋招Day12 - 计算机网络 - 基础

说一下计算机网络体系结构 OSI七层模型&#xff0c;TCP/IP四层模型和五层体系结构 说说OSI七层模型&#xff1f; 应用层&#xff1a;最靠近用户的层&#xff0c;用于处理特定应用程序的细节&#xff0c;提供了应用程序和网络服务之间的接口。表示层&#xff1a;确保从一个系…

【网络安全】——Modbus协议详解:工业通信的“通用语言”

目录 一、初识Modbus&#xff1a;工业通信的基石 1.1 协议全称 1.2 协议简史 二、核心特性解析 2.1 架构设计 2.2 典型应用场景 三、协议族全景图 3.1 协议栈分类 3.2 版本演进对比 四、协议报文深度解析 4.1 Modbus RTU帧结构 4.2 Modbus TCP报文 五、通信机制实…

【GlobalMapper精品教程】095:如何获取无人机照片的拍摄方位角

文章目录 一、加载无人机照片二、计算方位角三、Globalmapper符号化显示方向四、arcgis符号化显示方向一、加载无人机照片 打开软件,加载无人机照片,在GLobalmapperV26中文版中,默认显示如下的航线信息。 关于航线的起止问题,可以直接从照片名称来确定。 二、计算方位角 …

小提琴图绘制-Graph prism

在 GraphPad Prism 中为小提琴图添加显著性标记(如*P<0.05)的步骤如下: 步骤1:完成统计检验 选择数据表:确保数据已按分组排列(如A列=Group1,B列=Group2)。执行统计检验: 点击工具栏 Analyze → Column analyses → Mann-Whitney test(非参数检验,适用于非正态数…

[GHCTF 2025]SQL???

打开题目在线环境&#xff1a; 先尝试注入&#xff1a; id1;show databases; 发现报错&#xff0c;后来看了wp才知道这个题目是SQLite注入。 我看的是这个师傅的wp: https://blog.csdn.net/2401_86190146/article/details/146164505?ops_request_misc%257B%2522request%255Fid…

【科研绘图系列】R语言绘制GO term 富集分析图(enrichment barplot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图code 2code 3系统信息介绍 本文介绍了使用R语言绘制GO富集分析条形图的方法。通过加载ggplot2等R包,对GO term数据进行预处理,包括p值转换…

Laravel单元测试使用示例

Date: 2025-05-28 17:35:46 author: lijianzhan 在 Laravel 框架中&#xff0c;单元测试是一种常用的测试方法&#xff0c;它是允许你测试应用程序中的最小可测试单元&#xff0c;通常是方法或函数。Laravel 提供了内置的测试工具PHPUnit&#xff0c;实践中进行单元测试是保障代…

Kotlin委托机制使用方式和原理

目录 类委托属性委托简单的实现属性委托Kotlin标准库中提供的几个委托延迟属性LazyLazy委托参数可观察属性Observable委托vetoable委托属性储存在Map中 实践方式双击back退出Fragment/Activity传参ViewBinding和委托 类委托 类委托有点类似于Java中的代理模式 interface Base…

基于 HT for Web 轻量化 3D 数字孪生数据中心解决方案

一、技术架构&#xff1a;HT for Web 的核心能力 图扑软件自主研发的 HT for Web 是基于 HTML5 的 2D/3D 可视化引擎&#xff0c;核心技术特性包括&#xff1a; 跨平台渲染&#xff1a;采用 WebGL 技术&#xff0c;支持 PC、移动端浏览器直接访问&#xff0c;兼容主流操作系统…

精英-探索双群协同优化(Elite-Exploration Dual Swarm Cooperative Optimization, EEDSCO)

一种多群体智能优化算法&#xff0c;其核心思想是通过两个分工明确的群体——精英群和探索群——协同工作&#xff0c;平衡算法的全局探索与局部开发能力&#xff0c;从而提高收敛精度并避免早熟收敛。 一 核心概念 在传统优化算法&#xff08;如粒子群优化、遗传算法&#xf…

解决Ubuntu20.04上Qt串口通信 QSerialPort 打开失败的问题

运行Qt串口通信 open(QIODevice::ReadWrite) 时&#xff0c;总是失败。 1、打印失败原因 QString QSerialHelper::openSerail() {if(this->open(QIODevice::ReadWrite) true){return this->portName();}else{return "打开失败";//return this->errorStri…

设计模式——观察者设计模式(行为型)

摘要 本文详细介绍了观察者设计模式&#xff0c;包括其定义、结构、实现方式、适用场景以及实战示例。通过代码示例展示了如何在Spring框架下实现观察者模式&#xff0c;以及如何通过该模式实现状态变化通知。同时&#xff0c;对比了观察者模式与消息中间件在设计理念、耦合程…

【计算机系统结构】习题2

目录 1.有一条静态多功能流水线由5段组成&#xff0c;加法用1、2、4、5段&#xff0c;乘法用1、3、5段&#xff0c;第3段时间为&#xff0c;其余各段为&#xff0c;且流水线的输出可直接返回输入端或暂存器&#xff0c;若计算&#xff0c;试计算吞吐量、加速比、效率 2.有一动…

用户资产化视角下开源AI智能名片链动2+1模式S2B2C商城小程序的应用研究

摘要&#xff1a;在数字化时代&#xff0c;平台流量用户尚未完全转化为企业的数字资产&#xff0c;唯有将其沉淀至私域流量池并实现可控、随时触达&#xff0c;方能成为企业重要的数字资产。本文从用户资产化视角出发&#xff0c;探讨开源AI智能名片链动21模式S2B2C商城小程序在…

机器学习实验七--SVM垃圾邮件分类器

SVM垃圾邮件分类器 一、什么是SVM二、实例&#xff1a;垃圾邮件分类器1.实验要求2.原理解释2.1 数据预处理流程2.2 特征提取方法2.3 SVM分类器 3.代码实现4.实验结果5.实验总结 一、什么是SVM 支持向量机(Support Vector Machine, SVM)是一种监督学习算法&#xff0c;主要用于…