Всем привет!
Использую стандартный макрос 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
Просмотрен: 715 раз
Обновлен: Feb 02 '17
Переадресация (трансфер) на мобильный
Тишина при переводе на мобильный
АТС Atcom IP01 (на базе Asterisk)
маршрутизация вызова после переадресации
как узнать переадресованный номер
Корректная переадресация входящего
Переадресация на сотовый на 4 сек и обратно
Проект компании "АТС Дизайн"
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 )редактировать