2015-11-27 35 views
0

在此实现中,我试图通过session.bridge()命令在入站呼叫和出站呼叫之间调用修补程序。Freeswitch:如何确定是否在桥接入站和出站呼叫时应答呼叫?

我已经收到呼入呼叫,并且正在播放我的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) 

编辑:

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

回答

1

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

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

但总的来说,mod_python不是这样的任务对地方了:脚本为FreeSWITCH的过程中的一个线程,你执行,不要在freeSWITCH应用程序执行时进行任何控制(在你的情况下是桥接)。更好的选择是使用事件套接字库(ESL),然后您可以异步控制呼叫流并接收与呼叫状态更改相关的事件。

+0

我正在使用ESL。我有三个python文件。 ESL.py,其中我将_ESL导入为导入_ESL。 ivrlib.py其中我从ESL.py导入*导入ESL.py,然后导入ivr.py作为导入ivrlib导入ivrlib.py。我在上面的问题中添加了确切的代码。请看一看。 – MYGz

+0

我正在尝试的另一件事是将n个参数传递给桥接命令中的freeswitch以进行顺序拨号,这对我来说只是解决方案,因为我不会在脚本中获得所有已解答呼叫的详细信息,但它仍然可以解决当列表尚未结束时,还存在一个突破问题。根据文档,代码应该可以工作,但不起作用。我在上面的问题中添加了该代码。 – MYGz

+0

这只是解决方案的一半 – MYGz