KolyaniuS
@KolyaniuS
безнадежный оптимист

Каким образом нужно вызывать макрос из приложения Dial в extensions.ael?

Всем привет!
Подскажите по синтаксису: каким образом нужно вызывать макрос из приложения Dial в extensions.ael
Логика следующая: приходит входящий в контекст from-trunk -> попадает в очередь -> очередь создает локальный канал на оператора очереди -> происходит вызов оператора -> если вызов был принят, то выполнить макрос StoreCLID.
Собственно, примерно так это выглядит в диалплане:
context from-trunk {        
_X. => { 
        if (${DB_EXISTS(blacklist/${CALLERID(num)})}) { 
                Hangup(); 
        } else { 
        Gosub(record-office,${EXTEN},1); 
        Set(__InternalCLID=${SIPCALLID}); 
        Set(CALLERID(name)=VS ${EXTEN:4}); 
        Progress(); 
        Queue(330,,,,300); 
..... 
}; 

context from-queue { 
        hint(Custom:${EXTEN}) _X. => { 
                Set(GROUP()=${EXTEN}); 
                Set(CALL-LIMIT=2); 
                if (${GROUP_COUNT(${GROUP})} > ${CALL-LIMIT}) { 
                Hangup; 
                } else { 
                switch(${DEVICE_STATE(SIP/${EXTEN})}) { 
                        case NOT_INUSE: 
                                switch(${DEVICE_STATE(Custom:${EXTEN})}) { 
                                        case NOT_INUSE: 
                                                Dial(SIP/${EXTEN},,tM(StoreCLID^${EXTEN})); 
                                        case UNKNOWN: 
                                                Dial(SIP/${EXTEN},,tM(StoreCLID^${EXTEN})); 
                                        default: 
                                                break; 
                                }; 
                        default: 
                                break; 
                }; 
                }; 
        }; 
}; 
macro StoreCLID( ext ) { 
        NoOp( == ${ext} == ); 
        Set(__DIALEDPEERNUMBER=${ext}); 
        NoOp(Answered is = ${DIALEDPEERNUMBER}); 
        Set(DB(CLID/${DIALEDPEERNUMBER})=${InternalCLID}); 
        return; 
};

Соответственно, не сработала ни одна из следующим конструкций:
Dial(SIP/${EXTEN},,tM(StoreCLID^${EXTEN})); 
Dial(SIP/${EXTEN},,tM(&StoreCLID^${EXTEN})); 
Dial(SIP/${EXTEN},,tM(&StoreCLID(${EXTEN}))); 
Dial(SIP/${EXTEN},,tM(StoreCLID(${EXTEN})));

Вся логика отрабатывается, но макрос не вызывается!
Не могу понять причину...
ael set debug macros ничего в консоль не выводит.
Помогите разобраться.
Версия Asterisk 11.7.0
  • Вопрос задан
  • 5116 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
# aelparse -d -w
[from-queue]
...
exten => sw_3_UNKNOWN,10,Dial(SIP/${~~EXTEN~~},,tM(StoreCLID^${~~EXTEN~~}))
...
[StoreCLID]
exten => ~~s~~,1,Set(LOCAL(ext)=${ARG1})

То есть macro в AEL преобразуется просто в контекст. Попробуйте так:
macro macro-StoreCLID( ext ) { 
...
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@artzcom
В ael максросы не макросы. Вызов "макроса"
&macros();
что равнозначно в conf Gosub
Значит и в Dial вызываем тот же Gosub
U(x[^arg[^...]]):
        x - Name of the subroutine to execute via Gosub
        arg - Arguments for the Gosub routine
    Execute via Gosub the routine <x> for the *called* channel before
    connecting to the calling channel. Arguments can be specified to the Gosub
    using '^' as a delimiter. The Gosub routine can set the variable ${GO
    SUB_RESULT} to specify the following actions after the Gosub returns.
        ${GOSUB_RESULT}:
            ABORT: Hangup both legs of the call.
            CONGESTION: Behave as if line congestion was
            encountered.
            BUSY: Behave as if a busy signal was encountered.
            CONTINUE: Hangup the called party and allow the
            calling party to continue dialplan execution at the next priority.
            GOTO:[[<context>^]<exten>^]<priority>: Transfer the
            call to the specified destination.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы