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

Повисает BUSY

0

Собстевнно для контроля количества одновременных входящих забацан такой макрос:

[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 не берет :(

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

спросил 2012-03-26 08:25:44 +0400

um2010 Gravatar um2010
2056 70 13 55

обновил 2012-03-26 08:29:12 +0400

Comments

Родите сюда дамп SIP, тогда будет понятнее, где затык.

mistral ( 2012-03-26 16:20:11 +0400 )редактировать

ну попробую его собрать, хотя там стока в дамп посыпится, как бы вообще айяйяй не вышел :)

um2010 ( 2012-03-26 17:15:07 +0400 )редактировать

4 Ответа

2

Я бы вместо

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-телефону - тем более бы крышу свернуло от таких запросов.

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

ответил 2012-03-26 19:34:24 +0400

mistral Gravatar mistral flag of Ukraine
370 2 5 19

обновил 2012-03-26 19:40:49 +0400

Comments

в принципе понятно, спасибо

um2010 ( 2012-03-26 21:35:59 +0400 )редактировать
0


А 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

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

ответил 2012-03-26 15:20:28 +0400

bolshoy_plohish Gravatar bolshoy_plohish
1388 25 20 38

Comments

да собственно вопрос то не в этом, само собой сейчас там и стоит хенгап, дело в принципе не понятно, почему виснет

um2010 ( 2012-03-26 15:28:58 +0400 )редактировать

А в чем выражается зависание?

Уходит в бесконечность?

После вызова Busy() его еще потом обработать нужно!

bolshoy_plohish ( 2012-03-26 15:43:27 +0400 )редактировать

после стоит hangup

um2010 ( 2012-03-26 16:06:27 +0400 )редактировать
0

А Hangup(17) даёт такой же результат?

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

ответил 2012-03-26 08:28:37 +0400

ro Gravatar ro flag of Russian Federation
404 1 1 11
http://rootblog.ru/

Comments

нужно понять почему busy виснет , потом уж лечить. метод тыка в данном случае не приемлим

um2010 ( 2012-03-26 08:30:59 +0400 )редактировать

Ну хз, я такую конструкцию не использовал (Busy -> Hangup). Но у Busy тоже можно задать таймаут, после которого она должна закрыть канал, если он сам ещё не закрылся. Возможно тупо не доходит Cancel, попробуйте сделать Busy(10)

ro ( 2012-03-26 08:37:34 +0400 )редактировать
0

Макросы в команде 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", или во что-то подобное. Тут же в качестве такой причины используется ОТСУТСТВИЕ любого значения этой переменной.)

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

ответил 2012-03-26 10:53:05 +0400

bolshoy_plohish Gravatar bolshoy_plohish
1388 25 20 38

Comments

Ну у человека-то вроде всё в порядке? Макрос либо переходит к приоритету 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 )редактировать

это здесь при чем?

um2010 ( 2012-03-26 22:10:33 +0400 )редактировать

Ваш ответ

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

Статистика

Задан: 2012-03-26 08:25:44 +0400

Просмотрен: 1,281 раз

Обновлен: Mar 26 '12

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