Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

переменная в макросе

0

все привет, уже пол дня мучаюсь не никак не могу допереть. входящий звонок приходит в контекст [app-blacklist-check], там задается переменная:

exten => s,n,Set(__HU=0)

Затем выполняется макрос, в кором проверяется совпадение номера звонящего с БД. Если номер совпал, то происходят прямой набор на внутреннего абонента, есил внутренний абонент не зарегестрирован, или занят, звонок идет дальше по диалплану и попадает в очередь, соответсвено другой контекст. переменная HU там нормально выводится, и она равно 0. после вывода переменной. я запускаю макрос, в котором переменная HU увеличивется на 1.

[macro-zvon-db-blkvm]
exten => s,1,MYSQL(Connect connid 127.0.0.1 user test test)
exten => s,n,MYSQL(Query resultid ${connid} Update test set zvon = 1 WHERE client=${QAZ})
exten => s,n,MYSQL(Fetch fetchid ${resultid} manager)
exten => s,n,MYSQL(Clear ${resultid})

exten => s,n,Set(__HU=$[${HU} + 1])
exten => s,n,noop(${HU})
exten => s,n,MYSQL(Disconnect ${connid})


; end of [macro-zvon-db-blkvm]

соответственно вывод последнего макроса:

-- Executing [s@macro-zvon-db-blkvm:6] Set("SIP/101-00000022", "__HU=1") in new stack -- Executing [s@macro-zvon-db-blkvm:7] NoOp("SIP/101-00000022", "1") in new stack

получается что переменная увеличилась. но когда макрос заканчивается и звонок идет дальше по длиалплану, то переменная, не меняет своего значения, т.е. она всеравно остается равна 0. посдкажте как из макроса поменять значение переменной которую я оперделил.

удалить закрыть спам изменить тег редактировать

спросил 2012-08-06 14:23:48 +0400

romariosar Gravatar romariosar flag of Russian Federation
588 93 10 44
http://www.webunix.ru/

обновил 2012-08-06 15:14:13 +0400

3 Ответа

0

никак. у вас переменная пееропределился для всех более глуюоких.

используйте для таких случаев функцию ${DB(/path/something)},а в переменной передавайте ключик.

только чистить дб потом не забываем.

либо GLOBAL(VARNAME)

ссылка удалить спам редактировать

ответил 2012-08-06 15:18:17 +0400

meral Gravatar meral flag of Ukraine
23347 24 20 177
http://pro-sip.net/

Comments

печально, придется заморачиваться сильнее.

romariosar ( 2012-08-06 15:41:14 +0400 )редактировать

meral, ты случайно не перепутал "более глуююкие" макросы с "более глуюкими" каналами ?

komrad123 ( 2012-08-06 16:13:57 +0400 )редактировать

нет конечно

meral ( 2012-08-06 21:01:35 +0400 )редактировать
0

версия астериска какая и как макрос вызывается ?

ссылка удалить спам редактировать

ответил 2012-08-06 16:07:45 +0400

komrad123 Gravatar komrad123
3810 5 3 44

Comments

в общем я в макросе [macro-zvon-db-blkvm], выполняю определенное действие когда трубка поднимается. Потом когда звонок заканчивается и оператор кладет трубку, вызывается из конткста from-internal, другой макрос в которо должны производлится проверка данной переменной, если она равна 0 значит выполняется специальное действие, если 1 то звонок хангапится. Вот такая логика, мне эту переменную надо обязательно из диалплана брать, в БД вообще не вариат засовывать, также использовать глобальные переменные нельзя. Asterisk 1.8.12.0

romariosar ( 2012-08-06 16:39:55 +0400 )редактировать

аа, тоесть таки макрос в Диале/Очереди. тогда так не прокатит ибо они на разных каналах выполняются. К тому что посоветовал meral еще SHARED можно добавить.

komrad123 ( 2012-08-06 16:54:43 +0400 )редактировать

с помощью Shared как передать переменную, можно пример, а то я чет нагeглил но никак не допру.

romariosar ( 2012-08-06 16:56:22 +0400 )редактировать

как то так:

[macro-blegvars]

exten => s,1,Set(SHARED(bsipcallid,${LEGA})=${SIPCALLID})

