meral, ты случайно не перепутал "более глуююкие" макросы с "более глуюкими" каналами ?
komrad123 ( 2012-08-06 16:13:57 +0400 )редактироватьвсе привет, уже пол дня мучаюсь не никак не могу допереть. входящий звонок приходит в контекст [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. посдкажте как из макроса поменять значение переменной которую я оперделил.
никак. у вас переменная пееропределился для всех более глуюоких.
используйте для таких случаев функцию ${DB(/path/something)},а в переменной передавайте ключик.
только чистить дб потом не забываем.
либо GLOBAL(VARNAME)
meral, ты случайно не перепутал "более глуююкие" макросы с "более глуюкими" каналами ?
komrad123 ( 2012-08-06 16:13:57 +0400 )редактироватьверсия астериска какая и как макрос вызывается ?
в общем я в макросе [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 )редактироватьУ меня на одном из серверов сделано следующим образом (я использую 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-06 14:23:48 +0400
Просмотрен: 2,458 раз
Обновлен: Aug 08 '12
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.