Asterisk中利用ConfBridge实现三方通话

三方通话用到ConfBridge模块,将三方引入到会议室。在呼入和呼出的流程表现如下。
呼入:
1 客户C呼入,分机E1接听;
2 E1 按键 *2 咨询分机E2,此时C听到等待音;
3 E1和E2建立通话后,E1按键 ## 将E2引入到会议室,E2进入会议室后听到等待音;
4 此时,E1恢复和C的通话;
5 E1按键 ** 后,上方都进入会议室;

使用的会议室号码是取的UNIQUEID时间戳的数字部分,例如主UNIQUEID为 hostname-1395368833.33,最终三方使用的会议室号码是139536883333,这样能够保证会议室号码的唯一性。因此在呼入或外呼时要设置变量Set(__main_unique_id=${UNIQUEID}),让main_unique_id一直传递下去。

三方通话用到features功能,features.conf中需要有如下配置:
; 呼入
nway-start => ##,caller,Macro,nway-start
nway-invite => **,callee,Macro,nway-invite

需要的context:
context consult 
context macro-nway-start
context macro-nway-invite
context  dynamic-nway-join
以下是用AEL编写的dialplan,书写形式上类似C语言,便于阅读和扩展。

context macro-nway-invite {
    s => {
        while($["${SET(var=${SHIFT(main_unique_id,\-)})}" != ""]){
            Set(last_number=${var});
        }
        Set(CONFNO=${CUT(last_number,\.,1)}${CUT(last_number,\.,2)});
        ChannelRedirect(${BRIDGEPEER},dynamic-nway-join,${CONFNO},1);
        Set(DYNAMIC_FEATURES=);
        Answer();
        ConfBridge(${CONFNO},as);
    };

    h => {
    };
}
context macro-nway-start {
    s => {
        NoOp(~~~~~~main_unique_id:${main_unique_id}~~~~~~~~);
        while($["${SET(var=${SHIFT(main_unique_id,\-)})}" != ""]){
            Set(last_number=${var});
        }
        Set(CONFNO=${CUT(last_number,\.,1)}${CUT(last_number,\.,2)});
        NoOp(main_channel:${main_channel});
        Set(chname=${CHANNEL(name)});
        ChannelRedirect(${BRIDGEPEER},dynamic-nway-join,${CONFNO},1);
        Set(DYNAMIC_FEATURES=nway-invite);
        return;
    };
    h => {
    };
}

context dynamic-nway-join {
    _X. => {
        CONFNO=${EXTEN};
        Answer();
        ConfBridge(${CONFNO},M1);
    };

    h => {
    };
}
另外:在呼叫每通呼叫的入口都要设置DYNAMIC_FEATURES变量;
Set(DYNAMIC_FEATURES=nway-start#nway-invite);

你可能感兴趣的:(Asterisk)