Использование переменного числа аргументов для Macro
На данном примере реализован алгоритм передачи произвольного заранее неизвестного числа аргументов в macro. Ниже представлен контекст, используемый для группового звонка (blast group) бизнес-приложения Auto Attendant.
exten => s,1,Set(i=1) exten => s,n,Set(DIAL_STRING="") exten => s,n,MySQL(Connect connid ${DBHOST} ${DBUSER} ${DBPASS} ${DB}) exten => s,n,While($["${ARG${i}}" != "" ]) exten => s,n,MySQL(Query resultid ${connid} SELECT f_asterisk_get_regserver_by_peername('${ARG${i}}')) exten => s,n,MySQL(Fetch fetchid ${resultid} server) exten => s,n,MYSQL(Clear ${resultid}) exten => s,n,GotoIf($["${server}" = "NULL"]?next) exten => s,n,Set(server=${IF($[ "${SYSTEMNAME}" = "${server}"]? "": @${server})}) exten => s,n,ChanIsAvail(SIP/${ARG${i}}${server}) exten => s,n,GotoIf($["${AVAILORIGCHAN}" = ""]?next) exten => s,n,Set(DIAL_STRING=${DIAL_STRING}SIP/${ARG${i}}${server}&) exten => s,n(next),Set(i=$[${i} + 1]) exten => s,n,EndWhile() exten => s,n,MYSQL(Disconnect ${connid}) exten => s,n,Set(DIAL_STRING=${DIAL_STRING:0:-1}) exten => s,n,GotoIf($["${DIAL_STRING}" = ""]?cause-codes|911|no-answer) exten => s,n,Dial(${DIAL_STRING}|${ARG$[${i} + 1]}|tTm(${ARG$[${i} + 2]}))
[ChanIsAvail] (SIP/${ARG${i}}${server}) - что chanisavail полезет на другой сервер? Что-то не пойму как тут работает.
Вроде в доках ничего нет:
*CLI> show application ChanIsAvail -= Info about application 'ChanIsAvail' =- [Synopsis] Check channel availability [Description] ChanIsAvail(Technology/resource[&Technology2/resource2...][|options]): This application will check to see if any of the specified channels are available. The following variables will be set by this application: ${AVAILCHAN} - the name of the available channel, if one exists ${AVAILORIGCHAN} - the canonical channel name that was used to create the channel ${AVAILSTATUS} - the status code for the available channel Options: s - Consider the channel unavailable if the channel is in use at all j - Support jumping to priority n+101 if no channel is available *CLI>
Comment by kron on Wed Jul 25 16:27:26 2007
это я его сделал специально для Auto Attendant, бласт групы
иначе приходилось вызывать Local/лляляля и это всё дружно начинало глючить когда в бласт группе > 1 номеров
а макрос получает на входе peer_name-ы (об этом заботится php, что бы в базу попали имено пиры) и анализирует кто где сидит, и доступен ли они он
вконце получается строка для Dial-а только из доступных peer-ов, которые и звонят одновременно через &
причём я когда дебажил его заметил если подсовывать Dial(peer@свой_собственный_ИП_сервера) то звонок автоматом заруливает в Local канал в default контекст, что недопустимо (там есть проверочка маленькая, не у меня ли сидит этот пир)
А вызывается он совсмм просто
Macro(aa-blast|peer1|peer2|...|peerN||100|moh_class)
и пиров пихать в него можно допосинения, главное что бы был | т.е. пустой параметр пред-пред последним =)
как бы если в rmanager вводить понятие AA, то он очень пригодится
Comment by litnimax on Wed Jul 25 16:30:24 2007
Все равно непонятно как [ChanIsAvail] на другой сервер лезет.
Comment by kron on Wed Jul 25 16:37:51 2007
на http://www.voip-info.org/wiki/index.php?page=Asterisk+cmd+ChanIsAvail написано что
Details Currently, ChanIsAvail only works with ZAP, IAX2, mISDN and SIP channels. MGCP channels are not supported.
Comment by litnimax on Thu Jul 26 11:47:06 2007
А при чем тут это!?
Comment by kron on Fri Jul 27 07:46:30 2007
как причём? написано что по SIP работает, но подозреваю что что бы оно сработало надо как минимум что бы все астеры учавствующие в "кластере" были зарегестрированы дрг на друге.