exten => s,n,Set(SHARED(bcodec,${LEGA})=${CHANNEL(audionativeformat)})

exten => s,n,Set(SHARED(bnoncodec,${LEGA})=${PEER_NONCODECCAPABILITY})

komrad123 ( 2012-08-06 17:05:20 +0400 )редактировать

а там както надо канал же указывать куда я хоче передать это переменную. В товем случае я из другого макроса могу запросить переменную LEGA?

romariosar ( 2012-08-06 17:16:27 +0400 )редактировать

у меня в начале звонка

Set(_LEGA=${CHANNEL}) ( с двумя _ )

komrad123 ( 2012-08-06 17:33:00 +0400 )редактировать

Meral дал самый верный вариант: ${DB(/path/something)}

"мне эту переменную надо обязательно из диалплана брать, в БД вообще не вариат засовывать"

А ты и бери эту переменную из ДиалПлана - просто в одном месте диалплана засовываеш, а в другом высовываеш :)

varnar ( 2012-08-07 06:42:51 +0400 )редактировать

мне это переменную именно к моему звонку нужно привязывать, если с БД работать то нужно еще идентификатор звонка отлавливать.

romariosar ( 2012-08-07 11:50:56 +0400 )редактировать
0

У меня на одном из серверов сделано следующим образом (я использую AEL)

macro CheckCallerID(CallerID) {
            // We are check in A2B v14 DB for caller id
            // If we found, returning this CID, if no returning empty string
            Noop( == Incoming CallerID is: ${CallerID} == );
            if ("${CallerID}" = "" ) {
               Noop( == No any CallerID );
            }else{
               MYSQL(Connect connid ${realdb_host} ${realdb_user} ${realdb_pass} ${realdb_db});
               MYSQL(Query resultid ${connid} SELECT cid,id_cc_card from cc_callerid where cid=${CallerID} and activated = 't');
               MYSQL(Fetch fetchid ${resultid} cid id_cc_card);
               MYSQL(Clear ${resultid});
               Noop( == CallerID found in DB ${cid} for cardid ${id_cc_card} == );
               MYSQL(Query resultid ${connid} SELECT username from cc_card where id=${id_cc_card});
               MYSQL(Fetch fetchid ${resultid} cc_card);
               MYSQL(Clear ${resultid});
               MYSQL(Disconnect ${connid});
               Noop( == Card found in DB ${cc_card} for callerid ${cid} == );
            };
            return; 
};

context InFromFXO {

    // FXO Dlink hotline to 598367 number
    598367 => {

            Noop( == Incomming call from FXO Dlink_Elit == );
            Noop( == Caller ID is: ${CALLERID(all)} == );

            Noop( == Now checking if this caller id for VLogic == );
            // If called number is in range of VLogic
            if ((${CALLERID(number):0:7}=0105017) || (${CALLERID(number):0:7}=0105018)) {
                    Noop( == if yes, jump to ViLogic extra context == );
                    jump s@VLogic; // then jump to VLogic context
            };

            Noop( == if no, continue to check, if it CC or to operator == );
            cidnumber="";
            cc_card="";
            cidnumber=${CALLERID(number)};
            CHANNEL(language)=en;

            Noop( == Checking in DB for existing callerid == );

            &CheckCallerID(${cidnumber});
            //From macros we save founded CallerID from DB in "cid" variable
            if ("${cid}" = "") {
                 Noop ( == If not found, jump to extra operator context == );
                 goto callcenter,s,1;
            } else {
                 Noop ( == If found, continue to work == );
                 Answer;
                 Wait(0.5);
                 CDR(accountcode)=${cc_card}; // Setting account code in new Billing
                 goto s|begin; // We have find callerid, so go to "begin" label in "s" includes.
            };
            Hangup;
     };
};
ссылка удалить спам редактировать

ответил 2012-08-08 05:49:55 +0400

varnar Gravatar varnar
11 3

обновил 2012-08-08 05:53:00 +0400

Ваш ответ

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!
[скрыть предварительный просмотр]

Закладки и информация

Добавить закладку

подписаться на rss ленту новостей

Статистика

Задан: 2012-08-06 14:23:48 +0400

Просмотрен: 2,449 раз

Обновлен: Aug 08 '12

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.