VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

!порядковый! номер канала

Проблемы Asterisk без вэб-оболочек и их решения

Модераторы: april22, Zavr2008

serenya
Сообщения: 12
Зарегистрирован: 26 фев 2011, 23:55

!порядковый! номер канала

Сообщение serenya »

Добрый день!

Кто-нибудь знает приемы или штатные функции как в диалплане получить порядковый номер активного канала в sip-транке? Поделитесь опытом, пожалуйста! На форуме и в нете искал - результат отрицательный.

Реализован простенький автоответчик, который принимает звонок, проигрывает приветствие и записывает результат в файл (большего и не надо). Входящие поступают с сип-транка толщиной в 20 каналов. Транк позвязан на один многоканальный городской индекс.

Возникла необходимость сохранять порядковый номер канала по которому пришел вызов.

Решения более простого чем хранить 20 глобальных переменных (или ключей в БД) я не нашел. Таоке решение требует дополнительной (и сложноватой для диалплана) логики.

В качестве временной меры использую количество активных в данный момент каналов, которые считаю самостоятельно в начале и в конце дилплана простым инкрементом и декрементом. Пробовал использовать группы, но с ними возникает сложность при обращении к ним из AMI.

С переменными тоже проблемы: во-первых ICN отражает не совсем то, что хотелось бы, а во-вторых, раз на 5-10 тыс. входящих счетчик сбивается и получается что при отсутствии входящих ICN=1 ... и это при двух простых командах инкремента и декремента счтетчика, трудно представить как же будет сбиватся многопотоковый астериск при обработке 20 переменных в 20 строках диалплана :(

Вресия астериска 1.6
Диалплан приводится:

Код: Выделить всё

exten => ${GLOBAL(NUM)},1,Set(GLOBAL(ICN)=${MATH(${GLOBAL(ICN)}+1)})
exten => ${GLOBAL(NUM)},n,Set(CN=${GLOBAL(ICN)})
exten => ${GLOBAL(NUM)},n,Answer
exten => ${GLOBAL(NUM)},n,Wait(1)
exten => ${GLOBAL(NUM)},n,Playback(${GLOBAL(HP)}${GLOBAL(ADP)}service/greeting,skip)
exten => ${GLOBAL(NUM)},n,Set(FileName=${STRFTIME(${EPOCH},,%Y-%m-%d-%H-%M-%S)}-${IF($[${CN}<10]?0${CN:0:1}:${CN:0:2})}-${CALLERID(num)})
exten => ${GLOBAL(NUM)},n,Record(${GLOBAL(HP)}${GLOBAL(ADP)}tmp/${FileName}:wav,0,90,skip)
exten => ${GLOBAL(NUM)},n,Hangup
exten => h,1,ExecIf($["${FileName}"!=""]?System(mv ${GLOBAL(HP)}${GLOBAL(ADP)}tmp/${FileName}.wav ${GLOBAL(HP)}${GLOBAL(ADP)}vrs/)) 
exten => h,n,Set(GLOBAL(ICN)=${MATH(${GLOBAL(ICN)}-1)})
Аватара пользователя
trscod
Сообщения: 358
Зарегистрирован: 30 авг 2010, 17:34

Re: !порядковый! номер канала

Сообщение trscod »

Отличный вопрос! Как Вы представляете себе иерархию каналов в SIP транке? Боюсь даже спросить отчего пришла в голову такая идея - знать номер SIP канала...
serenya
Сообщения: 12
Зарегистрирован: 26 фев 2011, 23:55

Re: !порядковый! номер канала

Сообщение serenya »

trscod писал(а):Отличный вопрос! Как Вы представляете себе иерархию каналов в SIP транке? Боюсь даже спросить отчего пришла в голову такая идея - знать номер SIP канала...
В данном случае по аналогии с аналоговыми многоканальными регистраторами. Провайдер при звонке на многоканальный аналоговый номер проверяет занята ли первая медная пара, если нет то комутирует, если да то анализирует вторую и т.д., если все линии заняты абоненту передается сигнал "занято".

Разница для сип-транка (имхо) в том, что провайдер проверяет не медные пары а возможность, т.е. если количество активных каналов этого клиента меньше количества выделеных ему - то вызов поступает клиенту, а если больше или равно - то вызывающему абоненту выдается сигнал "занято"

Написав всё это осознал что вряд-ли найду готовое решение, а уж тем более штатную функцию, но смогу написать эмулятор.

Так что вопрос перефразирую:

1. Как максимально просто получить количество каналов в групе из AMI?
2. Как в диалплане "монопольно" или "пакетом" сделать несколько арифметических операций над глобальными переменными, будучи уверенным, что другой поток не поменяет значение глобольной переменной прямо во время моего вычисления?
ded
Сообщения: 15618
Зарегистрирован: 26 авг 2010, 19:00

Re: !порядковый! номер канала

Сообщение ded »

serenya писал(а):
trscod писал(а):Отличный вопрос! Как Вы представляете себе иерархию каналов в SIP транке? Боюсь даже спросить отчего пришла в голову такая идея - знать номер SIP канала...
В данном случае по аналогии с аналоговыми многоканальными регистраторами. Провайдер при звонке на многоканальный аналоговый номер проверяет занята ли первая медная пара, если нет то комутирует, если да то анализирует вторую и т.д., если все линии заняты абоненту передается сигнал "занято".

Разница для сип-транка (имхо) в том, что провайдер проверяет не медные пары а возможность, т.е. если количество активных каналов этого клиента меньше количества выделеных ему - то вызов поступает клиенту, а если больше или равно - то вызывающему абоненту выдается сигнал "занято"

Написав всё это осознал что вряд-ли найду готовое решение, а уж тем более штатную функцию, но смогу написать эмулятор.

Так что вопрос перефразирую:

1. Как максимально просто получить количество каналов в групе из AMI?
2. Как в диалплане "монопольно" или "пакетом" сделать несколько арифметических операций над глобальными переменными, будучи уверенным, что другой поток не поменяет значение глобольной переменной прямо во время моего вычисления?
Полное цитирование предыдущего поста = Первый Инфернальный Признак.
serenya
Сообщения: 12
Зарегистрирован: 26 фев 2011, 23:55

Re: !порядковый! номер канала

Сообщение serenya »

ded писал(а):Полное цитирование предыдущего поста = Первый Инфернальный Признак.
А теперь смотрим внимательно на первые два мои поста, извиняемся и пишем что-нибудь по сути вопроса :)
gosha
Сообщения: 375
Зарегистрирован: 06 сен 2010, 17:41
Контактная информация:

Re: !порядковый! номер канала

Сообщение gosha »

serenya писал(а): 2. Как в диалплане "монопольно" или "пакетом" сделать несколько арифметических операций над глобальными переменными, будучи уверенным, что другой поток не поменяет значение глобольной переменной прямо во время моего вычисления?

http://www.voip-info.org/wiki/view/Aste ... oExclusive
Glukinho
Сообщения: 660
Зарегистрирован: 07 янв 2011, 20:05

Re: !порядковый! номер канала

Сообщение Glukinho »

serenya писал(а):Разница для сип-транка (имхо) в том, что провайдер проверяет не медные пары а возможность, т.е. если количество активных каналов этого клиента меньше количества выделеных ему - то вызов поступает клиенту, а если больше или равно - то вызывающему абоненту выдается сигнал "занято"
В этом случае, как я понимаю, вам не порядковый номер надо считать, а общее число вызовов в данном транке.
Аватара пользователя
trscod
Сообщения: 358
Зарегистрирован: 30 авг 2010, 17:34

Re: !порядковый! номер канала

Сообщение trscod »

Осторожнее с ответами, а то извиняться придется.
Glukinho
Сообщения: 660
Зарегистрирован: 07 янв 2011, 20:05

Re: !порядковый! номер канала

Сообщение Glukinho »

Это мне?
ded
Сообщения: 15618
Зарегистрирован: 26 авг 2010, 19:00

Re: !порядковый! номер канала

Сообщение ded »

serenya, во втором Вашем посте Вы процитировали полностью предыдущий пост самым невнимательным образом.
По существу:
Count and limit number of calls under asterisk

Under asterisk, from your dialplan or an agi script you can put your calls (that has the same purpose)
in the same group.
This can be done using the GROUP* functions under asterisk.
- With GROUP() you can retrieve or set a group for the current channel
- With GROUP_COUNT() you can retrieve the total of live channel in that group
- With GROUP_LIST, you will get a list of group where the current channel is. So you can set put the same channel in multiple group to classify them.
- With GROUP_MATCH_COUNT, you can retrieve the number of live channels in that group matching the specifed regular expression.
Example :
A nice application for this is, if you have multiple inbound DIDs that reach a same T1 or E1 and want to limit calls to DID 2120000000 to 15 for example. Your dialplan should go like this :

Код: Выделить всё

exten => 212000000,1,Noop(Received call to extension ${EXTEN})
    exten => 212000000,n,GROUP(${EXTEN}) ; send all calls coming here to group 2120000000
    exten => 2120000000,n,GotoIf($[ ${GROUP_COUNT()} > 15 ]?maxreached) ; make your check
    exten => 2120000000,n, ……. ; Normal call flow
    exten => 2120000000,n,Hangup
    exten => 2120000000,n(maxreached),Congestion ; Here there is too many calls - You could play a message as well
    exten => 2120000000,n,Busy
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH