AF
Asterisk Forum
обсуждения телефонии, VoIP и IP-PBX
12разделов
5 423тем
34 385сообщений
← К списку тем

AGI - мертвые и живые каналы

Newbies/FAQ Forum 20 сообщений -
#1

читал про живые и мертвые каналы - в голове уже каша!

если мне требуется, чтобы agi скрипт выполнил следующие действия:
1. получил некоторую инфу из внешнего источника
2. включил MixMonitor
3. позвонил кому-то (dial)
4. записал статистику состоявшегося или не состоявшегося звонка
как его надо запускать, AGI or DeadAGI ?

Или звонить из agi скрипта вообще не правильно, а правильно возвращаться в диалплан, там звонить, потом отлавливать завершение звонка через экстеншен h, и уже другим agi скриптом записывать результат звонка?
#2

DeadAGI вроде как deprecated.
#4

Да хрен его знает. AGIспецы может подтянутся -- расскажут.
Беглый же анализ гугла показывает:

Цитата:
In asterisk 1.6 you should always use Agi cmd and never DeadAGI (is deprecated). If you want to keep up the agi script after hangup you can use $SIG{HUP} = "IGNORE" (perl).
After that if you "hang up" a call the script will go ahead and the channel in asterisk remains up (you will see that with 'core show channels'). So you can communicate with asterisk after the 'hang up' and read channel variables.


Asterisk 1.6 -- это 2008 год.
#5

AGI запускаеться из dialplanа
то есть его нельзя просто дернуть - уже должен быть звонок
AMI используй Smile
#6

sman @ Чт Июл 21, 2016 20:10 писал(а):
AGI запускаеться из dialplanа
то есть его нельзя просто дернуть - уже должен быть звонок
AMI используй Smile

я имел ввиду, что звонок с одной стороны уже есть, а надо определиться кому этот звонок предназначен и совершить вызов другой стороны.
#7

[from-trunk]
exten => s,1,AGI(contact_menegers.php,${CALLERID(num)})

ну и скриптом проверяйте кому этот клиент принадлежит

_________________
P4 3.0 + 1Gb CentOS 5.8 Aster 1.8.16
Не люблю gui-сборки: натуральный продукт вкуснее.
И еще: я ПРОФИ так как НЕ ЛЕНЮСЬ читать литературу.
#8

Wapo @ Пт Июл 22, 2016 11:28 писал(а):
ну и скриптом проверяйте кому этот клиент принадлежит

это понятно, но это только первый шаг.
самое главное, мне нужно включить запись разговора, произвести звонок и записать статистику состоявшегося или не состоявшегося разговора.
я хочу разобраться, можно ли это все делать в agi скрипте?
#9

telegk1*CLI> core show application AGI

-= Info about application 'AGI' =-

[Synopsis]
Executes an AGI compliant application.

[Description]
Executes an Asterisk Gateway Interface compliant program on a channel. AGI
allows Asterisk to launch external programs written in any language to control
a telephony channel, play audio, read DTMF digits, etc. by communicating with
the AGI protocol on *stdin* and *stdout*. As of '1.6.0', this channel will
not stop dialplan execution on hangup inside of this application. Dialplan
execution will continue normally, even upon hangup until the AGI application
signals a desire to stop (either by exiting or, in the case of a net script,
by closing the connection).
A locally executed AGI script will receive SIGHUP
on hangup from the channel except when using DeadAGI. A fast AGI server will
correspondingly receive a HANGUP inline with the command dialog. Both of theses
signals may be disabled by setting the ${AGISIGHUP} channel variable to 'no'
before executing the AGI application. Alternatively, if you would
like the AGI application to exit immediately after a channel hangup is
detected, set the ${AGIEXITONHANGUP} variable to 'yes'.
Use the CLI command 'agi show commands' to list available agi commands.
This application sets the following channel variable upon completion:
${AGISTATUS}: The status of the attempt to the run the AGI script text string,
one of:
SUCCESS
FAILURE
NOTFOUND
HANGUP

Используйте AGI. Только используйте его правильно.
#10

ну да, вроде понятно, что скрипт продолжает выполняться, после выключения канала. ну еще бы примерчик. Rolling Eyes

Added after 27 seconds:

скоро руки дойдут - поэкспериментирую.
#12

типа, навешиваем событие на завершение звонка, а потом его ловим и обрабатываем в определенном контексте?
а зачем это? ведь тоже самое можно сделать, используя экстеншен h.
#13

Там же все написано:

Цитата:
Unlike the traditional h extension, hangup handlers follow the channel. Thus hangup handlers are always run when a channel is hung up, regardless of where in the dialplan a channel is executing.
#14

аааа, просто один обработчик для всех, вместо раздельных по контекстам.
но мне, пожалуй, пока этого не надо.
#15

Нет, вы не правильно поняли.
Обработчик устанавливается для каждого канала. К контекстам вообще не имеет отношения.

Пример:

Код:
[outcallnew]
exten => s,1,Set(CHANNEL(language)=ru)
same => n,Set(TECH=${CUT(ARG3,/,1)})
same => n,Set(OUTNUM=${CUT(ARG3,/,2)})
same => n,GoSub(getprov,s,1(${OUTNUM:3},${CALLERID(num)}))
same => n,GotoIf($["${CIDO}"=""]?setcid:noset)
same => n(setcid),Set(CIDO=${CALLERID(num)})
same => n(noset),GoSub(getclid,s,1)
same => n,GotoIf($["${ARG1}"="MIX"]?mix:nomix)
same => n(mix),Noop(Setting monitor)
same => n,Set(CALLFILENAME=outgoing/${STRFTIME(,,%Y/%m/%d/%H%M%S)}-${CIDO}-${ARG2})
same => n,MixMonitor(${CALLFILENAME}.gsm,b)
same => n,Set(CDR(userfield)=${CALLFILENAME})
same => n(nomix),NoOp(Call without monitoring)
same => n,GoSub(checkoutercall,s,1(${CALLERID(num)},${OUTNUM}))
same => n,Set(CHANNEL(hangup_handler_push)=savecost,s,1(${CALLFILENAME},${COST},${NEWDIR},${DEF}));
same => n,Gosub(${NEWDIR},s,1(${TECH},${OUTNUM}))
same => n,Hangup


В этом примере перед тем как совершить вызов(то есть, до ближайшего Dail) устанавливается обработчик hang up с именем savecost. И обработчик с этим именем будет вызван только для того канала, в котором он установлен.
Причем: все ассоциированные с каналом переменные доступны в обработчике.
#16

а вот мне еще хотелось бы поймать событие, в тот момент, когда берут трубку. а то получается я могу собирать статистику, или до набора номера (но в этот момент я еще не знаю ответят на вызов или нет), или после состоявшегося разговора.
а начало разговора можно отловить?
#17

Странное желание, ответят на вызов или нет, совершенно без разницы. Вызов состоялся. И у него может быть два состояния, либо на него ответили, либо нет.
И советую все таки обратиться к документации.
Там пишут очень интересно и увлекательно.
Например, обратите внимание на аргумент M или U команды Dial.
#18

спасибо, про опции Dial, при установлении соединения - понятно.
из всего вышесказанного я сделал вот что:
Код:
[macro-CallAnswer]
exten = s,1,NoOp(вызов отвечен ${CHANNEL})
same = AGI(agi.py,CallAnswer)

[in_call]
exten = s,1,NoOp(вызов поступил ${CALLERID(num)} ${CHANNEL})
same = AGI(agi.py,CallWent)
same = MixMonitor(${RecName})
same = n,Dial(SIP/101&SIP/102&SIP/103,20,M(CallAnswer))

exten = h,1,NoOp(вызов завершен ${DIALSTATUS} ${ANSWEREDTIME} ${CHANNEL} )
same = n,AGI(agi.py,CallComplite)


все три события: по поступлению звонка, по поднятию трубки и по завершению вызова - отрабатывают.
осталась одна деталь: (в доках этого не нашел) как в макросе CallAnswer получить клиента, поднявшего трубку ?
#19

core show application DumpChan вам в помощь.

Слушайте, ну не смешно уже. Давайте вы все таки сядете и прочтете доки, вики, и прочие материалы которых в сети полно.