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

порядковый номер канала (решено на 99%)

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

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

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

порядковый номер канала (решено на 99%)

Сообщение serenya »

Спасибо всем ответившим в теме http://forum.asterisk.ru/viewtopic.php?f=3&t=337!

Благодаря Вам вопрос практически решен, осталась одна маленькая неприятность, связанная, наверное, с особенностями локального псевдоканала.

Сейчас у меня работает sip транк на 20 одновременных соединений, по нему заходят входящие звонки и совершаются исходящие, причем входящие приоритетнее. В диалплане 3 контекста: один для входящих и 2 для исходящих, также есть 2 глобальные переменные ICC и OCC - счетчики входящих и исходящих активных каналов соответственно, кроме того есть 20 ключей в базе вида "cs/cnXX" (XX - порядковый номер канала, выполняющий роль индекса ключа от 1 до 20), которые могут принимать значения "I" и "O".

В начале обработки входящих соединения я эксклюзивным вызовом макроса инкрементирую счетчик ICN и пробегаюсь по базе от 1 до 20 в поисках первого ключа с пустым значением, присваиваю локальной переменной CN индекс этого ключа, а самому ключу присваиваю значение "I". В конце обработки, тем-же макросом, я декрементирую счетчик и ключу с индексом CN присваиваю пустое значение. Всё работает железно (проверено на ~20000 входящих)

Для исходящий я делаю то-же самое в начале, только смотрю базу с конца (от 20 до 1) и присваиваю ключу значение "O". Если на вызов ответили то декремент и освобождение ключа я делаю в конце второго контекста, а если нет - то в конце первого. Вот тут возникает ситуация что на этапе декремента переменная CN=0. Очень редко, но бывает, соответственно ключ в базе не освобождается и логика рушиться.

В чем может быть бедулька?

Диалплан привожу:

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

[general]
static=yes
writeprotect=yes
clearglobalvars=yes

[globals]
ACC=20
ICC=0
OCC=0

[macro-assume]
exten => s,1,Set(GLOBAL(${ARG1})=$[${GLOBAL(${ARG1})}+1])
exten => s,n,Set(__CN=0)
exten => s,n,Set(CMP=${IF($[${ARG2}<${ARG3}]?>:<)})
exten => s,n,Set(INC=${IF($[${ARG2}<${ARG3}]?+:-)})
exten => s,n,Set(I=${ARG2})
exten => s,n(loop_start),GotoIf($[0${I}${CMP}0${ARG3}]?loop_end)
exten => s,n,GotoIf($["${DB(cs/cn${I})}"!=""]?step_end)
exten => s,n,Set(DB(cs/cn${I})=${ARG4})
exten => s,n,Set(__CN=${I})
exten => s,n,Goto(loop_end)
exten => s,n(step_end),Set(I=$[${I}${INC}1])
exten => s,n,Goto(loop_start)
exten => s,n(loop_end),NoOp

[macro-free]
exten => s,1,ExecIf($[0${CN}!=00]?Set(DB(cs/cn${CN})=))
exten => s,n,Set(GLOBAL(${ARG1})=$[${GLOBAL(${ARG1})}-1])

[macro-counter]
exten => s,1,Macro(${ARG1},${ARG2},${ARG3},${ARG4},${ARG5})

[answerer]
exten => s,1,MacroExclusive(counter,assume,ICC,1,${GLOBAL(ACC)},I)
...
exten => h,1,MacroExclusive(counter,free,ICC)

[caller_i]
exten => _X.,1,MacroExclusive(counter,assume,OCC,${GLOBAL(ACC)},1,O)
exten => _X.,n,Dial(SIP/trunk20/${EXTEN})
exten => h,1,ExecIf($[${DIALSTATUS}!=ANSWER]?MacroExclusive(counter,free,OCC))

[caller_sm]
...
exten => h,1,MacroExclusive(counter,free,OCC)

[incoming_trunk20]
include => answerer
ded
Сообщения: 15619
Зарегистрирован: 26 авг 2010, 19:00

Re: порядковый номер канала (решено на 99%)

Сообщение ded »

Мне искренне жаль Вас!
Если избыточный писательский зуд определён термином графомания, то избыточный программистский зуд пока не имеет наверное специально придуманного термина.
Кодеромания?
Я надеюсь, что это будет воспринято без обид.
serenya
Сообщения: 12
Зарегистрирован: 26 фев 2011, 23:55

Re: порядковый номер канала (решено на 99%)

Сообщение serenya »

ded писал(а):Мне искренне жаль Вас!
Кодеромания?
Я надеюсь, что это будет воспринято без обид.
Да нет, обижаться не мой удел, только что натолкнуло Вас на такую рецензию?
ded
Сообщения: 15619
Зарегистрирован: 26 авг 2010, 19:00

Re: порядковый номер канала (решено на 99%)

Сообщение ded »

Опыт + тонны чужого кода.
By default - всё уже придумано, напрограммировано, и реализовано лучшим образом. Задача - только найти это и внедрить минимальными телодвижениями.
Таким образом по мне лучше совершенствовать технику поиска и внедрения.
Очень и очень немногие могут похвастаться что они на гребне волны, что накодили что-то совершенно новое, чего ещё нет нигде.
serenya
Сообщения: 12
Зарегистрирован: 26 фев 2011, 23:55

