zoukankan      html  css  js  c++  java
  • FreeSWITCH 实现 双线路呼叫(主备线路)

    一、 今有业务需求如下

    主线路未通,则使用备用线路
    1. 直接拨打
    2. 转接
    3. 三方通话
    
    未通情况(主线路呼叫失败): 
    网络或线路异常->呼叫超时 
    线路或运营商异常->被叫非正常挂断 
    
    如果接收到线路上的回铃和接通,则正常接入到主线; 
    除此之外所有的异常未接通全部转到备用线路上

    考虑如何做的时候,先问问万能的 www

    于是得到了几个通道变量:

    continue_on_fail       bleg拨号失败后是否继续执行,不继续就直接挂断aleg
    hangup_after_bridge    bleg挂断后是否挂断aleg
    ransfer_after_bridge bleg挂断后,aleg transfer目的的
    park_after_bridge bleg挂断后,aleg是否park,esl开发接口非常有用
    exec_after_bridge_app bleg挂断后后,aleg执行一个APP
    api_after_bridge bleg挂断后后,aleg执行一个API

    此时是不是有些灵感了咧:)

    二、 知识准备

    1. continue_on_fail

    控制无法接通被叫方(忙/离线)时发生的情况。如果true拨号计划继续被处理。如果false拨号计划将停止处理。可以包含将继续失败的返回消息。

    <action application="set" data="continue_on_fail=true"/>
    <action application="set" data="continue_on_fail=NORMAL_TEMPORARY_FAILURE,USER_BUSY,NO_ANSWER,NO_ROUTE_DESTINATION"/>
    <action application="bridge" data="{transfer_after_bridge=你的流程}sofai/external/$1@gateway" />

    或者使用Q.850原因代码:

    <action application="set" data="continue_on_fail=3,17,18,27"/>

    2. hangup_after_bridge

     控制处于桥接状态且被叫方(B)挂断时主叫方(A)发生的情况。如果true拨号计划将停止处理,并且A分支将在B分支终止时终止。如果false(默认)B腿终止后,拨号计划将继续处理。

    park_after_bridgetransfer_after_bridge之后进行检查

    <action application="set" data="hangup_after_bridge=true"/>

    3. transfer_after_bridge

     此变量可以控制呼叫挂断时发生的情况。 可以将其与mod_fifo结合使用以控制“代理”,有可能将其发送回代理队列。 在park_after_bridge之后和hangup_after_bridge之前检查。

    在桥接完成并将leg转移到指定的拨号计划后,将清除变量。

    <action application="set" data="transfer_after_bridge=1000"/>
    <action application="set" data="transfer_after_bridge=1000:XML:default"/>

    4. park_after_bridge

     如果设置为true,它将在桥接返回后驻留呼叫。 在transfer_after_bridge和hangup_after_bridge之前进行检查。

    <action application="set" data="park_after_bridge=true"/>
    <action application="bridge" data="sofia/gateway/myprovider/5551231234"/>

    5. exec_after_bridge_app

     桥接终止后,执行应用程序命令。 与exec_after_bridge_arg一起使用。 相反,要在建立桥接时执行,请使用execute_on_answer。

    <action application="set" data="exec_after_bridge_app=transfer"/>
    <action application="set" data="exec_after_bridge_arg=2102"/>

    6. api_after_bridge

     桥接后执行API命令

    <action application="set" data="api_after_bridge=luarun post-chime.lua"/>

    7. bridge

    bridge的参数可以写多个 target, 用逗号(,)或者竖线(|)分割开, 从第二个 target 开始不可以使用花括号({})来设置参数,要用中括号([])

    bgapi originate user/8001 &bridge({continue_on_false=true,origination_caller_id_number=31580608}user/8003,[RECORD_STEREO=false,origination_caller_id_number=6898061]user/8002)
    
    bgapi originate user/8001 &bridge([continue_on_false=true,origination_caller_id_number=31580608]user/8003|[RECORD_STEREO=false,origination_caller_id_number=6898061]user/8002)

     逗号分割的同时拨打;  竖线分割的逐个拨打,拨打成功后面的就不拨打了!

    之前测试老是不成功,问大老说是要自己手动实现~~

    不甘心,xml都能配置,esl怎么就不行啊!?

    然后一边找官方文档,一边测试测试再测试,,花了不少时间,一点点测试出来的~!!!

    三、 实践出真知(干货)

    1. xml 配置

    <condition field="${sip_from_user}" expression="8001|8002|8003|8004|8005|8006|8007|8008|8009|8010">
        <action application="set" data="continue_on_fail=true"/>
        <action application="set" data="effective_caller_id_number=90643"/>
        <action application="set" data="effective_caller_id_name=90643"/>
        <action application="bridge" data="sofia/external/sip:${destination_number}@1.2.6.4"/>
        <action application="set" data="effective_caller_id_number=90618"/>
        <action application="set" data="effective_caller_id_name=90618"/>
        <action application="bridge" data="sofia/external/sip:${destination_number}@8.2.6.5"/>
    </condition>

    或者这样配置

    <condition field="${sip_from_user}" expression="8001|8002|8003|8004|8005|8006|8007|8008|8009|8010">
        <action application="bridge" data="[RECORD_STEREO=false,origination_caller_id_number=80608,sipname=waihu,cti_dial=1]sofia/external/sip:${destination_number}@8.2.6.5|[RECORD_STEREO=false,origination_caller_id_number=80618,sipname=gw2,cti_dial=1]sofia/external/sip:${destination_number}@1.5.2.6:6060"/>
    </condition>

    2. esl 命令

    bgapi originate user/8001 &bridge([RECORD_STEREO=false,origination_caller_id_number=80608,sipname=waihu,cti_dial=1]sofia/external/sip:xxxxxx@8.2.6.5|[RECORD_STEREO=false,origination_caller_id_number=80618,sipname=gw2,cti_dial=1]sofia/external/sip:xxxxxx@1.5.2.6:6060)

    其他的 uuid_transfe , 等一样

    三方通话 一样使用

    ---the End---

  • 相关阅读:
    fopen
    alsa 编程
    Alsa中PCM参数设置⭐⭐
    malloc、calloc、realloc和alloca各种的区别
    微信支付:微信支付遇到的坑:jssdk,phpdemo,微信支付提示{"errMsg":"chooseWXPay:fail"}
    java: 观察者模式:Observable被观察者,Observer观察者
    java: Comparable比较器,定义二叉操作类
    java: Comparable比较器,数组对象比较器
    微信支付:价格问题:如果支付金额是单位是分,不能带小数点
    centos:rpm安装,软件安装
  • 原文地址:https://www.cnblogs.com/lzpong/p/12982869.html
Copyright © 2011-2022 走看看