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

applicationmap, macro, goto

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

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

Ответить
byy
Сообщения: 44
Зарегистрирован: 12 янв 2016, 14:49

applicationmap, macro, goto

Сообщение byy »

добрый день

хочу повесить на последовательности клавиш прием-передачу факсов.
goto напрямую из applicationmap не работает. искал в интернетах, пришел к выводу что это общая проблема. решил сделать через макрос

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

tmp => *0,callee,Macro(test)
в extensions.conf

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

[macro-test]
exten => s,1,NoOp(111)
exten => s,n,Goto(testcont,s,1)
[testcont]
exten => s,1,NoOp(222)
результат:

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

    -- Executing [8123456789@test_out2:1] NoOp("SIP/299-00000029", "") in new stack
    -- Executing [8123456789@test_out2:2] Set("SIP/299-00000029", "DYNAMIC_FEATURES=tmp") in new stack
    -- Executing [8123456789@test_out2:3] Dial("SIP/299-00000029", "SIP/outgoing_peer/8123456789,,tT") in new stack
  == Using SIP RTP CoS mark 5
    -- Called SIP/outgoing_peer/8123456789
    -- SIP/outgoing_peer-0000002a is making progress passing it to SIP/299-00000029
    -- SIP/outgoing_peer-0000002a is ringing
    -- SIP/outgoing_peer-0000002a is making progress passing it to SIP/299-00000029
    -- SIP/outgoing_peer-0000002a answered SIP/299-00000029
    -- Channel SIP/outgoing_peer-0000002a joined 'simple_bridge' basic-bridge <7c46c8ca-dfdb-4f0b-a6bd-2d9bcb7dbb17>
    -- Channel SIP/299-00000029 joined 'simple_bridge' basic-bridge <7c46c8ca-dfdb-4f0b-a6bd-2d9bcb7dbb17>
    -- Executing [s@macro-test:1] NoOp("SIP/outgoing_peer-0000002a", "111") in new stack
    -- Executing [s@macro-test:2] Goto("SIP/outgoing_peer-0000002a", "testcont,s,1") in new stack
    -- Goto (testcont,s,1)
  == Channel 'SIP/outgoing_peer-0000002a' jumping out of macro 'test'
пишет что выполняет Goto и все, само содержимое контекста testcont не выполняется.
если просто из контекста вызывать данный макрос - все полностью отрабатывается.

почему не опишу все внутри макроса - receivefax после получения факса сразу кладет трубку, и возвращает в исходный контекст, соответственно обработку изображения негде произвести (хотя и можно описать в общем контексте с условиями).
ded
Сообщения: 15625
Зарегистрирован: 26 авг 2010, 19:00

Re: applicationmap, macro, goto

Сообщение ded »

Goto из макроса - непредсказуемое поведение, что и наблюдаем.
Можно вызывать как AGI скрипт, тогда в нём и вся обработка изображения поместится.
byy
Сообщения: 44
Зарегистрирован: 12 янв 2016, 14:49

Re: applicationmap, macro, goto

Сообщение byy »

благодарю!
вполне себе решение.
а не подскажете, можно ли как-то сделать либо callback, либо запуск выполнения следующей команды после завершения предыдущей. получается, что вызов конвертера происходит до завершения выполнения receivefax. можно по слипу чекать появление файла, но как-то не эстетично выглядит :)
(речь про agi)
ded
Сообщения: 15625
Зарегистрирован: 26 авг 2010, 19:00

Re: applicationmap, macro, goto

Сообщение ded »

запуск выполнения какой следующей команды после завершения предыдущей? Системной? Или следующий шаг диалплана?
Если первое - то соорудите пакетный bash скрипт из нескольких команд (аналог bat файла в винде) и вызывайте его из диалплана.
Если второе - узнайте про опции g & M в команде диалплана Dial.
byy
Сообщения: 44
Зарегистрирован: 12 янв 2016, 14:49

Re: applicationmap, macro, goto

Сообщение byy »

я сейчас говорю про agi скрипт.
вызываю в диалплане agi скрипт

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

[macro-faxr]
exten => s,1,Answer()
exten => s,n,AGI(test.php)
скрипт (phpagi) запускает receivefax

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

$a=new AGI();
$a->exec(ReceiveFax,"/var/spool/asterisk/fax/sss.tiff");
в итоге получаем факс.
если добавить после этого в скрипт

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

exec("/usr/bin/convert -resample 204x196 -page A4 /var/spool/asterisk/fax/sss.tiff /var/spool/asterisk/fax/sss.pdf");
то команда запустится до того, как будет принят факс.
если добавить в диалплан вызов

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

exten => s,n,System(/usr/bin/convert....)
оно не будет выполняться в принципе, т.к. после receivefax завершается выполнение скрипта, вешается трубка (receivefax вешает после получения факса) и дальше контекст не выполняется. Добавление g в dial никак на это не влияет.
byy
Сообщения: 44
Зарегистрирован: 12 янв 2016, 14:49

Re: applicationmap, macro, goto

Сообщение byy »

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

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

[macro-faxr]
exten => s,1,Answer()
exten => s,n,ChannelRedirect(${CHANNEL},faxq,s,1)

[faxq]
exten => s,1,ReceiveFax(/var/spool/asterisk/fax/sss.tiff)
exten => s,n,Hangup()
exten => h,1,System(/usr/bin/convert -resample 204x196 -page A4 /var/spool/asterisk/fax/sss.tiff /var/spool/asterisk/fax/sss.pdf)
и все чудесно работает.
ded
Сообщения: 15625
Зарегистрирован: 26 авг 2010, 19:00

Re: applicationmap, macro, goto

Сообщение ded »

OMG!
Ставите freepbx изкоропки, набираете диавольское число 666, и всё чудесно работает. Если есть интерес - вкуриваете в её логику работы макросов, в том числе и факс.
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH