Собстевнно для контроля количества одновременных входящих забацан такой макрос:
[macro-limit]
exten => s,1,Set(GROUP()=tg${ARG1})
exten => s,2,NooP(${GROUP_COUNT(tg${ARG1})})
exten => s,3,GotoIf($[${GROUP_COUNT(tg${ARG1})} < ${ARG2}]?7)
exten => s,4,Playback(vse_ushli_na_front)
exten => s,5,Busy
exten => s,6,Hangup
exten => s,7,Macroexit
Который на входе проверяет а не много ли абонов в транггруппе, если много, то говорит, что много и делает Busy.
Собственно вот как раз иногда данный busy повисает в виде канала
SIP/c_tgo_in-000000f s@macro-limit:5 Up Busy()
, который и Request hangup не берет :(
Я бы вместо
exten => s,4,Answer()
exten => s,5,Playback(vseushlina_front)
exten => s,5,Busy
exten => s,6,Hangup
вставил
exten => s,5,Playback(vseushlina_front,noanswer)
exten => s,6,Hangup(17)
что гарантированно бы отослало оригинатору response SIP 486 Busy Here. Ибо непонятно, как бы отреагировало железо оператора, если бы ему пришел ответ в виде SIP 200 OK, далее SIP 486 (гудки "занято") и следом BYE c normal call clearing. А юзерскому шлюзу или SIP-телефону - тем более бы крышу свернуло от таких запросов.
А Busy здесь вообще нужен?
[macro-limit]
exten => s,1,Set(GROUP()=tg${ARG1})
exten => s,2,NooP(${GROUPCOUNT(tg${ARG1})})
exten => s,3,GotoIf($[${GROUPCOUNT(tg${ARG1})} < ${ARG2}]?7)
exten => s,4,Answer()
exten => s,5,Playback(vseushlina_front)
exten => s,6,Hangup
exten => s,7,Macroexit
да собственно вопрос то не в этом, само собой сейчас там и стоит хенгап, дело в принципе не понятно, почему виснет
um2010 ( 2012-03-26 15:28:58 +0400 )редактироватьА в чем выражается зависание?
Уходит в бесконечность?
После вызова Busy() его еще потом обработать нужно!
bolshoy_plohish ( 2012-03-26 15:43:27 +0400 )редактироватьА Hangup(17) даёт такой же результат?
нужно понять почему busy виснет , потом уж лечить. метод тыка в данном случае не приемлим
um2010 ( 2012-03-26 08:30:59 +0400 )редактироватьНу хз, я такую конструкцию не использовал (Busy -> Hangup). Но у Busy тоже можно задать таймаут, после которого она должна закрыть канал, если он сам ещё не закрылся. Возможно тупо не доходит Cancel, попробуйте сделать Busy(10)
ro ( 2012-03-26 08:37:34 +0400 )редактироватьМакросы в команде DialТеперь Вы можете использовать аргументы в макросах, используя символ '^'
Dial(Zap/1|60|M(mymacro^cat^dog^bark))
Также, макрос может установить переменную MACRO_RESULT в следующие значения:
ABORT - оба участника соединения прервали связь BUSY CONTINUE - Отключить вызываемую сторону и продолжить выполнение команд, следующих за командой Dial GOTO:<context>^<exten>^<priority> - перевод звонка.
Обратите внимание: Если Вы хотите, чтобы оба абонента были соединены по завершению выполнения макроса, вы НЕ ДОЛЖНЫ устанавливать значение переменной MACRORESULT. Если значение MACRORESULT не определено, то после выполнения всех команд макроса до конца, абоненты будут соединены и смогут разговаривать между собой. Установка этой переменной в значения CONTINUE приводит к тому, что абоненты НЕ соединяются между собой, и выполнение команд продолжиться с приоритета n+1, текущего контекста. Конечно же, установка значения в BUSY или GOTO приведет к соответствующему результату (и, естественно, абоненты не будут соединены). (Способ управления соединением абонентов немного противоречит здравому смыслу, при котором ожидается, что причиной "соединения обоих абонентов" должна быть установка переменной MACRO_RESULT в такое значение, как "BRIDGE" или "CONNECT", или во что-то подобное. Тут же в качестве такой причины используется ОТСУТСТВИЕ любого значения этой переменной.)
Ну у человека-то вроде всё в порядке? Макрос либо переходит к приоритету 7, не возвращая MACRO_RESULT, что приводит к соединению, либо возващает её, и должен происходить hangup. Проблема-то не в макросе, а в том, что hangup не происходит.
ro ( 2012-03-26 11:21:36 +0400 )редактироватьА из чего он макрос вызывает из Dial() иои из Macro?
bolshoy_plohish ( 2012-03-26 11:28:02 +0400 )редактироватьНу если я всё правильно понимаю о вызове макросов из Dial, то в его случае разницы нет.
ro ( 2012-03-26 11:34:25 +0400 )редактироватьЗадан: 2012-03-26 08:25:44 +0400
Просмотрен: 1,281 раз
Обновлен: Mar 26 '12
Grandstream транслирует Busy как "Ошибка"
определить статус IAX пира, как?
Периодически приходит ответ BUSY от сервера и lastdata = 20
Разрешить инклюд всем кроме...
Macro, циклическая обработка аргументов
Разграничение прав. Проверка ошибок. Опыт
Проблема с отсуствием сигнала отбоя на SPA2102 (SPA8000) [закрыт]
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.
Родите сюда дамп SIP, тогда будет понятнее, где затык.
mistral ( 2012-03-26 16:20:11 +0400 )редактироватьну попробую его собрать, хотя там стока в дамп посыпится, как бы вообще айяйяй не вышел :)
um2010 ( 2012-03-26 17:15:07 +0400 )редактировать