FreeSWITCH在answer前主动发dtmf

操作系统 :CentOS 7.6_x64
FreeSWITCH版本 :1.10.9
NAT环境的主动外呼场景下,会遇到线路侧回铃音数据无法接收的问题,需要FreeSWITCH主动发送RTP数据,发送DTMF是个选择。本文记录下如何使用FreeSWITCH在answer前发送DTMF,我将从以下几个方面进行展开:

  • FreeSWITCH如何发送DTMF

  • sipp如何模拟180和183

  • FreeSWITCH如何在180和183时发送DTMF

  • 相关脚本及资源下载

一、FreeSWITCH发送DTMF

可使用 uuid_send_dtmf 来发送dtmf,命令格式如下:

复制代码
uuid_send_dtmf  <uuid> <dtmf_data>

示例如下:

复制代码
uuid_send_dtmf 4d5b6296-155f-4d9a-9fea-ae3284fc48a6 1

效果如下:

二、sipp模拟180和183

使用sipp模拟180和183的场景,以便测试。
sipp版本: 3.6.1

sipp如何安装及基础使用,可参考如下文章:
https://www.cnblogs.com/MikeZhang/p/sippPcapTest.html

1、sipp模拟180

实现思路如下:
1)sipp以UAS模式启动;
2)只发送180信令;
3)在200中设置编码数据;
4)通过播放pcap文件模拟rtp数据;

示例xml如下(sipp_uas_180_g711a.xml):

完整代码可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20231205 获取。
启动脚本如下:

复制代码
#! /bin/bash

./sipp -i 192.168.137.31 -p 55080 -sf sipp_uas_180_g711a.xml

启动效果如下:

2、sipp模拟183

实现思路如下:
1)sipp以UAS模式启动;
2)只发送183信令;
3)在183中设置编码数据,通过播放pcap文件模拟回铃音rtp数据;
4)发送200信令,通过播放pcap文件模拟通话过程的rtp数据;

示例xml如下(sipp_uas_183_g711a.xml):

完整代码可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20231205 获取。

启动脚本如下:

复制代码
#! /bin/bash

./sipp -i 192.168.137.31 -p 55080 -sf sipp_uas_183_g711a.xml

启动效果如下:

三、FreeSWITCH在180和183时发送DTMF

FS机器: 192.168.137.32
SIPP机器: 192.168.137.31

1、在180时发送dtmf

使用 api_on_ring 进行dtmf发送,会在180时触发该操作。

1.1 编写拨号方案
思路如下:
1)设置api_on_ring回调命令;
2)桥接sipp模拟的180场景;

示例如下:

复制代码
    <extension name="test180">
        <condition field="destination_number" expression="^321$">
             <action application="set" data="hangup_after_bridge=true"/>
             <action application="lua" data="dtmfTest180.lua"/>
        </condition>
    </extension>

lua脚本可从文末提供的渠道获取。
1.2 使用分机拨打测试
步骤如下:
1)启动sipp模拟的180场景;
2)注册分机1000;
3)使用分机1000拨打321号码;

测试日志如下:

wireshark抓包效果如下:

运行效果视频可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 2023120501 获取。

2、在183时发送dtmf

使用 api_on_pre_answer 进行dtmf发送,会在183时触发该操作,但需要注意的时,此时rtp连接并未建立,需要通过lua脚本进行休眠操作,待rtp连接建立后再发送dtmf数据。
2.1 编写拨号方案
思路如下:
1)设置api_on_ring回调命令;
2)桥接sipp模拟的183场景;

示例如下:

复制代码
    <extension name="test183">
        <condition field="destination_number" expression="^322$">
             <action application="set" data="hangup_after_bridge=true"/>
             <action application="lua" data="dtmfTest183.lua"/>
        </condition>
    </extension>

lua脚本可从文末提供的渠道获取。
2.2 使用分机拨打测试
步骤如下:
1)启动sipp模拟的183场景;
2)注册分机1000;
3)使用分机1000拨打322号码;

测试日志如下:

wireshark抓包效果如下:

运行效果视频可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 2023120502 获取。

四、资源下载

本文涉及资源,可以从如下途径获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20231205 获取。

好,就这么多了,希望对你有帮助。

相关推荐
谢平康1 个月前
使用firewall-cmd配置SIP端口转发,实现双网卡互通,内外网方式
freeswitch·sip·双网卡互通
贾宝玉的玉宝贾2 个月前
FreeSWITCH 简单图形化界面40 - 使用mod_curl模块进行http请求
python·http·voip·freeswitch·sip
狂爱代码的码农3 个月前
FreeSwitch之mod_cidlookup 和 mod_blacklist和mod_curl的抉择
freeswitch
狂爱代码的码农3 个月前
FreeSwitch 的 `mod_blacklist` 模块详解
freeswitch
浪游东戴河3 个月前
VoIP之音视频会议中的混音技术
voip·溢出·混音·线性·音频会议
狂爱代码的码农3 个月前
freeswitch在centos上编译过程
freeswitch
狂爱代码的码农4 个月前
debian12.9编译freeswitch1.10.12【默认安装】
freeswitch
Mike_Zhang4 个月前
FreeSWITCH日志功能分析及apr模拟
voip·freeswitch
贾宝玉的玉宝贾4 个月前
FreeSWITCH 简单图形化界面39 - Windows安装FreeSWITCH For IPPBX(WSL环境)
windows·voip·freeswitch·ippbx·sip测试