一、背景

用户是运营商手机,拨打的是运营商的固话号码进入的FreeSWITCH的IVR,进入IVR语音播报后,按指定的分机号呼相关人员。

二、现象

用户反映拨打124870找不到指定人员,以前是正常的。

三、排查

跟踪日志。

 daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 -- ::57.950006 [DEBUG] switch_ivr_async.c: DTMF DETECTED: [][]
daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 -- ::57.950006 [INFO] switch_channel.c: RECV DTMF :
daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 -- ::57.950006 [DEBUG] switch_channel.c: sofia/internal/@172.18.0.220 SHORT DTMF DIGIT LEN []
daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 -- ::58.190012 [DEBUG] switch_rtp.c: RTP RECV DTMF :
daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 -- ::58.190012 [INFO] switch_channel.c: RECV DTMF :
daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 -- ::58.790011 [DEBUG] switch_rtp.c: RTP RECV DTMF :
daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 -- ::58.790011 [INFO] switch_channel.c: RECV DTMF :
daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 -- ::59.370014 [DEBUG] switch_rtp.c: RTP RECV DTMF :
daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 -- ::59.370014 [INFO] switch_channel.c: RECV DTMF :
daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 -- ::59.690013 [DEBUG] switch_ivr_async.c: DTMF DETECTED: [][]
daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 -- ::59.690013 [INFO] switch_channel.c: RECV DTMF :
daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 -- ::59.690013 [DEBUG] switch_channel.c: sofia/internal/@172.18.0.220 SHORT DTMF DIGIT LEN []
daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 -- ::59.930011 [DEBUG] switch_rtp.c: RTP RECV DTMF :
daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 -- ::59.930011 [INFO] switch_channel.c: RECV DTMF :
daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 -- ::59.930011 [DEBUG] switch_ivr_menu.c: digits
daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 -- ::59.930011 [DEBUG] switch_ivr_menu.c: action regex [] [/^(\d{})$/] []

四、分析日志

发现收到了DTMF信号是111244。一个一个看,

第一个DTMF信号1是inband信号,从音频信号里分析出来的(看日志打印DTMF DETECTED表明了这种方式)。
第二个DTMF信号1是RFC2833信号,从RTP包里分析出来的(看日志打印RTP RECV DTMF表明了这种方式)。
第三个DTMF信号1是RFC2833信号,从RTP包里分析出来的(看日志打印RTP RECV DTMF表明了这种方式)。
第四个DTMF信号2是RFC2833信号,从RTP包里分析出来的(看日志打印RTP RECV DTMF表明了这种方式)。
第五个DTMF信号4是inband信号,从音频信号里分析出来的(看日志打印DTMF DETECTED表明了这种方式)。
第六个DTMF信号4是RFC2833信号,从RTP包里分析出来的(看日志打印RTP RECV DTMF表明了这种方式)。

也就是说,运营商同时用两种方式给我传输了DTMF信号,关键FreeSWITCH还同时解了两种信号源,拼成一个DTMF字串,所以BUG就出现了。

以前是正常的,是以前运营商没有传rfc2833信号。

联系运营商,说关闭两种协议同时发的配置了。现在只使用inband方式。

五、继续测试

还是能收到号码重复的现象,这次再看日志,变化了:

这次所有的信号都是使用inband方式传递过来的了,但是依然重复了。

 e6e0ab6c-dec7--a235-a5c9254011e3 -- ::18.530004 [DEBUG] switch_ivr_async.c: DTMF DETECTED: [][]
