DTMF采用RFC2833进行带内传输的实现

简介: 在介绍RFC2833前,先来了解一下RTP(Real Time Protocal),该协议可参见RFC1889。RTP协议是IP电话中以及NGN中最经典的协议。无论采用H323,H248,MGCP还是SIP,这些都属于信令层的协议,他们之间进行互通、交换其最终目的是为了实现媒体流的收发。而所有的媒体流都是采用RTP协议,无论是视频,语音还是图象,包括本文所提到的DTMF都是建立在RTP的基础上的。

摘要:    本文主要说明采用RFC2833标准进行DTMF传送的方法和格式。


关键字:RFC2833,RTP,DTMF


一.IP电话传送DTMF的方式


      DTMF就是双音多频,我们日常生活中拨打电话的过程中经常会用到,如拨打用户的分机号码,输入帐号和密码等。而随着IP电话的大量使用如何实现传送DTMF成为IP电话中的一个技术问题。


目前传送DTMF信号普遍有两种方式:带内传送和带外传送。


其中带外传送主要通过将DTMF消息封装到协议中进行传送,如H323协议中可以通过Q931和H245进行传送DTMF。


而带内传输主要有两种:透明传送和RFC2833方式。所谓透明传送就是将DTMF音作为语音一起打包到RTP中进行发送。由于网络丢包的影响,有时会造成DTMF信号丢失,而且DTMF音混合在语音包中,容易产生偏差,造成信号失真。所以目前普遍采用的是RFC2833方式,就是将DTMF数字按照一个的规则和格式组成一个数据包,然后封装到RTP中发送。接收端接收后进行解析,再还原成相应的DTMF信号,这种方式的优点是对丢包的容错性强以及识别差错率低。


二.RTP


      在介绍RFC2833前,先来了解一下RTP(Real Time Protocal),该协议可参见RFC1889。RTP协议是IP电话中以及NGN中最经典的协议。无论采用H323,H248,MGCP还是SIP,这些都属于信令层的协议,他们之间进行互通、交换其最终目的是为了实现媒体流的收发。而所有的媒体流都是采用RTP协议,无论是视频,语音还是图象,包括本文所提到的DTMF都是建立在RTP的基础上的。


RTP协议用以传送实时数据。RTP协议通常运行在UDP层之上,二者共同完成运输层的功能。UDP提供复用及校验和服务,也就是通过分配不同的端口号传送多个RTP流。协议规定,RTP流使用偶数(2n)端口号,相应的RTCP流使用相邻的奇数(2n+1)端口号。因此,应用进程应在一对端口上接收RTP数据和RTCP控制数据,同时向另一对端口上接收RTP数据和RTCP控制数据。


      RTP分组由RTP头部和净荷数据组成;RTP分组由UDP包来进行传输,通常一个UDP包仅含一个RTP分组,若采用一定的封装方法,也可以包含多个RTP分组;其中的RTP净荷就是RTP传送的语音数据。RTP分组的头部的格式如表1:


image.png


表1 RTP分组头部格式


      RTP分组头部的各字段含义为:


1.V:RTP版本号。为“10”。


2.P:填充指示位。


      P为“1”时表示分组结尾含有1个或多个填充字节。


3.X:扩展指示位。

      X为“1”时,则表示固定头部后还有一个扩展头部,这种情况较复杂,很少使用。


4.CC:CSRC计数。

      指示固定头部后的CSRC的个数


5.M:

      由应用文档解释,通常不用。


6.PT:净荷类型

      表示RTP分组的净荷类型。我们常用的有:

¨          “0”:    G.711μ

¨          “8”:    G.711A

¨          “4”:    G.723.1

¨          “18”:  G.729

¨          “96”:RFC2833


7.序号:

      序号顾名思义就是表示RTP分组的次序。初值为随机数,每发送一个增加1。可供接收方检测分组丢失和恢复分组次序。


8.时戳:

      表示RTP分组第一个字节的取样时刻。其初值为随机数,每个采用周期加1。如果每次传送20ms的数据,由于音频的采样频率为8000Hz,即每20ms有160次采样,则每传送20ms的数据,时戳增加160。


9.SSRC:同步源标识(Synchronous Source)

      表示信号的同步源,其值应随机选择,以保证同一个RTP会话中任意两个同步源的SSRC标识不同。


