• FreeSWITCH收到重复的DTMF信号


    一、背景

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

    二、现象

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

    三、排查

    跟踪日志。

    1772094 daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 2018-05-03 17:16:57.950006 [DEBUG] switch_ivr_async.c:3200 DTMF DETECTED: [1][0]
    1772095 daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 2018-05-03 17:16:57.950006 [INFO] switch_channel.c:515 RECV DTMF 1:0
    1772096 daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 2018-05-03 17:16:57.950006 [DEBUG] switch_channel.c:524 sofia/internal/15367900000@172.18.0.220 SHORT DTMF DIGIT LEN [0]
    1772099 daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 2018-05-03 17:16:58.190012 [DEBUG] switch_rtp.c:7193 RTP RECV DTMF 1:800
    1772100 daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 2018-05-03 17:16:58.190012 [INFO] switch_channel.c:515 RECV DTMF 1:800
    1772101 daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 2018-05-03 17:16:58.790011 [DEBUG] switch_rtp.c:7193 RTP RECV DTMF 1:800
    1772102 daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 2018-05-03 17:16:58.790011 [INFO] switch_channel.c:515 RECV DTMF 1:800
    1772124 daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 2018-05-03 17:16:59.370014 [DEBUG] switch_rtp.c:7193 RTP RECV DTMF 2:800
    1772125 daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 2018-05-03 17:16:59.370014 [INFO] switch_channel.c:515 RECV DTMF 2:800
    1772128 daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 2018-05-03 17:16:59.690013 [DEBUG] switch_ivr_async.c:3200 DTMF DETECTED: [4][320]
    1772129 daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 2018-05-03 17:16:59.690013 [INFO] switch_channel.c:515 RECV DTMF 4:320
    1772130 daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 2018-05-03 17:16:59.690013 [DEBUG] switch_channel.c:524 sofia/internal/15367900000@172.18.0.220 SHORT DTMF DIGIT LEN [320]
    1772131 daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 2018-05-03 17:16:59.930011 [DEBUG] switch_rtp.c:7193 RTP RECV DTMF 4:800
    1772132 daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 2018-05-03 17:16:59.930011 [INFO] switch_channel.c:515 RECV DTMF 4:800
    1772133 daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 2018-05-03 17:16:59.930011 [DEBUG] switch_ivr_menu.c:424 digits 111244
    1772134 daadbfe3-1cbf-47b3-a2eb-f97d0ad38911 2018-05-03 17:16:59.930011 [DEBUG] switch_ivr_menu.c:559 action regex [111244] [/^(d{6})$/] [2]

    四、分析日志

    发现收到了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方式传递过来的了,但是依然重复了。

    2546518 e6e0ab6c-dec7-4713-a235-a5c9254011e3 2018-05-09 09:57:18.530004 [DEBUG] switch_ivr_async.c:3200 DTMF DETECTED: [1][0]
    2546519 e6e0ab6c-dec7-4713-a235-a5c9254011e3 2018-05-09 09:57:18.530004 [INFO] switch_channel.c:515 RECV DTMF 1:0
    2546520 e6e0ab6c-dec7-4713-a235-a5c9254011e3 2018-05-09 09:57:18.530004 [DEBUG] switch_channel.c:524 sofia/internal/15367900000@172.18.0.220 SHORT DTMF DIGIT LEN [0]
    2546523 e6e0ab6c-dec7-4713-a235-a5c9254011e3 2018-05-09 09:57:18.830006 [DEBUG] switch_ivr_async.c:3200 DTMF DETECTED: [1][640]
    2546524 e6e0ab6c-dec7-4713-a235-a5c9254011e3 2018-05-09 09:57:18.830006 [INFO] switch_channel.c:515 RECV DTMF 1:640
    2546525 e6e0ab6c-dec7-4713-a235-a5c9254011e3 2018-05-09 09:57:19.350005 [DEBUG] switch_ivr_async.c:3200 DTMF DETECTED: [7][0]
    2546526 e6e0ab6c-dec7-4713-a235-a5c9254011e3 2018-05-09 09:57:19.350005 [INFO] switch_channel.c:515 RECV DTMF 7:0
    2546527 e6e0ab6c-dec7-4713-a235-a5c9254011e3 2018-05-09 09:57:19.350005 [DEBUG] switch_channel.c:524 sofia/internal/15367900000@172.18.0.220 SHORT DTMF DIGIT LEN [0]
    2546531 e6e0ab6c-dec7-4713-a235-a5c9254011e3 2018-05-09 09:57:19.650004 [DEBUG] switch_ivr_async.c:3200 DTMF DETECTED: [7][640]
    2546532 e6e0ab6c-dec7-4713-a235-a5c9254011e3 2018-05-09 09:57:19.650004 [INFO] switch_channel.c:515 RECV DTMF 7:640
    2546533 e6e0ab6c-dec7-4713-a235-a5c9254011e3 2018-05-09 09:57:20.610004 [DEBUG] switch_ivr_async.c:3200 DTMF DETECTED: [8][0]
    2546534 e6e0ab6c-dec7-4713-a235-a5c9254011e3 2018-05-09 09:57:20.610004 [INFO] switch_channel.c:515 RECV DTMF 8:0
    2546535 e6e0ab6c-dec7-4713-a235-a5c9254011e3 2018-05-09 09:57:20.610004 [DEBUG] switch_channel.c:524 sofia/internal/15367900000@172.18.0.220 SHORT DTMF DIGIT LEN [0]
    2546536 e6e0ab6c-dec7-4713-a235-a5c9254011e3 2018-05-09 09:57:20.890004 [DEBUG] switch_ivr_async.c:3200 DTMF DETECTED: [8][640]
    2546537 e6e0ab6c-dec7-4713-a235-a5c9254011e3 2018-05-09 09:57:20.890004 [INFO] switch_channel.c:515 RECV DTMF 8:640
    2546538 e6e0ab6c-dec7-4713-a235-a5c9254011e3 2018-05-09 09:57:20.890004 [DEBUG] switch_ivr_menu.c:424 digits 117788
    2546539 e6e0ab6c-dec7-4713-a235-a5c9254011e3 2018-05-09 09:57:20.890004 [DEBUG] switch_ivr_menu.c:559 action regex [117788] [/^(d{6})$/] [2]

    六、继续处理

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

    七、奇妙的过程

    让我们自己从源头定位一下吧,首先,抓包。因为业务电话很多。抓到的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信号,不抓虾的感觉真好。

  • 相关阅读:
    编译Android系统源码和内核源码
    Ubuntu中的解压缩文件的方式
    将秒数转换为基于00:00的时间
    git sshkeygen Fingerprint cannot be generated解决方法
    git bash下的选择、复制、粘贴
    mac 配置jdk maven
    自定义标签
    垃圾收集器和收集算法
    多线程并发中的同步
    现在有T1、T2、T3三个线程,怎样保证T2在T1执行完后执行,T3在T2执行完后执行?使用Join
  • 原文地址:https://www.cnblogs.com/yoyotl/p/9018798.html
Copyright © 2020-2023  润新知