注:这里的文章都是本人的日常总结,请尊重下个人的劳动成果,转载的童鞋请注明出处,谢谢。 如您转载的文章发生格式错乱等问题而影响阅读,可与本人联系,无偿提供本文的markdown源代码。 联系邮箱:jizhask@gmail.com.

需求描述

在实际的应用中,经常有这样的需求,比如一个号码拨打外线,需要送dtmf出去(如拨打10086,根据提示按1按2等),在这种情况下,如果处理呢?

需求分析

其实该问题可以分解为下面两个子问题:
1、如何根据一方号码,获取与之通话的另一方号码? 比如66903 拨打 66904,那如何根据66903来获取到66904呢?
解决方法:
通过执行FreeSWITC的API命令,可以获取另一条信道的信息,如下:

 show channels like 66903@ as xml

在该命令的返回值中抽取sent_callee_num,即为另一方的号码。
下面是具体的实现方法:

--根据一方号码获取另一条腿的UUID
function getOtherLegUUID(api,num)
local uuid;
local res=api:executeString("show channels like "..num.."@ as xml") ----判断获取的channel信息是否为空
--fslog("debug","show channels res",res);
--如果channel信息不为空
if res and string.len(res) > then
local _,_, sendCalleeNum = string.find(res,"<sent_callee_num>(.-)<%/sent_callee_num>"); if sendCalleeNum then
uuid = getUUIDByNum(api,sendCalleeNum);
end
end return uuid;
end

2、如何向另一方号码发送dtmf?
解决方法:
该问题比较容易处理,只需要调用uuid_send_dtmf方法即可。前提条件是获取到那个信道的UUID。

具体代码

下面是完整的脚本代码,仅供参考:

--/****************************************************/
--脚本名称:send_dtmf_toleg.lua
--脚本参数:
-- argv[1] 当前通话的号码
-- argv[2] 待发送的dtmf信息
--脚本功能:
-- 根据当前通话的号码,查出另一条腿的uuid,然后向该uuid发送dtmf
--作者: 默言 2013-11-24
--/****************************************************/ --输出freeeswitch日志
function fslog(loglevel,logtitle, logbody)
loglevel = loglevel or "debug";
logtitle = logtitle or "";
logbody = logbody or "";
freeswitch.consoleLog(loglevel, "\n" .. argv[] .. " : " .. logtitle .. "{" .. logbody .. "}\n");
end --获取号码对应的uuid
--参数:num, 待查询号码
--返回:号码对应的通道的uuid
function getUUIDByNum(api, num)
local uuid; local res=api:executeString("show channels like "..num.."@ as xml")
if res then
--使用正则表达式从字符串中截取uuid
--'-'代表最短匹配
_,_,uuid = string.find(res,"<uuid>(.-)<%/uuid>")
end fslog("debug","getUUID:" .. num, uuid);
return uuid;
end --根据一方号码获取另一条腿的UUID
function getOtherLegUUID(api,num)
local uuid;
local res=api:executeString("show channels like "..num.."@ as xml") ----判断获取的channel信息是否为空
--fslog("debug","show channels res",res);
--如果channel信息不为空
if res and string.len(res) > then
local _,_, sendCalleeNum = string.find(res,"<sent_callee_num>(.-)<%/sent_callee_num>"); if sendCalleeNum then
uuid = getUUIDByNum(api,sendCalleeNum);
end
end return uuid;
end do
local legNum=argv[];
--待发送的dtmf信息
local dtmfs = argv[]; fslog("debug","start to send dtmf, legnum",legNum);
fslog("debug","need send dtmfs", dtmfs); if legNum and tonumber(legNum) then
api=freeswitch.API();
uuid=getOtherLegUUID(api, legNum);
if uuid then
local cmd = "uuid_send_dtmf " .. uuid .. " " .. dtmfs;
fslog("debug","send_dtmf cmd", cmd);
api:executeString(cmd);
else
fslog("warning","cannot get another leg uuid","");
end
else
fslog("warning","invalid parameters","");
end
end
 

FreeSWITCH技巧:如何向通话的另一方号码发送dtmf?的更多相关文章

  1. FreeSWITCH技巧:notify与message-waiting

    FreeSWITCH技巧:notify与message-waiting @(Freeswitch经验点滴) 现象描述 在客户端登陆抓包时,发现了FreeSWITCH发来的包: NOTIFY sip:9 ...

  2. Android-读取操作系统通话记录并/拨打电话/发送短信/复制号码到拨号盘

    apps目录的contacts应用(有读取通话记录功能),是访问provider目录的provider.contacts应用(有暴露通话记录),所以要阅读Android操作系统源码-->pack ...

  3. 转 asterisk拨号规则

    asterisk拨号规则 一.前言     本文档以asterisk-1.4.32为基础写作而成,可能和其他版本有些区别. 二.Asterisk dialplan 基本结构 Asterisk dial ...

  4. 公网用户接入NAT后面的freeswitch配置

    大致网络示意和终端号码: 客户端侧: 终端号码(1019)终端IP(192.168.1.15)+ 网关(192.168.1.1) + 路由器公网IP(动态地址) 服务器侧: 防火墙(181.92.2. ...

  5. Freeswitch中文用户手册(第四章 SIP)----2

    通过 B2BUA 呼叫 在真实世界中,bob 和 alice 肯定要经常改变位置,那么它们的 SIP 地址也会相应改变,并且,如果他们之中有一个或两个处于 NAT 的网络中时,直接通信就更困难了.所以 ...

  6. 玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息

    项目的Github地址:https://github.com/ggrcwxh/LastTime 采用基于git的多人协作开发模式 软件采用mvc设计模式,前端这么艺术的事我不太懂,交给斌豪同学去头疼了 ...

  7. Freeswitch使用originate转dialplan

    概述 Freeswitch是一款非常好用的开源VOIP软交换平台. 最近在对fs做一些功能测试,测试的过程中产生的一个需求,如何从fs发起呼叫并把后续的呼叫流程转到某一个dialplan上,这样在测试 ...

  8. freeswitch拨打分机号

    概述 电话语音服务中,有一种稍微复杂的场景,就是总机分机的落地场景,客户拨打总机号码之后,需要再拨打分机号转接到指定的话机. 分机号的拨打一般在总机接通之后,会有语音提示,总机收号之后转接分机. 分机 ...

  9. 前端学HTTP之安全HTTP

    前面的话 HTTP的主要不足包括通信使用明文(不加密),内容可能会被窃听:不验证通信方的身份,有可能遭遇伪装:无法证明报文的完整性,有可能被篡改 基本认证和摘要认证能够使得用户识别后较安全的访问服务器 ...

随机推荐

  1. 【OpenJudge9275】【Usaco2009 Feb】【递推】Bullcow

    Bullcow 总时间限制: 12000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB [描述] 一年一度的展会要来临了,农民约翰想要把N(1 <= N <= 10 ...

  2. 你一定喜欢看的 Webpack 2.× 入门实战(转载)

    最近在学习 Webpack,网上大多数入门教程都是基于 Webpack 1.x 版本的,我学习 Webpack 的时候是看了 zhangwang 的 <<入门 Webpack,看这篇就够了 ...

  3. hdu 5236 Article 概率dp

    Article Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5236 ...

  4. appium+python自动化48-长按(long_press)

    前言 长按操作是经常会遇到的场景,通过driver可以直接调出long_press_keycode方法,但是这个方法是长按手机上某个按钮,比如长按电源键,长按home键. 长按某个元素或者长按屏幕上某 ...

  5. Android 卡顿优化 2 渲染优化

    1.概述 2015年初google发布了Android性能优化典范,发了16个小视频供大家欣赏,当时我也将其下载,通过微信公众号给大家推送了百度云的下载地址(地址在文末,ps:欢迎大家订阅公众号),那 ...

  6. oe7升级到oe8中import的使用

     oe 7.0到oe 8.0 切换的时候发现我们系统的很多的module 无法load , import的时候出错, 后来发现oe 8.0自己的addons 也都做了修改在import自己的addon ...

  7. Make Menuconfig详解 (配置内核选择)

    Make Menuconfig简介 make menuconfig 图形化的内核配置make mrproper -----删除不必要的文件和目录. #make config(基于文本的最为传统的配置界 ...

  8. Strategy Pattern(策略模式)

    Head First定义: 策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式的设计原则主要有三个: 找出应用中可能需要变化的部分,把它们独 ...

  9. MapReduce报错:Error: java.io.IOException: Initialization of all the collectors failed. Error in last collector was :interface javax.xml.soap.Text

    这个问题折腾了我一天了,最主要的是真的不懂在哪里看log,所以虽然折腾地很没有道理但还是一直在折腾. 这个问题很好解决,在main函数处错误import了 javax.xml.soap.Text,应该 ...

  10. PAAS云服务平台

    云计算是一种可以方便.按需从网络訪问的.可配置的.共享的资源池(如网络.server.存储.应用程序和服务)模型,且仅仅需最少的管理(服务提供方交互)就可以高速供应和公布该模型. 云计算平台的核心部分 ...