e6e0ab6c-dec7--a235-a5c9254011e3 -- ::18.530004 [INFO] switch_channel.c: RECV DTMF :
e6e0ab6c-dec7--a235-a5c9254011e3 -- ::18.530004 [DEBUG] switch_channel.c: sofia/internal/@172.18.0.220 SHORT DTMF DIGIT LEN []
e6e0ab6c-dec7--a235-a5c9254011e3 -- ::18.830006 [DEBUG] switch_ivr_async.c: DTMF DETECTED: [][]
e6e0ab6c-dec7--a235-a5c9254011e3 -- ::18.830006 [INFO] switch_channel.c: RECV DTMF :
e6e0ab6c-dec7--a235-a5c9254011e3 -- ::19.350005 [DEBUG] switch_ivr_async.c: DTMF DETECTED: [][]
e6e0ab6c-dec7--a235-a5c9254011e3 -- ::19.350005 [INFO] switch_channel.c: RECV DTMF :
e6e0ab6c-dec7--a235-a5c9254011e3 -- ::19.350005 [DEBUG] switch_channel.c: sofia/internal/@172.18.0.220 SHORT DTMF DIGIT LEN []
e6e0ab6c-dec7--a235-a5c9254011e3 -- ::19.650004 [DEBUG] switch_ivr_async.c: DTMF DETECTED: [][]
e6e0ab6c-dec7--a235-a5c9254011e3 -- ::19.650004 [INFO] switch_channel.c: RECV DTMF :
e6e0ab6c-dec7--a235-a5c9254011e3 -- ::20.610004 [DEBUG] switch_ivr_async.c: DTMF DETECTED: [][]
e6e0ab6c-dec7--a235-a5c9254011e3 -- ::20.610004 [INFO] switch_channel.c: RECV DTMF :
e6e0ab6c-dec7--a235-a5c9254011e3 -- ::20.610004 [DEBUG] switch_channel.c: sofia/internal/@172.18.0.220 SHORT DTMF DIGIT LEN []
e6e0ab6c-dec7--a235-a5c9254011e3 -- ::20.890004 [DEBUG] switch_ivr_async.c: DTMF DETECTED: [][]
e6e0ab6c-dec7--a235-a5c9254011e3 -- ::20.890004 [INFO] switch_channel.c: RECV DTMF :
e6e0ab6c-dec7--a235-a5c9254011e3 -- ::20.890004 [DEBUG] switch_ivr_menu.c: digits
e6e0ab6c-dec7--a235-a5c9254011e3 -- ::20.890004 [DEBUG] switch_ivr_menu.c: action regex [] [/^(\d{})$/] []

六、继续处理

联系运营商,说需要抓包分析。想一想也是,这种日志毕竟是我们的软件打印的,不排除我们软件的检测问题。

七、奇妙的过程

让我们自己从源头定位一下吧,首先,抓包。因为业务电话很多。抓到的wireshark包很大。

1. 拆包和并包,参考http://www.cnblogs.com/yoyotl/p/8579217.html。从1个GB的包里拆出一个1.5MB的小包。

2. 查看并导出RTP流。

2.1 电话->RTP->RTP流;

2.2 在弹出的RTP流中选中需要导出那一条记录->分析;

2.3 在弹出的对话框中选择->Save->同步的正向音频;

2.4 得到一个*.au格式的音频文件。

赞一下wireshark,可以很直观的看出来声音波形,如图:

3. 问题来了,怎么知道这些波形里是否含有DTMF信号呢?是的话又是哪个信号呢?

这时候就需要借助另外一款神奇的产品了Cool Edit,真是够酷的!

4. 下载安装,打开au文件,得到这样的一个图。

5. 乍一看和wireshark看到的波形一样,但是这款软件提供了量化分析的功能。

6. 选中想要分析的波形区域->Analyze->Show Frequency Analysis,弹出如下一个图:

读出两个峰值,分别代表了低频和高频频率。
低频695.3,高频1210

7. 对照标准的DTMF频率表,如图:

8. 哈哈,得到了这段波形代表的DTMF信号了,就是1。

以此类推,读出这段波形中的DTMF信息是117788661100。

确定是运营商多送了重复的DTMF信号,不抓虾的感觉真好。

