Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

HangUP после redirect из AGI скрипта по AMI

1

Ещё раз привет всем. Переделываю вопрос, т.к. глубже смог копнуть и смоделировать проблемную часть в диаплане.

Упростил так сказать вопрос. Засада в выполнении redirect из AMI Когда делаю редирект, вторая нога редиректиться абсолютно нормально, а вот первая нога попадая в новый контекст пытается выполнить первую строку и чудно убивается канал asterisk'ом Вот редирект

Action: Redirect
Channel: SIP/1602-00000035
Context: nway-confirence
Priority: 1
Exten: 10
ExtraChannel: SIP/1601-00000034
ExtraExten: s
ExtraContext: add-new-member
ExtraPriority: 1

Он выполняет сначал вторую ногу, потом первую, в первой и есть отбой канала

Event: VarSet
Privilege: dialplan,all
Channel: SIP/1601-00000034
ChannelState: 6
ChannelStateDesc: Up
CallerIDNum: 1601
CallerIDName: Chinkisbaeva Lazzat
ConnectedLineNum: 1602
ConnectedLineName: Kabdiev Kanat
Language: en
AccountCode:
Context: add-new-member
Exten: s
Priority: 1
Uniqueid: 1463388058.142
Linkedid: 1463388058.142
Variable: AGISTATUS
Value: HANGUP

Event: VarSet
Privilege: dialplan,all
Channel: SIP/1601-00000034
ChannelState: 6
ChannelStateDesc: Up
CallerIDNum: 1601
CallerIDName: Chinkisbaeva Lazzat
ConnectedLineNum: 1602
ConnectedLineName: Kabdiev Kanat
Language: en
AccountCode:
Context: add-new-member
Exten: s
Priority: 1
Uniqueid: 1463388058.142
Linkedid: 1463388058.142
Variable: MACRO_DEPTH
Value: 0


Event: HangupRequest
Privilege: call,all
Channel: SIP/1601-00000034
ChannelState: 6
ChannelStateDesc: Up
CallerIDNum: 1601
CallerIDName: Chinkisbaeva Lazzat
ConnectedLineNum: 1602
ConnectedLineName: Kabdiev Kanat
Language: en
AccountCode:
Context: add-new-member
Exten: s
Priority: 1
Uniqueid: 1463388058.142
Linkedid: 1463388058.142

И вот отбой

    -- <SIP/1601-00000042>AGI Script n-way-conf.php completed, returning 4
  == Spawn extension (add-new-member, s, 1) exited non-zero on 'SIP/1601-00000042' in macro 'nway-start'
    -- Channel SIP/1601-00000042 left 'simple_bridge' basic-bridge <2c301bc8-c70f-4e79-acd5-a83a1c93808e>
    -- Executing [s@add-new-member:1] Read("SIP/1601-00000042", "NEW_CALLEE,dial,20,i") in new stack
    -- Accepting a maximum of 20 digits.
    -- User disconnected
    -- Executing [h@add-new-member:1] NoOp("SIP/1601-00000042", "Goodbye") in new stack

С чем может быть связано такое поведение Астериска?

удалить закрыть спам изменить тег редактировать

спросил 2016-05-04 06:03:55 +0400

EXA Gravatar EXA
61 6 7

обновил 2016-05-16 13:23:26 +0400

Comments

попробуйте ваш вопрос задать в виде вопроса. Слишком много текста. Или тег бизнес добавьте

meral ( 2016-05-05 15:05:19 +0400 )редактировать

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

meral ( 2016-05-16 13:51:24 +0400 )редактировать

Спасибо, походу да, придётся самому капать. Версия Asterisk 13.1-cert7. Ведь по выполнению AGI не должен канал убиваться?

EXA ( 2016-05-16 14:15:37 +0400 )редактировать

Если agi вернет не 0 - должен

meral ( 2016-05-16 16:47:37 +0400 )редактировать

Получается

<SIP/1601-00000016>AGI Script n-way-conf.php completed, returning 4

Уже не 0 и должен умереть канал? И почему 4-кой ругается, вроде ошибок нет ни каких

<SIP/1601-00000018>AGI Rx << GET VARIABLE BRIDGEPEER

<SIP/1601-00000018>AGI Tx >> 200 result=1 (SIP/1602-00000019)

<SIP/1601-00000018>AGI Rx << GET VARIABLE CONFNO

<SIP/1601-00000018>AGI Tx >> 200 result=1 (10)

<SIP/1601-00000018>AGI Rx << VERBOSE "SIP/1601-00000018" 1

n-way-conf.php: SIP/1601-00000018

<SIP/1601-00000018>AGI Tx >> 200 result=1

<SIP/1601-00000018>AGI Rx << VERBOSE "SIP/1602-00000019" 1

n-way-conf.php: SIP/1602-00000019

<SIP/1601-00000018>AGI Tx >> 200 result=1

<SIP/1601-00000018>AGI Rx << VERBOSE "10" 1

n-way-conf.php: 10

<SIP/1601-00000018>AGI Tx >> 200 result=1

EXA ( 2016-05-16 17:13:57 +0400 )редактировать

Да и скрипт вроде правильный, по крайней мере php n-way-conf.php - запуская ошибок 0

#!/usr/bin/php

<?php

require_once "phpagi.php";

settimelimit(30);

$agi = new AGI();

$CHANNEL=$agi->request['agi_channel'];

$BRIDGEPEER=$agi->get_variable('BRIDGEPEER');

$BRIDGEPEER=$BRIDGEPEER['data'];

$CONFNO=$agi->get_variable('CONFNO')['data'];

$agi->verbose($CHANNEL, 1);

$agi->verbose($BRIDGEPEER, 1);

$agi->verbose($CONFNO, 1);

$agimngr = new AGI_AsteriskManager();

$agimngr->connect('127.0.0.1','admin','6b644093e7ac093e164428eb92eb15ff');

$agimngr->send_request('Redirect',array('Channel'=>"$CHANNEL",'Context'=>"add-new-member",'Priority'=>"1",'Exten'=>"s",'ExtraChannel'=>"$BRIDGEPEER",'ExtraExten'=>"$CONFNO",'ExtraContext'=>"nway-confirence",'ExtraPriority'=>"1"));

$agimngr->disconnect();

return '0';

?>

EXA ( 2016-05-16 17:16:22 +0400 )редактировать

Там куча подводных камней.например звонок находящийся внутри dial-macro нельзя вообще редиректнуть. Рекомендую найти работающее решение.

meral ( 2016-05-16 23:42:04 +0400 )редактировать

После этой строки

$agimngr->send_request('Redirect',array('Channel'=>"$CHANNEL",'Context'=>"add-new-member",'Priority'=>"1",'Exten'=>"s",'ExtraChannel'=>"$BRIDGEPEER",'ExtraExten'=>"$CONFNO",'ExtraContext'=>"nway-confirence",'ExtraPriority'=>"1"));

Скрипт agi дальше не выполняется, хотя по факту отправляется AMI пакет. Пробовал присвоить к переменной результат, не помогло, пробовал другой реквест, другой реквест выполняется, что скрипт возвращает returning 0. Может знаете как запустить log phpagi-asmanager.php, головы не хватило пока что понять, как активировать, но там есть логи в коде.

Решение из интернета не заработало, вот и начался поиск у меня, почему оно не работает.

EXA ( 2016-05-17 08:48:37 +0400 )редактировать

А зачем тут вообще AMI ? Чем ChannelRedirect не устроил ?

virus_net ( 2016-05-17 09:51:07 +0400 )редактировать

решение с voip-info - работает

meral ( 2016-05-17 09:54:39 +0400 )редактировать

А вообще да попробую ChannelRedirect , раз AMI тут не прёт. Надо попробовать, надеюсь там не вылезит чего.

http://www.voip-info.org/wiki/view/Asterisk+n-way+call+HOWTO Пробовал, но чёт не пошло, надо ещё раз попробовать, раз не помню. Или помню, там затыка была, то что нужен внешний редирект или System или AMI, надо ещё раз попробовать, ведь время поиска накопилось, результат может быть уже другим и более приятным.

EXA ( 2016-05-17 10:28:41 +0400 )редактировать

Кажется фишка вот в чём, когда делаешь Redirect канала из AGI, и когда делается Redirect этого же канала, он теряется связь c AGI и AGI завершается плохо, не 0, и Астериск прибивает этот канал, т.к. AGI завершился 4-кой.

EXA ( 2016-05-17 14:35:30 +0400 )редактировать

вы не можете редиректнуть аги в другое место. используйте переменную, в ней выставьте что делать и делайте редирект диалпланом.зачем вы вообще ami и agi тут используете?

meral ( 2016-05-17 15:21:02 +0400 )редактировать

ChannelRedirect вы тоже должны вызывать не из AGI. вообще редиректить самого себя таксебе идея.

meral ( 2016-05-17 15:21:47 +0400 )редактировать

Сделал, такой же эффект, вторая нога (1602) перевелась, первая нога (1601) позвонила к 1603 и отбилась при ответе 1603. Я так понял это всегда так будет, если делать Dial из macro

[macro-nway-start]

exten => s,1,Set(__CONFNO=10)

exten => s,n,ChannelRedirect(${BRIDGEPEER},nway-confirence,${CONFNO},1)

exten => s,n,Read(NEW_CALLEE,dial,20,i)

exten => s,n,Dial(LOCAL/${NEW_CALLEE}@simple-call)

[simple-call]

exten => _X.,1,Dial(SIP/${EXTEN})

EXA ( 2016-05-17 15:37:06 +0400 )редактировать

Будьте первым, кто ответит на этот вопрос!

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!
[скрыть предварительный просмотр]

Закладки и информация

Добавить закладку

подписаться на rss ленту новостей

Статистика

Задан: 2016-05-04 06:03:55 +0400

Просмотрен: 1,540 раз

Обновлен: May 16 '16

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.