Вообщем, что-то накидал, вроде работает. Может кому-нибудь пригодится.
Если есть предложения более грамотные и красивые или просто замечания то высказывайте.
extension.conf
Код: Выделить всё
[office]; вмешательство в разговор с созданием 3-х сторонней конференции
;----------------------------------------------------------------------------------
exten => _213XX,1,SET(dial_line=${SIPPEER(${EXTEN},curcalls)})
exten => _213XX,n,GotoIF($[ ${dial_line} = 0 ]?dial:waiting)
exten => _213XX,n(dial),Dial(SIP/${EXTEN},90,g)
exten => _213XX,n,SET(Capture=${DB(Capture/${CALLERID(num)})})
exten => _213XX,n,GotoIF($[ ${Capture} = yes ]?conf:end)
exten => _213XX,n(conf),SET(DB(Capture/${CALLERID(num)})=no)
exten => _213XX,n,Answer()
exten => _213XX,n,ConfBridge(${CALLERID(num)},1s)
exten => _213XX,n(end),Hangup()
exten => _213XX/21306,n(waiting),Goto(director)
exten => _213XX,n(waiting),Busy()
exten => _213XX,n(director),Set(PEER_NAME=${EXTEN})
exten => _213XX,n,NoOp(PEER_NAME =-=${PEER_NAME})
exten => _213XX,n,Agi(/var/lib/asterisk/agi-bin/1/Call_Intrusion.php,${PEER_NAME})
exten => _213XX,n,NoOp(Channel_R = ${Channel_R})
exten => _213XX,n,NoOp(Channel-A = ${Channela})
exten => _213XX,n,NoOp(Channel-B = ${Channelb})
exten => _213XX,n,NoOp(CONF = ${CONF})
exten => _213XX,n,NoOp(CONF_NUM = ${CONF_NUM})
exten => _213XX,n,GotoIF($[ ${CONF} = yes ]?cbridg)
exten => _213XX,n,SET(DB(Capture/${CALLER_D})=yes)
exten => _213XX,n,ChannelRedirect(${Channel_R},office,777${CALLER_D},1)
exten => _213XX,n,Answer()
exten => _213XX,n,ConfBridge(${CALLER_D},1s)
exten => _213XX,n,Hangup()
exten => _213XX,n(cbridg),Answer()
exten => _213XX,n,ConfBridge(${CONF_NUM},1s)
;----------------------------------------------------------------------------------
exten => _777X.,1,Answer()
exten => _777X.,n,ConfBridge(${EXTEN:3},1s)
сам скрипт
Код: Выделить всё
#!/usr/bin/php -q
<?php
require("phpagi.php");
$agi = new AGI;
$PEER_NAME = $argv[1];
$agi -> verbose($PEER_NAME); //получаем номер, в чей разговор хотим вмешаться
$a = `asterisk -rx "core show channels" | grep SIP/$PEER_NAME- | awk '{print $1}'`; //получаем Channel данного номера
$agi -> verbose("Channel PEER_NAME ===== $a");
$a = str_replace("\n", '', $a); // удаляем ненужные символы
$DirectBridgePEER = `asterisk -rx "core show channel $a" | grep 'Direct Bridge' | awk '{print $3}'`; // Получаем канал, с которым соединен наш номер
$b=$DirectBridgePEER;
$b = str_replace("\n", '', $b); // удаляем ненужные символы
$AppPEERa = `asterisk -rx "core show channel $a" | grep 'Application' | awk '{print $2}'`; // получаем приложение, выполненное данными номерами
$AppPEERb = `asterisk -rx "core show channel $b" | grep 'Application' | awk '{print $2}'`;
$CIDNUMa = `asterisk -rx "core show channel $a" | grep 'Caller ID:' | awk '{print $3}'`; // получаем CallerID(num)
$CIDNUMb = `asterisk -rx "core show channel $b" | grep 'Caller ID:' | awk '{print $3}'`;
$agi -> verbose("Direct Bridge -${PEER_NAME} === $DirectBridgePEER");
$agi -> verbose("Application Channel $a ==== $AppPEERa");
$agi -> verbose("Application Channel $a ==== $AppPEERb");
$agi -> verbose("Caller ID Channel $a ==== $CIDNUMa");
$agi -> verbose("Caller ID Channel $b ==== $CIDNUMb");
$CIDNUMa = str_replace("\n", '', $CIDNUMa);
$CIDNUMb = str_replace("\n", '', $CIDNUMb);
$AppPEERa = str_replace("\n", '', $AppPEERa);
$AppPEERb = str_replace("\n", '', $AppPEERb);
$Channela = $a;
$Channelb = $b;
// определяем, какой из каналов был инициатором звонка.
if ($AppPEERa == 'Dial') {
$agi -> set_variable('CALLER_D',$CIDNUMa);
$agi -> set_variable('Channel_R',$Channelb);
$agi -> verbose("AppPEERa");
}
if ($AppPEERb == 'Dial') {
$agi -> set_variable('CALLER_D',$CIDNUMb);
$agi -> set_variable('Channel_R',$Channela);
$agi -> verbose("AppPEERb");
}
// либо они уже в конференции
if ($AppPEERa == 'ConfBridge') {
$data = `asterisk -rx "core show channel $a" | grep 'Data:' | awk '{print $2}'`;
$data = str_replace("\n", '', $data);
$conf_num = explode(",", $data);
$agi -> verbose("ConfBridge DATA ==== $data");
$agi -> verbose("ConfBridge CONF_NUM ==== $conf_num[0]");
$agi -> set_variable('CONF','yes');
$agi -> set_variable('CONF_NUM',$conf_num[0]);
}
$agi -> verbose("Channel A ==== $Channela");
$agi -> verbose("Channel B ==== $Channelb");
$agi -> set_variable('Channela',$Channela);
$agi -> set_variable('Channelb',$Channelb);
Либо переделать под добавочные.
У кого какое мнение, как должна работать данная функция:
1. Как приведено выше, у Директора стоит SIP телефон с консолями и BLF кнопочками. Он если хочет вмешаться в разговор, нажимает на кнопку абонента и автоматически создается конференция, как написано выше.
2. Он нажимает на кнопку занятого абонента, и дополнительно комбинацию цифр (так же запрограммированных на другой кнопке) и вторгается в разговор.