23 ноября 2011 г.

Asterisk, LG ipLDK, OOH323

Итак, у нас есть астериск с базовыми настройками, и у нас есть несколько АТС LG - LDK100, LDK300, LDK60.
У каждой АТС свой план нумерации. Находятся.. Можно сказать, что находятся в одной локальной сети (есть несколько филиалов, объединенных провайдером прозрачно в одну сеть).
АТС объединены по VOIP посредством H323. Настраивал не я, но вижу, как минимум, одну причину, почему именно H323, а не SIP - плата VOIB на LDK100, которая, насколько я знаю, не умеет SIP. Кстати, насчет плат. Вот что говорит bs:
LDK100 - 11 VOIB 4.3A 43 INS
LDK300 - 7 VOIB 2.2A 22 INS (на самом деле, это VOIBE)
LDK60 - 10 VOIB 2.3B 23 INS

Посредством PGM 324 настроена маршрутизация между АТС, в зависимости от набираемого номера. Все работает без проблем.
Сразу скажу, я далеко не специалист в области телефонии в целом, и ip-телефонии в частности.  
Так вот, необходимо объединить абонентов Asterisk с абонентами остальных АТС. Asterisk умеет общаться по H.232. Для этого есть несколько различных H323-драйверов  для Asterisk:
  1. chan_oh323 - исторически первый H323-драйвер для Asterisk. При работе использует RTP-стек библиотеки OpenH323, со всеми вытекающими отсюда последствиями (поддерживаемые кодеки, стабильность, совместимость). Поддерживается компанией inAccess Networks [2].
  2. chan_h323 - отличительной особенностью данного драйвера является более тесная интеграция с Asterisk (используется Asterisk-реализация протокола RTP), что позволяет достичь большей производительности по сравнению с chan_oh323. Платой же за это является несколько меньшая функциональность. Так, например, chan_h323 не имеет собственного буфера дрожания (jitter buffer) [3], а также не поддерживает некоторые кодеки.
  3. chan_ooh323c - драйвер компании Objective Systems Inc [4], основанный на их открытом H323 стеке - Objective Open H.323 for C.
  4. chan_woomera - драйвер, позволяющий связать Asterisk с сервером Woomera. На данный момент через woomera можно совершать только H323-звонки, хотя в будущем разработчики обещают обеспечить поддержку универсального уровня абстракции OPAL.
Вообще, вот здесь хорошо написано про различия этих драйверов.


Устанавливаем драйвер ooh323.
Создаем конфиг:

ooh323.conf

[general]
port=1720
bindaddr=0.0.0.0
;gateway=no
;faststart=no
faststart=yes
;h245tunneling=yes
h245tunneling=no
mediawaitforconnect=no
h323id=ObjSysAsterisk
e164=100
callerid=asterisk
gatekeeper = DISABLE
logfile=/var/log/asterisk/h323_log
;context=default
context=phones-ldk
disallow=all
;allow=ulaw
allow=alaw
dtmfmode=rfc2833

[LDK100]
type=friend
context=phones-ldk
ip=192.168.3.222
port=1720
disallow=all
;allow=ulaw
allow=alaw
dtmfmode=rfc2833

[LDK300]
type=friend
context=phones-ldk
ip=192.168.3.223
port=1720
disallow=all
allow=alaw
dtmfmode=rfc2833

[LDK60]
type=friend
context=phones-ldk
ip=192.168.3.221
port=1720
disallow=all
allow=alaw
dtmfmode=rfc2833

После этого необходимо выгрузить/загрузить драйвер:

CLI: module unload chan_ooh323.so
CLI: module load chan_ooh323.so

Проверить:
core show channeltypes

Затем прописываем правила для звонков:
extensions.conf

[phones]
exten => _3XX,1,Dial(SIP/${EXTEN})
exten => _3XX,n,Hangup()

include => phones-ldk

[phones-ldk]
exten => _4XX,1,Dial(OOH323/${EXTEN}@LDK100)
exten => _4XX,n,Hangup()

exten => _5XX,1,Dial(OOH323/${EXTEN}@LDK300)
exten => _5XX,n,Hangup()

exten => _1XX,1,Dial(OOH323/${EXTEN}@LDK60)
exten => _1XX,n,Hangup()

include => phones


В настройках LDK идем в программу 340, устанавливаем:
  1. DTMF Mode - RFC2833 DTMF 
  2. Jitter Buffer - 50
  3. VOIB Mode - H323
Ну и программа 324, в которой настраиваем сетевой план нумерации.


И в общем то, почти все прекрасно, кроме одного но.. Когда звонишь с астериска на LDK100, звонок проходит, а через 30 секунд обрывается.. Читал, что это довольно частая проблема. И вроде как решается отключением FASTSTART.
В PGM 340/341 на всех LG ставлю H.323 Mode = NORMAL вместо FAST. Туннелинг итак был выкючен.
В ooh323.conf также ставлю faststart=no
Выгружаю/загружаю модуль.. После этого звонок с астериск на LDK100 проходит, в трубке тишина, и через 30 секунд он все так же завершается )) С остальными АТС - все работает.
Как вариант, если я укажу в extensions.conf
exten => _4XX,1,Dial(OOH323/${EXTEN}@LDK300,60,tTr)
то звонки на номера LDK100 пойдут через LDK300.
Но, соответсвенно, получается нерациональное использование каналов...
у меня их всего, на каждой АТС под общение с другими АТС отдано по 6 штук (на LDK300 еще 6 отдано под Ip-телефоны) 
В общем, пока не разобрался, как заставить это все работать, но один человечек мне посоветовал поковыряться в исходниках драйвера OOH323, убрав там вызов DTMF Mode, т.к. эта проблема возникает на уровне взаимодействия астериска с этой старой платой VOIB при обмене RFC2833.
Вот дословно: "нужно убрать отправку RFC2833, в принципе по этому слову она и ищется"
Но до этого у меня еще руки не дошли =)

5 комментариев:

  1. Этот комментарий был удален автором.

    ОтветитьУдалить
  2. удалось ли вам решить проблему ?
    1 в 1 ситуация как у вас =\

    ОтветитьУдалить
    Ответы
    1. К сожалению, это были всего лишь эксперименты, которые так и не дошли до практического применения.
      Возможно я к ним еще вернусь, но пока не знаю, когда.
      Если у вас получится решить эту проблему - буду очень признателен, если поделитесь решением =)
      Можно поспрашивать на форуме арткома.

      Удалить
    2. Этот комментарий был удален автором.

      Удалить
  3. Лечение 30-ти сек. таймаута Asterisk H323 (костыль) :
    В драйвере ooh323c/src в исходниках ooh323ep.h меняем переменную :
    #define DEFAULT_TCS_TIMEOUT 30
    делаем
    #define DEFAULT_TCS_TIMEOUT 7200
    и компилим новый драйвер в котором все отрубается через 7200 сек.

    ОтветитьУдалить