FreeSWITCH收到重复的DTMF信号的更多相关文章

  1. 使用Goertzel算法识别DTMF信号

    Goertzel算法 Goertzel算法由Gerald Goertzel在1958年提出,用于数字信号处理,是属于离散傅里叶变换的范畴,目的是从给定的采样中求出某一特定频率信号的能量,用于有效性的评 ...

  2. HTML5实现DTMF(电话拨号按键信号)解码、编码,代码简单易于移植

    目录 一.前言 1.1 HTML5实现DTMF的一些动机 1.2 一些有效场景 (1) 10086 (2) 软电话 (3) 小玩具 二.DTMF频率按键对照表 三.DTMF信号解码 得到按键值 3.1 ...

  3. sigsuspend()阻塞:异步信号SIGIO为什么会被截胡?

    关键词:fcntl.fasync.signal.sigsuspend.pthread_sigmask.trace events. 此文主要是解决问题过程中的记录,内容有较多冗余.但也反映解决问题中用到 ...

  4. django信号 signal

    django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发送给一组接受者(rec ...

  5. Linux信号机制

    Linux信号(signal) 机制分析 [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核 ...

  6. FreeSWITCH 学习笔记

    [1]FreeSWITCH学习笔记 1.Windows安装包下载地址:http://files.freeswitch.org/windows/installer/ 2.源码下载地址:http://fi ...

  7. Django信号机制相关解释与示例

    Django 信号# django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发 ...

  8. linux信号调用机制

    在Linux中,信号是进程间通讯的一种方式,它采用的是异步机制.当信号发送到某个进程中时,操作系统会中断该进程的正常流程,并进入相应的信号处理函数执行操作,完成后再回到中断的地方继续执行. 需要说明的 ...

  9. 基于OpenSIPS做注册服务下,场景A打B,一方发起BYE挂断后收到500,另一方无法挂断的问题

    基于OpenSIPS做注册服务下,场景A打B,一方发起BYE挂断后收到500,另一方无法挂断的问题     最近在工作中遇到一个看似很奇怪的,排除起来很费劲,但最后的解决方式又及其简单的问题,下面我们 ...

随机推荐

  1. 分布式锁与实现(一)——基于Redis实现(转载)

    php的完整流程,包护队列操作:http://www.cnblogs.com/candychen/p/5736128.html 概述 目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致 ...

  2. JXL基本操作

    一.jxl.jar概述 通过java操作excel表格的工具类库 支持Excel 95-2000的所有版本 生成Excel 2000标准格式 支持字体.数字.日期操作 能够修饰单元格属性 支持图像和图 ...

  3. Linux下GoAccess的安装与全部用法

      GoAccess用户文档 一. GoAccess概述 1.1 GoAccess概述 goaccess是一个实时的web日志分析器,以及交互式查看器,在类Unix系统的终端(terminal)上运行 ...

  4. 茶道(tea)

    #include<iostream> #include<string> #include<stdio.h> #include<algorithm> #i ...

  5. 数据库中truncate与delete的区别与联系

    昨天被问到truncate与delete的区别,truncate没用过,回去百度了一下,才知道还有这个一种语句. truncate table命令将快速删除数据表中的所有记录(保留数据表结构).这种快 ...

  6. Flex报错Error #2048: 安全沙箱冲突

    Flex+JPA架构,JPA程序迁移,从Aserver到B. 其它一切没变.唯一变的就是IP. 前端Flex也就是swf报错Error #2048: 安全沙箱冲突:http://xxx.swf 不能从 ...

  7. hdu 3308 LCIS(线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3308 LCIS Time Limit: 6000/2000 MS (Java/Others)     ...

  8. 实现Excel单元格中的下拉选项

    目的:控制数据录入的类型和具体数据的限制,避免数据错误输入 操作步骤: 1.选中需要设置下拉菜单的单元格 2.单击数据选项卡---数据有效性---设置选项卡---允许功能中选择序列---在来源编辑框中 ...

  9. python 模块之platform模块(基本了解)

    # -*- coding: cp936 -*-#python 27#xiaodeng#python 模块之platform模块(基本了解)#获取底层平台的识别数据 #知道该模块用途即可,需要使用时直接 ...

  10. C++中public、protected及private使用方法

    1.类的一个特征就是封装,public和private作用就是实现这一目的.所以: 用户代码(类外)能够訪问public成员而不能訪问private成员:private成员仅仅能由类成员(类内)和友元 ...