First time here? Check out the FAQ!

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

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

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. посдкажте как из макроса поменять значение переменной которую я оперделил.

спросил Aug 6 '12

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

обновил Aug 6 '12

3 Ответа

0

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

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

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

либо GLOBAL(VARNAME)

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

ответил Aug 6 '12

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

Comments

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

romariosar (Aug 6 '12)edit

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

komrad123 (Aug 6 '12)edit

нет конечно

meral (Aug 6 '12)edit
0

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

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

ответил Aug 6 '12

komrad123 Gravatar komrad123
3810 5 3 44

Comments

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

romariosar (Aug 6 '12)edit

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

komrad123 (Aug 6 '12)edit

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

romariosar (Aug 6 '12)edit

как то так:

[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 (Aug 6 '12)edit

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

romariosar (Aug 6 '12)edit

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

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

komrad123 (Aug 6 '12)edit

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

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

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

varnar (Aug 7 '12)edit

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

romariosar (Aug 7 '12)edit
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;
     
};
};
ссылка удалить спам редактировать

ответил Aug 8 '12

varnar Gravatar varnar
11 3

обновил Aug 8 '12

Ваш ответ

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 ленту новостей

Статистика

Задан: Aug 6 '12

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

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

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