VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Вторжение в разговор

Проблемы Asterisk без вэб-оболочек и их решения

Модераторы: april22, Zavr2008

Ответить
Roma_N
Сообщения: 28
Зарегистрирован: 05 фев 2011, 23:54

Вторжение в разговор

Сообщение Roma_N »

Здравствуйте.

Подскажите направление, необходимо организовать вторжение в разговор. Два абонента разговаривают. Директор хочет вмешаться, но при этом должна создаться 3-х сторонняя конференция. Таким образом ChanSpy в данной ситуации не поможет.
Была идея реализовать через ChannelRedirect.
Разговаривают два номера - 21305 и 21304.
Директор набирает префикс и попадает сюда (данный диалплан тестовый, соответственно пока каналы задаю жестко):
[phones]
conf,1,Meetme(600)

6123,1,ChannelRedirect(SIP/21305-0000070b,phones,conf,1")
6123,2,MeetMe(600)

h,1,ChannelRedirect(SIP/21304-0000070a,phones,conf,1")

но номер 21304 все равно отбивается, хотя один раз получилось. Вот лог

[code] -- Executing [6123@phones:1] ChannelRedirect("SIP/21302-0000070c", "SIP/21305-0000070b,phones,conf,1") in new stack
-- Executing [h@phones:1] NoOp("SIP/21304-0000070a", "cause - 16") in new stack
-- Executing [h@phones:2] Wait("SIP/21304-0000070a", "3") in new stack
== Spawn extension (phones, h, 2) exited non-zero on 'SIP/21304-0000070a'
== Extension Changed 21302[phones] new state InUse for Notify User 21306
-- Executing [6123@phones:2] MeetMe("SIP/21302-0000070c", "600") in new stack
-- Executing [conf@phones:1] MeetMe("SIP/21305-0000070b", "600") in new stack
== Parsing '/etc/asterisk/meetme.conf': == Found
-- Created MeetMe conference 1023 for conference '600'
-- <SIP/21305-0000070b> Playing 'conf-onlyperson.slin' (language 'ru')
== Spawn extension (macro-RecDial, s, 4) exited non-zero on 'SIP/21304-0000070a' in macro 'RecDial'
== Spawn extension (phones, 21305, 11) exited non-zero on 'SIP/21304-0000070a'
== MixMonitor close filestream
== End MixMonitor Recording SIP/21304-0000070a
[/code]

Понимаю что-то что выше я сделал - ерунда
Подскажите как грамотно сделать данную функцию? В какое направление смотреть?
Аватара пользователя
Wapo
Сообщения: 795
Зарегистрирован: 02 мар 2011, 17:53

Re: Вторжение в разговор

Сообщение Wapo »

Roma_N
Сообщения: 28
Зарегистрирован: 05 фев 2011, 23:54

Re: Вторжение в разговор

Сообщение Roma_N »

Почитал, но может я не правильно понял Вашу подсказку.

Мне нужно чтобы третий ("3") абонент с телефона переключил разговор двух абонентов ("1" и "2") в конференцию и сам туда вошёл. Сам он входит ("3"), одного из абонентов переключает ("1"), но второй ("2") отбивается. Важно переключить ("1" и "2") в конференцию без перерыва.
Roma_N
Сообщения: 28
Зарегистрирован: 05 фев 2011, 23:54

Re: Вторжение в разговор

Сообщение Roma_N »

Вообщем, что-то накидал, вроде работает. Может кому-нибудь пригодится.
Если есть предложения более грамотные и красивые или просто замечания то высказывайте.

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. Он нажимает на кнопку занятого абонента, и дополнительно комбинацию цифр (так же запрограммированных на другой кнопке) и вторгается в разговор.
virus_net
Сообщения: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

Re: Вторжение в разговор

Сообщение virus_net »

Roma_N писал(а):Таким образом ChanSpy в данной ситуации не поможет.
Это почему же ?

Код: Выделить всё

[Syntax]
ChanSpy([chanprefix][,options])

[Arguments]
options
    b: Only spy on channels involved in a bridged call.

    B: Instead of whispering on a single channel barge in on both channels
    involved in the call.

Код: Выделить всё

exten => _88XXXX,1,Chanspy(SIP/${EXTEN:2},Bq)
Таким образом третий может вмешаться в разговор вн.экста XXXX и не только слышать обоих (и внутренний и его оппонента), но и говорить с обоими.
мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
Roma_N
Сообщения: 28
Зарегистрирован: 05 фев 2011, 23:54

Re: Вторжение в разговор

Сообщение Roma_N »

Это почему же ?

[Syntax]
ChanSpy([chanprefix][,options])

[Arguments]
options
b: Only spy on channels involved in a bridged call.

B: Instead of whispering on a single channel barge in on both channels
involved in the call.
Вот это называется надо читать свежие описания функций, а не пятилетней давности!

Придумал себе занятие на ночь.
virus_net, спасибо, буду внимательней.
virus_net
Сообщения: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

Re: Вторжение в разговор

Сообщение virus_net »

Многое зависит от версии твоего Asterisk.
Выполни в консоли:

Код: Выделить всё

core show application Chanspy
Да прочти какие опции у тебя есть.
мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
Roma_N
Сообщения: 28
Зарегистрирован: 05 фев 2011, 23:54

Re: Вторжение в разговор

Сообщение Roma_N »

Да именно там и буду теперь смотреть. У меня присутствует опция B, все работает.
Решил "слентяйничать" и посмотреть описание на русском в книге AsteriskTM: The Future of Telephony.
Ещё раз спасибо.
Ответить
© 2008 — 2025 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH