Всем привет!
Использую стандартный макрос stdexten, но есть проблема при трансферах вызова:
1) Приходит звонок из PSTN и попадает на абонента А через макрос
2) Абонент А делает трансфер на абонента В (вызов также уходит через макрос)
3) Абонент В не поднимает трубку
4) Через 20 секунд вызов попадает в войсмейл абонента А, хотя по логике должен попасть в ящик В
Как я понимаю, тут происходит вложение макросов и когда абонент А выпадает из разговора, то что-то происходит с макросом абонента В.
Видимо, Goto(s-${DIALSTATUS},1) перебрасывает во внешний макрос....
Кто-то может уже решал подобную задачу?
[macro-stdexten]
exten => s,1,Dial(${ARG2},20)
exten => s,2,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Voicemail(u${ARG1})
Дополнение:
1) Модифицировал Макрос:
exten => s,1,NoOp(~~~~~MACRO~~~~~~~)
same => n,NoOp(MACROCONTEXT=${MACROCONTEXT})
same => n,NoOp( ARG1=${ARG1})
same => n,NoOp( ARG2=${ARG2})
same => n,Dial(${ARG2},20,r)
same => n,NoOp(~~~~~AFTER DIAL~~~~~~~)
same => n,NoOp( ARG1=${ARG1})
same => n,NoOp( ARG2=${ARG2})
same => n,Goto(call-${DIALSTATUS})
same => n(call-NOANSWER),NoOp(~~~~~NOANSWER~~~~~~~)
same => n,NoOp(MACROCONTEXT=${MACROCONTEXT})
same => n,NoOp( ARG1=${ARG1})
same => n,NoOp( ARG2=${ARG2})
same => n,Voicemail(${ARG1},u)
same => n,HangUp()
Фрагмент дайлплана:
exten => 9991,1,Answer()
same = n,Macro(stdexten,9991@NWFH,SIP/9991)
Также и для 9992
2) PSTN: 2385, A: 9991, B: 9992
Что интересно, после того как В не поднял трубку ( Dial(${ARG2},20,r) ), то вызов вернулся в родительский макрос ( и переменные стали ARG1=9991@NWFH и ARG2=SIP/9991 )
-- Nobody picked up in 20000 ms
-- Executing [s@macro-stdexten:6] NoOp("SIP/SIPGWTEST-00000000", "~~~~~AFTER DIAL~~~~~~~") in new stack
-- Executing [s@macro-stdexten:7] NoOp("SIP/SIPGWTEST-00000000", " ARG1=9991@NWFH") in new stack
-- Executing [s@macro-stdexten:8] NoOp("SIP/SIPGWTEST-00000000", " ARG2=SIP/9991") in new stack
Весь лог:
-- Executing [2385@incoming:1] Answer("SIP/SIPGWTEST-00000000", "") in new stack
-- Executing [2385@incoming:2] Goto("SIP/SIPGWTEST-00000000", "NWFH-int,9991,1") in new stack
-- Goto (NWFH-int,9991,1)
-- Executing [9991@NWFH-int:1] Answer("SIP/SIPGWTEST-00000000", "") in new stack
-- Executing [9991@NWFH-int:2] Macro("SIP/SIPGWTEST-00000000", "stdexten,9991@NWFH,SIP/9991") in new stack
-- Executing [s@macro-stdexten:1] NoOp("SIP/SIPGWTEST-00000000", "~~~~~MACRO~~~~~~~") in new stack
-- Executing [s@macro-stdexten:2] NoOp("SIP/SIPGWTEST-00000000", "MACROCONTEXT=NWFH-int") in new stack
-- Executing [s@macro-stdexten:3] NoOp("SIP/SIPGWTEST-00000000", " ARG1=9991@NWFH") in new stack
-- Executing [s@macro-stdexten:4] NoOp("SIP/SIPGWTEST-00000000", " ARG2=SIP/9991") in new stack
-- Executing [s@macro-stdexten:5] Dial("SIP/SIPGWTEST-00000000", "SIP/9991,20,r") in new stack
== Using SIP RTP CoS mark 5
-- Called SIP/9991
-- SIP/9991-00000001 is ringing
-- SIP/9991-00000001 answered SIP/SIPGWTEST-00000000
-- Started music on hold, class 'default', on channel 'SIP/SIPGWTEST-00000000'
-- Executing [9992@NWFH-int:1] Answer("SIP/9991-00000002", "") in new stack
-- Executing [9992@NWFH-int:2] Macro("SIP/9991-00000002", "stdexten,9992@NWFH,SIP/9992") in new stack
-- Executing [s@macro-stdexten:1] NoOp("SIP/9991-00000002", "~~~~~MACRO~~~~~~~") in new stack
-- Executing [s@macro-stdexten:2] NoOp("SIP/9991-00000002", "MACROCONTEXT=NWFH-int") in new stack
-- Executing [s@macro-stdexten:3] NoOp("SIP/9991-00000002", " ARG1=9992@NWFH") in new stack
-- Executing [s@macro-stdexten:4] NoOp("SIP/9991-00000002", " ARG2=SIP/9992") in new stack
-- Executing [s@macro-stdexten:5] Dial("SIP/9991-00000002", "SIP/9992,20,r") in new stack
-- Called SIP/9992
-- SIP/9992-00000003 is ringing
Locally RTP bridged 'SIP/SIPGWTEST-00000000' and 'SIP/9991-00000001' in stack
-- Stopped music on hold on SIP/SIPGWTEST-00000000
== Spawn extension (macro-stdexten, s, 5) exited non-zero on 'SIP/9991-00000002' in macro 'stdexten'
== Spawn extension (NWFH-int, 9991, 2) exited non-zero on 'SIP/9991-00000002'
-- Nobody picked up in 20000 ms
-- Executing [s@macro-stdexten:6] NoOp("SIP/SIPGWTEST-00000000", "~~~~~AFTER DIAL~~~~~~~") in new stack
-- Executing [s@macro-stdexten:7] NoOp("SIP/SIPGWTEST-00000000", " ARG1=9991@NWFH") in new stack
-- Executing [s@macro-stdexten:8] NoOp("SIP/SIPGWTEST-00000000", " ARG2=SIP/9991") in new stack
-- Executing [s@macro-stdexten:9] Goto("SIP/SIPGWTEST-00000000", "call-NOANSWER") in new stack
-- Goto (macro-stdexten,s,10)
-- Executing [s@macro-stdexten:10] NoOp("SIP/SIPGWTEST-00000000", "~~~~~NOANSWER~~~~~~~") in new stack
-- Executing [s@macro-stdexten:11] NoOp("SIP/SIPGWTEST-00000000", "MACRO_CONTEXT=NWFH-int") in new stack
-- Executing [s@macro-stdexten:12] NoOp("SIP/SIPGWTEST-00000000", " ARG1=9991@NWFH") in new stack
-- Executing [s@macro-stdexten:13] NoOp("SIP/SIPGWTEST-00000000", " ARG2=SIP/9991") in new stack
-- Executing [s@macro-stdexten:14] VoiceMail("SIP/SIPGWTEST-00000000", "9991@NWFH,u") in new stack
смотрим. http://asterisk-support.ru/question/38386/kak-poniat-chto-proiskhodit-na-asteriske/
скорее всего у вас таки войсмейл от А.
Задан: 2017-02-01 14:31:58 +0400
Просмотрен: 648 раз
Обновлен: Feb 02 '17
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.
конструкция
zzuz ( 2017-02-01 15:54:02 +0400 )редактироватьexten => s-NOANSWER
в макросе недопустимая . В макросе используйте экстеншен s . И вообще , поменьше макросов , не злоупотребляйте .пример взял вот здесь: http://www.voip-info.org/wiki/view/Asterisk+cmd+Macro
den-p ( 2017-02-01 19:08:08 +0400 )редактироватьНу разбирайтесь . Вам домашнее задание.
zzuz ( 2017-02-01 19:29:49 +0400 )редактироватьем. вообщето допустима. я часто использую.
meral ( 2017-02-01 20:06:57 +0400 )редактироватьДа я к тому , чтобы человек начинал с более понятных вещей .
zzuz ( 2017-02-02 00:51:01 +0400 )редактироватьmacro будут деприкейтнуты. так что лучше начинать привыкать к gosub
У вас Dial идет на ARG2, а Voicemail на ARG1. И Чему вы удивляетесь ?
Срочно читать книжку.
virus_net ( 2017-02-02 10:23:09 +0400 )редактироватьОни устаревают уже с 1.6 , но ничего , все еще работают. ARG1=1234,ARG2=SIP/1234 . Это по примеру с ссылке.
zzuz ( 2017-02-02 10:47:10 +0400 )редактироватьони не будет depricated пока жива куча кода под названием freepbx. Потому как никому не надо сделать ее нерабочей.
meral ( 2017-02-02 12:02:36 +0400 )редактировать" У вас Dial идет на ARG2, а Voicemail на ARG1. " -все верно, но при переадресации опять макрос вызывается и ARG1/2 уже указывают на 9992, но неуспешный Dial разрушает вложенность. Дополнил основной текст логами.
den-p ( 2017-02-02 14:53:12 +0400 )редактироватьУ вас нет проблемы. Два исходящих вызова , каждый на своем макросе.
zzuz ( 2017-02-02 15:18:04 +0400 )редактироватьПро перевод можете не рассказывать . Он выполнен телефоном , а не сервером , так что это просто два исходящих вызова.
zzuz ( 2017-02-02 15:19:03 +0400 )редактироватьСогласен, есть 2 звонка: PSTN - A и A - B. Сторона B поднимает трубку и А делает REFER, и A выпадает с разговора.
Если В берет трубку, то все ок:разговор PSTN - B .
Если В не берет труку, то вызов сваливается в войсмейл А
В дайлплан добавил Answer, но не помогло:
exten => 9992,1,Answer()
same = n,Macro(stdexten,9992@NWFH,SIP/9992)
den-p ( 2017-02-02 15:35:03 +0400 )редактироватьПеревод делайте средствами сервера и определите TRANSFER_CONTEXT .
zzuz ( 2017-02-02 16:23:44 +0400 )редактироватьДа, средствами Астериска работает как надо.
Спасибо!
den-p ( 2017-02-02 18:50:43 +0400 )редактировать