【问题标题】:Freeswitch: How to determine if call was answered when bridging an inbound and outbound call?Freeswitch:桥接呼入呼出时如何判断是否接听电话?
【发布时间】:2015-11-27 17:30:13
【问题描述】:

在这个实现中,我试图通过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。在回答时,我在磁盘上写了一个文件,然后检查该文件是否存在。如果文件存在,则呼叫被应答。

【问题讨论】:

    标签: python freeswitch


    【解决方案1】:

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

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

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

    【讨论】:

    • 我正在使用 ESL。我有三个 python 文件。我将 _ESL 作为导入 _ESL 导入的 ESL.py。 ivrlib.py,其中我从 ESL.py import * 导入 ESL.py,然后我在 ivr.py 中导入 ivrlib.py 作为导入 ivrlib。我在上面的问题中添加了确切的代码。请看一看。
    • 我尝试的另一件事是将 n 参数传递给桥接命令中的 freeswitch 以进行顺序拨号,这只是我的解决方案,因为我不会获得已接听电话的所有详细信息在我的脚本中,但它仍然解决了一个在列表尚未结束时中断的问题。根据文档,代码应该可以工作,但不能正常工作。我在上面的问题中添加了该代码。
    • 这只是解决方案的一半
    • 好的。顺序拨号现在工作了,所以问题解决了一半。但是我怎么知道哪个号码接听了电话?我正在发布问题中顺序拨号的解决方案。
    • 顺序桥接将解决我面临的一个问题。即当您拨打某些号码时,当用户拒接电话时,产生的挂断原因为-ERR NORMAL_CLEARING。这将终止我的循环,因为在挂断原因中我只会得到 NORMAL_CLEARING,这表示呼叫已被应答,但事实是它未被应答但被拒绝。
    猜你喜欢
    • 2015-01-19
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多