Использование переменного числа аргументов для Macro

Skip to end of metadata
Go to start of metadata

Использование переменного числа аргументов для 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 работает, но подозреваю что что бы оно сработало надо как минимум что бы все астеры учавствующие в "кластере" были зарегестрированы дрг на друге.

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.