博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FreeSWITCH在呼叫失败的情况下播放语音提示
阅读量:6113 次
发布时间:2019-06-21

本文共 2246 字,大约阅读时间需要 7 分钟。

看到好多网友问到这个问题。一般我们在打电话时会听到“您拨的电话正在通话中,请稍后再拨....”,或“电话无应答...”之类的提示,我们在 freeswitch 里也可以这样做。
其实很简单,默认的配置在呼叫失败时会转到 voicemail (语音信箱),我们只需要在这里修改,让他播放一个语音提示,然后再进入语音信箱(或直接挂 断也行)。
找到 <extension name="Local_Extension">部分的最后几行
<action application="bridge" data="user/${dialed_extension}@${domain_name}"/>
<action application="answer"/>
<action application="sleep" data="1000"/>
<action application="bridge" data="loopback/app=voicemail:default ${domain_name} ${dialed_extension}"/> 
其中,第一个 bridge 是说明去呼叫被叫号码,如果呼叫失败,则 dialplan 继续往下走,依次是
应答
睡一会
进入 voicemail
OK, 我们只需要把最后一个bridge那行改成
<action application="playback" data="${originate_disposition}.wav"/> 
重新打电话试一下吧,如果被叫忙,则 originate_disposition 变量就是 USER_BUSY ,用户没注册就是 USER_NOT_REGISTERED 之类的,你只需要保证相关目录下有相对应的声音文件即可(如果LOG中提示找不到声音文件的话试试自己录一个)。
当然,呼不通的原因可能有很多,你总不可能录上所有的声音文件是吧,有两种方法:
1) 使用一个 lua (或其它语言) 的脚本
<action appliction="lua" data="/tmp/xxx.lua"/> 
在 lua 脚本中可以拿到这个 originate_disposition 变量,从而可以使用 if then else 之类的逻辑播放各种声音文件。
2) 当然,如果你脚本也不想编辑的话,实现上 FreeSWITCH 的 dialplan 功能是非常强大的,你只需要将呼叫转到播放不同声音文件的 dialplan:
<action application="transfer" data="play-cause-${originate_disposition}"/> 
然后创建如下 dialplan extension:
 
<condition field="destination_number" expression="^play-cause-USER_BUSY$"> <action application="playback" "/tmp/sounds/user-busy.wav"/> </condition> 
 
 
<condition field="destination_number" expression="^play-cause-USER_NOT_REGISTERED$"> <action application="playback" "/tmp/sounds/user-not-registered.wav"/> </condition> 
 
 
<condition field="destination_number" expression="^play-cause0(.*)$"> <!-- for all other reasons, play this file --> <action application="log" data="WARNING hangup cause: $1"/> <action application="playback" "/tmp/sounds/unknown-error.wav"/> </condition> 
 
小结:
当然,能播放上面的声音文件还有一个前提,就是在第一个 bridge 前面要有以下两行:
<action application="set" data="hangup_after_bridge=true"/> <action application="set" data="continue_on_fail=true"/> 
第一行的作用是,如果第一个 bridge 成功了,被叫挂断电话后我们就没有必要再播放该声音了,因此直接挂机。当然这一行可以没有,那么你在后面的 originate_disposition 里如果发现值是 "NORMAL_CLEARING" (正常挂机)的情况再决定是否播放相关语音。
第二行的作用是,如果呼叫失败(空号,拒接等),继续往下走,否则(值为 false 的情况)到这里就挂机了。该变量的值还可以有以下几种,表示只有遇到这几种情况才播放语音,其它的就直接挂机。
<action application="set" data="continue_on_fail=NORMAL_TEMPORARY_FAILURE,USER_BUSY,NO_ANSWER,TIMEOUT,NO_ROUTE_DESTINATION"/>

转载地址:http://fzcka.baihongyu.com/

你可能感兴趣的文章
ABP实战--集成Ladp/AD认证
查看>>
存储过程
查看>>
phpcms v9栏目列表调用每一篇文章内容方法
查看>>
python 自定义信号处理器
查看>>
我只是轻奢 40万内入门豪车最高让利7万!-搜狐汽车
查看>>
曲演杂坛--隐式转换
查看>>
远程桌面连接技巧--与主机拷贝文本及拷贝文件(转)
查看>>
MVC中下拉框显示枚举项
查看>>
Linux基础精华
查看>>
SqlServer2008第一次安装后连接问题
查看>>
cocos2d-x Schedule详解
查看>>
sdut 2163:Identifiers(第二届山东省省赛原题,水题)
查看>>
C++ 容器:顺序性容器、关联式容器和容器适配器
查看>>
mysql 常用语句集
查看>>
Atitit.软件开发提升稳定性总结
查看>>
lftp查看文件时间与登录服务查看文件时间相差8小时
查看>>
[leetcode]Next Permutation @ Python
查看>>
JAVA(2)——JDBC
查看>>
php heredoc 与 nowdoc
查看>>
DBA_Oracle DBA常用表汇总(概念)
查看>>