AF
Asterisk Forum
обсуждения телефонии, VoIP и IP-PBX
12разделов
5 423тем
34 385сообщений
← К списку тем

Занятость/доступность SIP - пира.

Asterisk IP PBX 15 сообщений 01.09.2008 18:28 - 09.12.2010 13:58
#1 01.09.2008 18:28

Занятость/доступность SIP - пира.


Нужно получить состояние определенного сипа или сипов.
ChanIsAvail
http://www.voip-info.org/wiki/index.php? ... hanIsAvail
я так понял -- не умеет именно с СИПом.
Если это не возможно, то как хотя б сделать show channels через екстеншен, то есть с помощью какого-то апликейшена?
Тогда буду через AGI искать нужные сипы в списке каналов.

Спасибо.
#2 01.09.2008 19:21

qualify=yes
#3 02.09.2008 08:45

Не-е... qualify -- это доступность, это и проверяет ChanisAvail.
Мне нужно узнать занят СИП или свободен, разговаривает или нет.
#4 02.09.2008 11:15

asterisk -rx "sip show channels" | grep [имя пира] если видишь что у него статус ACK значит разговаривает Smile
#5 02.09.2008 14:09

Если бы такую команду можно было запустить с extensions.conf , то такой вариант мне бы подошел... Smile
Шеловская команда не подзодит.
#6 02.09.2008 14:36

Oleg78 wrote:
Мне нужно узнать занят СИП или свободен, разговаривает или нет.


show dialplan macro-stdexten
[ Context 'macro-stdexten' created by 'pbx_config' ]
'a' => 1. VoicemailMain(${ARG1}) [pbx_config]
's' => 1. Dial(${ARG2}|20|Ttr) [pbx_config]
2. SetLanguage(ru) [pbx_config]
3. Goto(s-${DIALSTATUS}|1) [pbx_config]
's-BUSY' => 1. Voicemail(b${ARG1}) [pbx_config]
2. Goto(default|s|1) [pbx_config]
's-CHANUNAVAIL' => 1. Hangup() [pbx_config]
's-NOANSWER' => 1. Voicemail(u${ARG1}) [pbx_config]
2. Goto(default|s|1) [pbx_config]
'_s-.' => 1. Goto(s-NOANSWER|1) [pbx_config]

Сможешь написать свой макрос, чтобы отрабатывал нужное по состояниям s-BUSY s-CHANUNAVAIL s-NOANSWER
#7 02.09.2008 15:39

Хм.. Но тут состояние вычисляется по ответу команды ДИАЛ. А мне нужно, чтоб сначала определить свободный канал и только потом в него звонить.
Ведь если проверять Диалом, то при свободном канале звонок уйдет и не вернется. Smile
Эта вся затея для распределения нагрузки между каналами.
#8 02.09.2008 16:46

Oleg78 wrote:
Ведь если проверять Диалом, то при свободном канале звонок уйдет и не вернется. Smile
А что значит не вернется? В смысде - уйдет на вызов? Разве это не является целью звонка?
ИМХО, путанно излагаете:
Quote:
Нужно получить состояние определенного сипа или сипов.
не понятна конечная цель.
Попробую так же путанно ответить - в PDF устроит состояние канала? Или нужнов XLS? (шутка).
#9 02.09.2008 19:07

Ну я ж написал -- Эта вся затея для распределения нагрузки между каналами. Выглядит все так:
Есть несколько GSM шлюзов. Для звонков на них надо считать общее число минут разговоров на каждого оператора (это чтоб не вылезть за граници минут, установленных оператором. Это такая безлимитная симка Smile )
Пробую реализовать это все через AGI, который может использовать только апликейшены астериска.
Вобщем если не углубляться во все это, то :

Quote:
А что значит не вернется? В смысде - уйдет на вызов? Разве это не является целью звонка?

нужно сразу отправлять на заведомо свободный канал.
Диал для проверки не подходит. Нужен еще какой-то способ.
Поясню еще.
Например нашел мой скрипт подходящий СИП, отправил на него звонок, а он оказался занят. Так что теперь опять запускать скрипт сначала? И сколько раз так запускать? А если свободных каналов не будет вообще, тогда что вычисление канала зациклиться?
#10 02.09.2008 23:27

http://www.voip-info.org/wiki/view/channel+status

Оно?

набрать в консоли астериска:
Code:
show agi channel status

_________________
Мои рекомендации: Asterisk-1.8 + G.722 кодек = лучший выбор!
Успехов!
#11 03.09.2008 09:28

Я вам скажу у Вас проблема в корне, т.е. подход выбран не верен.
_________________
"Фантазия важнее знания.", Альберт Эйнштейн
#12 08.12.2010 09:51

Попробую оживить тему....
Имею схожие проблемы
Есть:
GSM шлюз на 2 sim и система автоинформирования.
Схема работы следующая:
автоинформатор получает номер абонента, отправляет dial() на првый порт gsm-шлюза, если дозвонился проговаривае сообщение, если получает busy, то отправляет dial() на второй порт.
Суть проблемы:
asterisk получает ответ busy в двух случаях 1) если на шлюзе уже происходит соединение (занят шлюз) и 2) если абонент занят или сбросил вызов.
Задача:
Отправить звонок по заведомо свободной линии. Или как вариант считать безуспешные попытки дозвона до абонента, при условии что шлюз как минимум набрал номер.

Варианты в работе:
1) считать время с момента отправки номера на шлюз до получения ответа busy. Логика такая - если шлюз сразу дал отбой ответ придет значительно раньше чем если шлюз попытается дозвониться до клиента. Минусы: не элегантно и перестанет работать при увеличении кол-ва и видов шлюзов(разным шлюзам может понадобиться разное время на ответ)
2) использовать call-limit. Количество одновременных соединений на каждой линии заранее известно. Проблема: не очевидно как в extension проверить call-limit для данного канала и определить текущее значение inuse. Решение мне лично нравится больше, но не хватает знаний.
3) Вкорне перестроить логику вызовов. Проблема нет идей как сделать правильно и надежно.

Буду благодарен как за помощь в реализации, так и за критику.
#14 09.12.2010 12:54

Я использую вот такой метод:
Code:
same => n,GotoIf($["${DEVICE_STATE(SIP/124)}" = "NOT_INUSE"]?line_free)

_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux 2.6.32-r7 || Asterisk 1.8.0 | SFA | Linksys SPA922 + D-Link DPH-300S + D-Link DVG-7111S + 3 x Huawei E1550
#15 09.12.2010 13:58

Спасибо за ответы, пойду экспериментировать...