если мне требуется, чтобы agi скрипт выполнил следующие действия:
1. получил некоторую инфу из внешнего источника
2. включил MixMonitor
3. позвонил кому-то (dial)
4. записал статистику состоявшегося или не состоявшегося звонка
как его надо запускать, AGI or DeadAGI ?
Или звонить из agi скрипта вообще не правильно, а правильно возвращаться в диалплан, там звонить, потом отлавливать завершение звонка через экстеншен h, и уже другим agi скриптом записывать результат звонка?
здесь
http://asterisk-support.ru/forum/topics/3009/
http://www.venturevoip.com/detail.php?news_id=1793
говорится про DeadAGI, но это было написано 9 лет назад, там про версию еще 1.4 идет речь.
а сейчас как?
Беглый же анализ гугла показывает:
| Цитата: |
| 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 год.
то есть его нельзя просто дернуть - уже должен быть звонок
AMI используй
| sman @ Чт Июл 21, 2016 20:10 писал(а): |
| AGI запускаеться из dialplanа то есть его нельзя просто дернуть - уже должен быть звонок AMI используй |
я имел ввиду, что звонок с одной стороны уже есть, а надо определиться кому этот звонок предназначен и совершить вызов другой стороны.
exten => s,1,AGI(contact_menegers.php,${CALLERID(num)})
ну и скриптом проверяйте кому этот клиент принадлежит
_________________
P4 3.0 + 1Gb CentOS 5.8 Aster 1.8.16
Не люблю gui-сборки: натуральный продукт вкуснее.
И еще: я ПРОФИ так как НЕ ЛЕНЮСЬ читать литературу.
| Wapo @ Пт Июл 22, 2016 11:28 писал(а): |
| ну и скриптом проверяйте кому этот клиент принадлежит |
это понятно, но это только первый шаг.
самое главное, мне нужно включить запись разговора, произвести звонок и записать статистику состоявшегося или не состоявшегося разговора.
я хочу разобраться, можно ли это все делать в 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. Только используйте его правильно.
Added after 27 seconds:
скоро руки дойдут - поэкспериментирую.
https://wiki.asterisk.org/wiki/display/AST/Hangup+Handlers
а зачем это? ведь тоже самое можно сделать, используя экстеншен h.
| Цитата: |
| 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. |
но мне, пожалуй, пока этого не надо.
Обработчик устанавливается для каждого канала. К контекстам вообще не имеет отношения.
Пример:
| Код: |
| [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. И обработчик с этим именем будет вызван только для того канала, в котором он установлен.
Причем: все ассоциированные с каналом переменные доступны в обработчике.
а начало разговора можно отловить?
И советую все таки обратиться к документации.
Там пишут очень интересно и увлекательно.
Например, обратите внимание на аргумент M или U команды 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 получить клиента, поднявшего трубку ?
Слушайте, ну не смешно уже. Давайте вы все таки сядете и прочтете доки, вики, и прочие материалы которых в сети полно.
http://www.voip-info.org/wiki/view/Asterisk+variables
http://www.voip-info.org/wiki/view/Aster ... iable+List
_________________
mega-net.ru - IT аутсорсинг