Freeswitch:如何在桥接入站和出站呼叫时确定呼叫是否已被应答?

时间:2015-11-27 17:30:14

标签: python freeswitch

在此实现中,我尝试通过session.bridge()命令在入站呼叫和出站呼叫之间进行呼叫修补。

我已收到入站电话,我的Python脚本正在播放。在这个脚本中,我试图用number_list(list of numbers)中的数字逐个修补正在运行的呼叫,直到列表用尽或者直到呼叫被修补并回答。

我的代码:

for cp_num in connObj.cp_list:
    ivr_log.debug("Attempting to dial Call Patch Number:%s"%(cp_num['cp_no']))
    connObj.patch_uuid = uuid.uuid1()
    cmd_str = """{ignore_early_media=true,execute_on_answer=record_session %s/%s_%s.wav,origination_uuid=%s,originate_timeout=45,script_name=gaadi_test}freetdm/wp4/a/%s"""%(connObj.recording_path,connObj.uuid,connObj.caller_id,connObj.patch_uuid,cp_num['cp_no'])
    connObj.bridge(cmd_str) #BRIDGE
    connObj.hangup_cause = connObj.getVar("last_bridge_hangup_cause")
    if connObj.hangup_cause in ['NORMAL_CLEARING', '']:
        connObj.cp_status = "SUCCESS"
        return True
connObj.cp_status = "FAILED"
connObj.playback(connObj.path_sound + 'all_reps_busy.wav')
return False

用于顺序拨号的bridge命令的多个数字。 从freeswitch文档: 多个端点顺序 - 故障转移数量没有限制

bridge <target_endpoint>[|<target_endpoint>]

我的实施

cmd1 = """{ignore_early_media=true,originate_timeout=45}[origination_uuid=%s,script_name=gaadi_test]freetdm/wp4/a/%s"""%(connObj.patch_uuid1,connObj.cp_list[0]['cp_no'])
cmd2 = """[origination_uuid=%s,script_name=gaadi_test]freetdm/wp4/a/%s"""%(connObj.patch_uuid2,connObj.cp_list[1]['cp_no'])
cmd = "%s[|%s]"%(cmd3,cmd4)
ivr_log.debug("CMD=%s"%(cmd))
connObj.call_patch_start_time = int(time.time())
connObj.patch_start_datetime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
connObj.bridge(cmd)

P.S。:ConnObj.bridge(cmd)仅适用于一个目标点。

顺序拨号解决方案: 只是cmd1和cmd2稍有变化。我还没有确认这两个电话的起始uuid是否会有所不同。

cmd1 = """{ignore_early_media=true,originate_timeout=45,script_name=gaadi_test}[origination_uuid=%s]freetdm/wp4/a/%s"""%(connObj.patch_uuid1,connObj.cp_list[0]['cp_no'])
cmd2 = """[origination_uuid=%s]freetdm/wp4/a/%s"""%(connObj.patch_uuid2,connObj.cp_list[1]['cp_no'])
cmd="%s|%s" #removed the brackets and its working now.
connObj.bridge(cmd)

编辑:

最后,我用斯坦尼斯拉夫的方法解决了这个问题。我用过api_on_answer。回答我在磁盘上写了一个文件,然后检查文件是否存在。如果该文件存在,则应答呼叫。

1 个答案:

答案 0 :(得分:1)

您可以设置execute_on_answer变量来执行挂断:

https://wiki.freeswitch.org/wiki/Variable_execute_on_answer

但总的来说,mod_python不适合执行此类任务:脚本在FreeSWITCH进程中作为线程执行,并且在执行freeSWITCH应用程序时没有任何控制权(桥接你的情况)。更好的选择是使用事件套接字库(ESL),然后您可以异步控制调用流并接收与调用状态更改相关的事件。