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

порт GSM-шлюза не дает статус Busy

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

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

anvista
Сообщения: 22
Зарегистрирован: 04 авг 2011, 12:06

порт GSM-шлюза не дает статус Busy

Сообщение anvista »

День добрый.
Есть немолодой GSM-шлюз с 4мя симками для звонков на мобильные из офиса. Раньше бегало все прекрасно по логике звонка:
same => n,GotoIf($["${DEVICE_STATE(SIP/GSM01)}"="NOT_INUSE"]?call1)
same => n,GotoIf($["${DEVICE_STATE(SIP/GSM02)}"="NOT_INUSE"]?call2)
....
same => n(call1),Dial(SIP/GSM01/${EXTEN},50,Ww)
same => n,Hangup()
same => n(call2),Dial(SIP/GSM02/${EXTEN},50,Ww)
same => n,Hangup()

Но некоторое время назад пара портов в этом шлюзе перестали выдавать статус "ЗАНЯТО", как следствие получили затык на выходе, т.к. следующий исходящий звонок ломится в занятый порт с полной уверенностью, что тот свободен.

Вот сижу думаю, можно ли смастерить аналогичную конструкцию, опираясь на какую-нибудь другую переменную.
Аватара пользователя
Wapo
Сообщения: 795
Зарегистрирован: 02 мар 2011, 17:53

Re: порт GSM-шлюза не дает статус Busy

Сообщение Wapo »

Вы можете сделать глобальные переменные G1....G4, устанавливать их в 1 при начале звонка и указывать в переменной канала какую из глобальных вы сейчас используете, а далее в екстене h переустанавливать ее в 0
anvista
Сообщения: 22
Зарегистрирован: 04 авг 2011, 12:06

Re: порт GSM-шлюза не дает статус Busy

Сообщение anvista »

Идея интересная, только мне не совсем понятно, как ее реализовать.
Все 4 GSM болтаются в одном контексте, с установкой переменной в статус 1 проблем нет.
но как определить именно ее в статус 0, учитывая, что экстен h для них будет одинаковый?
если только попробовать раскидать их в разные контексты. В любом случае, спасибо. Подумаю над этим :)
Аватара пользователя
Wapo
Сообщения: 795
Зарегистрирован: 02 мар 2011, 17:53

Re: порт GSM-шлюза не дает статус Busy

Сообщение Wapo »

Перед началом звонка в отдельную переменную загнать имя Set(CHAN=G1) ну а далее в h вытащить это имя из ${CHAN}
anvista
Сообщения: 22
Зарегистрирован: 04 авг 2011, 12:06

Re: порт GSM-шлюза не дает статус Busy

Сообщение anvista »

я сделала через переходы в контексты. может не так изящно, но работает исправно. выглядит так:
[globals]
G01=0
G02=0
....
G01_exten=0
G02_exten=0

[SIP-GSM]
exten => _89XXXXXXXXX,1,NoOp()
same => n,Wait(1)
same => n,GotoIf($["${G01}"="0"]?gsm01)
same => n,GotoIf($["${G02}"="0"]?gsm02)
.....
same => n(gsm01),Set(GLOBAL(G01_exten)=${EXTEN})
same => n,Set(GLOBAL(G01)='BUSY')
same => n,Goto(GSM01,s,1)
...
[GSM01]
exten => s,1,Dial(SIP/GSM01/${G01_exten},50,Ww)
same => n,Hangup()
exten => h,1,Set(GLOBAL(G01)=0)
exten => h,2,Set(GLOBAL(G01_exten)=0)

СПАСИБО за идею
anvista
Сообщения: 22
Зарегистрирован: 04 авг 2011, 12:06

Re: порт GSM-шлюза не дает статус Busy

Сообщение anvista »

на хабре проверяет состояние занятости все тем же DEVICE_STATE
--------
; Предпочитаем Tele2 и проверяем, не занята ли его линия
exten => _89XX.,n(prefer-tele2),GotoIf($["${DEVICE_STATE(SIP/gsmline2)}" = "NOT_INUSE"]?tele2:megafon)
; Или всё же мегафон...
exten => _89XX.,n(prefer-megafon),GotoIf($["${DEVICE_STATE(SIP/gsmline1)}" = "NOT_INUSE"]?megafon:tele2)
; Соединяемся с возможностью перевода и продолжением выполнения диалплана.
---------
а у меня как раз проблема в том, что часть портов все время отдает статус NOT_INUSE, даже, если заняты.
Аватара пользователя
Wapo
Сообщения: 795
Зарегистрирован: 02 мар 2011, 17:53

Re: порт GSM-шлюза не дает статус Busy

Сообщение Wapo »

У вас 1 устройство с 1 адресом IP и четырмя каналами - вот вам и невозможность получить нормальный статус одного из портов
Аватара пользователя
dimondack
Сообщения: 62
Зарегистрирован: 16 сен 2019, 02:40

Re: порт GSM-шлюза не дает статус Busy

Сообщение dimondack »

на хабре проверяет состояние занятости все тем же DEVICE_STATE
мне в этой статье показалось интересным использовать группы
https://asterisk-pbx.ru/wiki/asterisk/func/group

........
а что если немного изменить данный пример
[from-gsm]
; (первая линия)
exten => +79310000000,1,Set(GROUP(gsm1)=public) ; Устанавливаем группу, дабы считать занятые каналы
exten => +79310000000,n,Goto(to-internal,queue,1)
; (вторая линия)
exten => +79520000000,1,Set(GROUP(gsm2)=public) ; Устанавливаем группу, дабы считать занятые каналы
exten => +79520000000,n,Goto(to-internal,queue,1)
.........
и тогда
  • ; Звонки на сотовые
    [to-gsm]
    ; Проверяем, есть ли свободные линии
    exten => _89XX.,1,GotoIf($["${GROUP_COUNT(public@gsm1)}" >= "1"]?noline1)
и т.д.

Можно с группами реализовать
Вообщем я увидел и такой вариант
Аватара пользователя
Wapo
Сообщения: 795
Зарегистрирован: 02 мар 2011, 17:53

Re: порт GSM-шлюза не дает статус Busy

Сообщение Wapo »

Увы dimondack если gsm на 4 канала рассматривать как транк - то да - группа подойдет. Но она не скажет КАКОЙ канал свободен, а какой занят (пара симок МТС и пара в Мегафоне - и куда гнать вызов?). Впрочем и сам шлюз можно именно в таком режиме подключить.
А, по большому счету, для астера что SIP/gsm1 что SIP/gsm2 одинаковы: вызов идет так SIP/gsm1/01... или SIP/gsm2/02.... и рулится диалпланом шлюза.
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH