笔者最近的项目有一个新的需求,是需要实现定时外呼,并将外呼的号码拉入会议中。
外呼流程:定时会议外呼-》网关/运营商/手机-》播放提示音-》输入按键1-》完成入会(输入错误就hangup,最多尝试三次)
这里是曾经踩过的坑:
第一点:外呼的时候要考虑是否是阻塞的,所以有两种选择conference name bgdial或者bgapi originate
第一点解疑答惑:问过了开发同事,如果想要在呼叫过程中控制通话放音并获取按键,conference bgdail其实是无法实现控制的,我自己也试了很多次,根本没有办法和lua中的`session:`这样的lua api关联起来。最后开发同事给我的建议是使用bgapi originate(弱弱的说一句,能看懂代码可太牛了,我感觉我很多时候对着FS像是在做那种黑白盒子的测试)
第二点:外呼的时候直接执行lua,我应该怎么判断通话已经ready和answer了呢?
第二点解疑答惑:假如我使用的是bgapi originate user/1001 &lua test.lua这样的方式,我可以在lua中写个while的循坏,循环的条件是session:ready()这样可以保证lua是在运行的,不用订阅事件我就可以根据我得需要让这个lua一直运行。
然后加个session:answered() == true的判断,这样可以用于终止循环而且知道用户已经应答,我可以正常的使用session:playAndGetDigits了
当然,对于并发量比较大的时候使用while其实是很消耗内存的。为了节省开支,我们可以在外呼的时候加上{ignore_early_media=true}这个参数,用来替换while,后续的lua中正常判断sessioon:answered()即可
第三点:我在一边写功能一边测试的时候竟然没有获取到DTMF的按键
第三点解疑答惑:我尝试加上start_dtmf,或者是spandsp_start_dtmf。最后都是以失败告终。所以我去改了sip profile,开启了<param name="liberal-dtmf" value="true"/>这个参数,然后重新reload了mod_sofia这个模块。(<param name="dtmf-type" value="info"/>加上这参数一起开一下试试,我当时是同时开启的这俩参数)
到目前为止需求我已经完成了一大半了,就剩根据按键去将通话转移到会议中了。NICE~
再念叨一句,我希望我能在未来两三年内看懂FS的代码(意味着我要学会C,简单的看懂逻辑,降低一下要求嘿嘿嘿~),这样我就不用像个测试一样只能试试,还要安慰自己,再试一下这个吧……加油加油
今天也是很值的一天呢