10.CSRC:分信源标识(Contributing Source)

      CSRC标识由混合器插入,其值就是组成复合信号的各个分信号的SSRC标识,用以标识各个组成分信号的信源。RTP分组的头部最多可以包含15个CSRC标识,其数目由CC字段指明。


三.RFC2833


1.标准格式

RFC2833(RTP Payload for DTMF Digits, Telephony Tones and Telephony Signals)是IETF制定的,它规定了传送DTMF数字以及其他电话音和信号的标准。


image.png


图2 RFC2833 净荷格式


图2给出RFC2833的标准格式


events: 事件号,8位,用于说明本数据包的事件。RFC2833除了传送DTMF信号外还能传送传真,调制解调器,MF信号等。本文只关注DTMF信号,有关DTMF的事件看见表2。


image.png


表2DTMF的事件


volume: 音量,6位,用于说明DTMF信号的音频功率级,范围从(0~ -63dbm)。有效的DTMF范围是从0 到-36 dBm0;低于-55 dBm0则必须丢弃。


duration:数字信号的宽度,16位,以时戳单元表示。这样,事件从RTP时间戳表示的瞬间开始,并一直持续到该参数表示的长度。事件可以已经结束也可以没有结束。以8000赫兹


取样来说,本字段最长可以表示8秒。


E:结束位,1位,若设置为1表明数据包中含有事件的结束。因此上述的duration参数即测定了事件的完整宽度。


R:本字段为以后使用而保留。发送方必须将它设为0,接收端则应忽略它。


2.举例


图3 Sniffer抓包截图


图3是采用Sniffer软件所捕获的数据包,从上面可以看到RTP数据为:80 60 03 8e 7d 8b 6a d5 5a 12 02 80 05 f0。我们将该报数据按照格式还原如表3。


image.png


表3 DTMF ‘5’的数据格式


在表3中净荷类型为96,这是RFC2833中规定的,在实际情况下可以自己定义类型,只要通信双方能够确认即可。

对于同一个DTMF信号,其时戳是相同的,这样接收方可以通过判断时戳来剔除冗余信息。


3. 安全性


参考资料:


1.  RFC1889 RTP: A Transport Protocol for Real-Time Applications

2.  RFC2833 RTP Payload for DTMF Digits, Telephony Tones and Telephony Signals


本文出自 51CTO.COM技术博客

相关文章
|
存储 缓存 网络协议
freeswitch使用说明
freeswitch使用说明
freeswitch使用说明
|
缓存 移动开发 网络协议
WebSocket 协议原理抓包分析
WebSocket 协议原理抓包分析
1913 0
|
Web App开发 存储 编解码
Freeswitch关于支持jsip的配置
1、freeswitch安装过程(安装过程省略,运行环境为centos7,freeswitch1.6.5)
1151 0
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
除夕夜,国产顶流压轴上线,QWEN3.5多模态开源!
加我进AI讨论学习群,公众号右下角“联系方式” 文末有老金的 **开源知识库地址·全免费** --- ![Image](https://ucc.alicdn.com/pic/developer-ecology/p3shvhj26rigq_682da514f2d84d68857b797ebe2fbced.jpg) 除夕夜,老金我刚咬了一口韭菜鸡蛋饺子。 手机"叮"的一声,弹出个通知。 老金我瞄
|
运维 Linux 虚拟化
Linux 查看 CPU 使用情况
在 Linux 系统中,查看 CPU 使用情况是性能分析和故障排查的重要环节。查看 CPU 使用情况,使用 top 命令或者 htop 命令来查看。
|
6月前
|
安全 API 开发者
多平台号码标记来电显示查询API接口介绍
本服务提供多平台号码标记查询API,支持腾讯手机管家、百度手机卫士、电话邦、360手机卫士、泰迪熊等多家平台。可快速识别陌生号码是否为骚扰、营销或商业推广电话,助力来电显示标记、智能拦截、通信风控与运营归因,提升通话效率与安全体验。
1303 3
|
存储 安全 前端开发
CC&LG实践|基于 LangGraph 一步步实现 Claude-Code 核心设计
本文旨在深入剖析 Claude-Code 的核心设计思想与关键技术实现,逆向分析其功能模块,结合 LangGraph 框架的能力,系统性地演示如何从一个最基础的 ReAct Agent 出发,逐步构建一个功能完备的简版 Claude-Code。
5710 19
CC&LG实践|基于 LangGraph 一步步实现 Claude-Code 核心设计
|
Ubuntu Linux
在Linux中,如何添加路由?
在Linux中,如何添加路由?