Re: порядковый номер канала (решено на 99%)

Сообщение serenya »

ded писал(а):By default - всё уже придумано, напрограммировано, и реализовано лучшим образом. Задача - только найти это и внедрить минимальными телодвижениями.
Дело в том, что поиск готового не только более здравомысленый подход, но и более дешевый. И я, естественно, как человек здравомыслящий, начинаю с поиска в рунете, потом на зарубежных сайтах, но к сожалению совершенно не всё что уже придумано выложено by default. Поэтому и обращаюсь на форумы с той надеждой, что кто-то реализовывал подобное лично и готов поделится опытом.

Кстати о Вас... Вы человек в астериск-сообществе известный, и опыт, о котором говорите, - явно имеете. Вопрос не из разряда "как закат только зеленый", вопрос вполне актуален для перехода от физических линий (для которых порядковый номер нечто само-собой разумеющееся) к инкапсуляции данных в потоки (где оперируют количеством конкурирующих потоков). Почему же тогда Вы, завсегдатай большинства топиков, даже краем уха не слышали готового решения или краем глаза не взгляните на код и краем пальца не напишите по-сути вопроса, вместо этого утруждая себя изречениями философского характера?
ded
Сообщения: 15619
Зарегистрирован: 26 авг 2010, 19:00

Re: порядковый номер канала (решено на 99%)

Сообщение ded »

Я не утруждаю себя изречениями философского характера. Изрекать - это совсем не трудно.
Функцию GROUP Вы так и не попробовали даже.
Ваш способ - это "как програмными трюками продлить жизнь старым больным шуршанием аналоговым телефонным линиям склееным в лапшу из пакового хлеба блокадного Ленинграда".
Я отрицаю такой подход в принципе там, где нужно всё делать по-новому.
serenya
Сообщения: 12
Зарегистрирован: 26 фев 2011, 23:55

Re: порядковый номер канала (решено на 99%)

Сообщение serenya »

ded писал(а):Функцию GROUP Вы так и не попробовали даже.
Очень даже пробовал, но она решает только половину проблемы: с её помощью можно считать количество, а не номер п.п., к тому же при оригинации через локальный канал возникает ситуация когда родился дочерний канал, а родительский ещё не прибит, если в это время запросить group_count количество будет больше реального.

З.Ы. на Новое в программировании я не претендую, но если решение будет найдено это будет достойно faq-а т.к. вопрос уже поднимался, а решение - нет
Glukinho
Сообщения: 660
Зарегистрирован: 07 янв 2011, 20:05

Re: порядковый номер канала (решено на 99%)

Сообщение Glukinho »

serenya писал(а):с её помощью можно считать количество, а не номер п.п.
В SIP-транке у созданных через него каналов нет понятия "порядковый номер". Этот идентификатор вы придумали сами и он не несет смысла (в отличие от, например, E1).
С точки зрения Астериска у SIP-каналов есть уникальные идентификаторы:
mml-pbx*CLI> sip show channels
Peer User/ANR Call ID Seq (Tx/Rx) Format Hold Last Message
...
213.170.81.130 8107495500 7b274cf0179 00103/00000 0x8 (alaw) No Tx: ACK
4 active SIP channels
mml-pbx*CLI> sip show channel 7b274cf0179e8c8d4211b0cf1303c10c@212.45.20.131
mml-pbx*CLI>
* SIP Call
Curr. trans. direction: Outgoing
Call-ID: 7b274cf0179e8c8d4211b0cf1303c10c@212.45.20.131
Owner channel ID: SIP/213.170.81.130-08613e80

...
Я бы использовал их, если уж так надо.
Допускаю, что я не до конца понимаю задачу, стоящую перед вами.
ded
Сообщения: 15619
Зарегистрирован: 26 авг 2010, 19:00

Re: порядковый номер канала (решено на 99%)

Сообщение ded »

Присоединяюсь.
Если грядёт переход от физических линий (для которых порядковый номер нечто само-собой разумеющееся) к инкапсуляции данных в потоки (где оперируют количеством конкурирующих потоков), то нужно срочно ставить channel bank, втыкать физические линии в порты FXO, получать цифровые потоки где и оперировать количеством каналов. Или напрягать провайдера на предмет получения линий по SIP, а если не напрягается - ставить свой Е1 шлюз у него, получать в цифре, и отправлять к себе по SIP.
serenya
Сообщения: 12
Зарегистрирован: 26 фев 2011, 23:55

Re: порядковый номер канала (решено на 99%)

Сообщение serenya »

Glukinho писал(а):В SIP-транке у созданных через него каналов нет понятия "порядковый номер".
Да, я это понимаю, поэтому и пытаюсь сэмулировать порядковый номер.
Glukinho писал(а):Допускаю, что я не до конца понимаю задачу, стоящую перед вами.
Задача очень простая и немного глупая. Раньше автоответчик и звонилка работали через аналоговую спец. плату на 16 каналов и операторы, обрабатывающие входящие привыкли к номеру линии от 1 до 16 (устоялся целый механизм распределения труда операторов по линиям). И сейчас, с переходом на sip им нужно нечто подобное, - номер линии от 1 до 20.
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH