簡體   English   中英

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)

PS: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。 在回答時,我在磁盤上寫了一個文件,然后檢查該文件是否存在。 如果文件存在,則呼叫已應答。

您可以設置execute_on_answer變量來執行掛斷:

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

但是總的來說, mod_python不是執行此類任務的正確位置:腳本是作為FreeSWITCH進程內的一個線程執行的,並且在執行freeSWITCH應用程序時您沒有任何控制權(在您的情況下為橋)。 更好的選擇是使用事件套接字庫(ESL),然后可以異步控制調用流並接收與調用狀態更改相關的事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM