Freeswitch:桥接呼入和呼出时如何确定呼叫是否被接听?
Freeswitch: How to determine if call was answered when bridging an inbound and outbound call?
在此实现中,我尝试通过 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
多个号码到网桥指令顺序拨号。
来自 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)
编辑:
最后我用Stanislav的方法解决了这个问题。我用了api_on_answer。在回答时,我在磁盘上写了一个文件,然后检查该文件是否存在。如果文件存在,则呼叫已接听。
您可以设置 execute_on_answer
变量来执行挂断:
https://wiki.freeswitch.org/wiki/Variable_execute_on_answer
但总的来说,mod_python
不是执行此类任务的正确位置:脚本在 FreeSWITCH 进程中作为线程执行,并且在执行 freeSWITCH 应用程序时您没有任何控制权(桥梁在你的情况下)。一个更好的选择是使用事件套接字库 (ESL),然后您可以异步控制调用流程并接收与调用状态更改相关的事件。
在此实现中,我尝试通过 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
多个号码到网桥指令顺序拨号。 来自 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)
编辑:
最后我用Stanislav的方法解决了这个问题。我用了api_on_answer。在回答时,我在磁盘上写了一个文件,然后检查该文件是否存在。如果文件存在,则呼叫已接听。
您可以设置 execute_on_answer
变量来执行挂断:
https://wiki.freeswitch.org/wiki/Variable_execute_on_answer
但总的来说,mod_python
不是执行此类任务的正确位置:脚本在 FreeSWITCH 进程中作为线程执行,并且在执行 freeSWITCH 应用程序时您没有任何控制权(桥梁在你的情况下)。一个更好的选择是使用事件套接字库 (ESL),然后您可以异步控制调用流程并接收与调用状态更改相关的事件。