SIP-GSM шлюз для Oktell на базе Asterisk

Asterisk LogoРасскажу о своем опыте создания SIP-GSM шлюза на базе Asterisk и подключение его к Oktell. У нас в офисе кроме сервера с установленным Oktell есть еще сервер для раздачи Интернета, на котором установлен Debian «Squeeze» Linux (Ubuntu тоже подойдет). Вот на нем и будем экспериментировать! 😉

1. Установка Asterisk
Мне нужна последняя стабильная версия Asterisk, та что имеется в репах не подходит.

mkdir ~/tmp && cd ~/tmp
aptitude install g++ libncurses-dev libxml2-dev subversion usb-modeswitch-data
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-1.6.2-current.tar.gz
tar xzvf asterisk-1.6.2-current.tar.gz
cd asterisk-1.6.2-current
./configure
make install
make config
make samples

Если до этого момента Вам еще не стало страшно, тогда продолжаем!

2. Установка модуля chan_datacard
Здесь все предельно просто:

cd ~/tmp
svn co http://www.makhutov.org/svn/chan_datacard/trunk/ chan_datacard
cd chan_datacard/
./configure
make install
cp etc/datacard.conf /etc/asterisk

3. USB модем HUAWEI E1550
На текущий момент chan_datacard поддерживает следующие модемы:
* Huawei K3715
* Huawei E169 / K3520
* Huawei E1550

У меня есть 2 модема Huawei E1550 — вот их и будем подключать. После подключения модемов в USB вы должны увидеть что-то такое:

ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB1  /dev/ttyUSB2  /dev/ttyUSB3  /dev/ttyUSB4  /dev/ttyUSB5

Теперь прописываем в настройках модуля /etc/asterisk/datacard.conf (мой файл):

[datacard0]
audio=/dev/ttyUSB1              ; tty for audio connection
data=/dev/ttyUSB2               ; tty for AT commands
context=datacard-incoming       ; context for incoming calls
group=1                         ; calling group
;rxgain=3                       ; increase the incoming volume
;txgain=3                       ; increase the outgoint volume

[datacard1]
context=datacard-incoming       ; context for incoming calls
audio=/dev/ttyUSB4              ; tty port for audio connection
data=/dev/ttyUSB5               ; tty port for AT commands
group=2                         ; calling group
;rxgain=10                      ; increase the incoming volume
;txgain=10                      ; increase the outgoint volume
autodeletesms=yes               ; auto delete incoming sms
resetdatacard=yes               ; reset datacard during initialization
u2diag=0                        ; set U2DIAG parameter (0 = disable everything except modem function)
usecallingpres=yes              ; use the caller ID presentation or not
callingpres=allowed_passed_screen ; set caller ID presentation
disablesms=yes                  ; chan_datacard has currently a bug with SMS reception. When a SMS gets in during a
                                ; call chan_datacard might crash. Enable this option to disable sms reception.
                                ; Default = no

Перезапускаем Asterisk и смотрим видит ли он модемы:

datacard show devices
datacard show devices

Если у Вас номер не определился, тогда самостоятельно его впишите в SIM карту:

wolf*CLI> datacard cmd datacard0 AT+CPBS=\"ON\"
wolf*CLI> datacard cmd datacard0 AT+CPBW=1,\"+38098ххххххх\",145
wolf*CLI> core restart now

4. Конфигурация Asterisk
Здесь каждый может прописать на свой вкус… Я напишу, как это у меня сделано.
Для подключения Oktell в файле /etc/asterisk/sip.conf:

allowguest=no                  ; Allow or reject guest calls (default is yes)

[oktell]
type=friend
host=10.10.10.1
dtmfmode=rfc2833
disallow=all
allow=ulaw
context=gsm-out

Все звонки с модемов должны попадать в Oktell, входящие SMS записываться в лог-файл, а исходящие звонки из Oktell (зависимо от оператора) выходить на нужный нам модем. Правим /etc/asterisk/extensions.conf:

[datacard-incoming]
exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD} - ${CALLERID(num)}: ${SMS}' >> /var/log/asterisk/sms.txt)
exten => sms,n,Hangup()

exten => ussd,1,Verbose(Incoming USSD: ${USSD})
exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD}: ${USSD}' >> /var/log/asterisk/ussd.txt)
exten => ussd,n,Hangup()

exten => s,1,Dial(SIP/oktell)
exten => s,n,Hangup()

[gsm-out]
exten => _067XXXXXXX,1,Dial(Datacard/datacard0/${EXTEN})
exten => _096XXXXXXX,1,Dial(Datacard/datacard0/${EXTEN})
exten => _097XXXXXXX,1,Dial(Datacard/datacard0/${EXTEN})
exten => _098XXXXXXX,1,Dial(Datacard/datacard0/${EXTEN})
exten => _091XXXXXXX,1,Dial(Datacard/datacard1/${EXTEN})
exten => _X.,1,Dial(Datacard/datacard1/${EXTEN})

5. Подключение Asterisk к Oktell
В карте сети нужно добавить внешний шлюз:

Прописываем нужную маршрутизацию в сценариях для выходя через эти внешние линии.
Все! Можно звонить:

25 комментариев on "SIP-GSM шлюз для Oktell на базе Asterisk"


  1. SMS приходят на вход 🙂

    2010-09-15 18:16:43: Увага!З 28.09.10 Ви зможете користуватись послугами WAP і WEB досту
    2010-09-15 18:16:46 — datacard0: пу в Інтернет та MMS без додаткових налаштувань!Деталі: 477*80* (бе
    2010-09-15 18:16:47 — datacard0: зкошт)


  2. Что могу сказать?

    Работа шлюза: up 6 days, 15:55

    Устройства сами не пропадают:
    root@wolf:~# ls /dev/ttyUSB*
    /dev/ttyUSB0 /dev/ttyUSB2 /dev/ttyUSB4
    /dev/ttyUSB1 /dev/ttyUSB3 /dev/ttyUSB5

    Все работает отлично! Будем доставлять модемы и увеличивать нагрузку…




  3. Уже 9 модемов (2 USB HUB) висит на одном *
    Есть проблема с перезагрузкой сервера: модемы частично поднимаються… А вот такого на Oktell SIP-GSM не наблюдалось (8 модемов)… Странно…



  4. Очень интересно… Сам как-то баловался…
    Вопрос:
    Что лучше и надежней при использовании модемов: Oktell sip gsm или Chan ?


  5. У меня уже около года использую оба варианта. Оба отлично работают с 1-2 модемами — это факт!
    Сейчас у меня с chan — 8 модемов. Проблема с перегрузкой сервера — произвольное присвоение девайсов ttyUSB, что приводит к нерабочей ситуации 🙁 Приходится во время перезагрузки стоять возле компа и по 1 втыкать модемы. Так же отваливаются модемы….
    На SIP-GSM тоже 8 модемов. Устройства назначаются одинаково сколько не перегружай. Модемы тоже отваливаются, но благо есть кнопка «Применить» или можно убить службу.


  6. Можно (и нужно) поиграться с udev-ом, чтобы по характеристикам модемов устройства назначать. Либо, как вариант, перед запуском астерикса пускать самодельный скрипт, который будет опрашивать модемы (читать номера), и создавать в каком-нибудь каталоге (например /var/modem/) симлинки с нужными именами. Астерикс перенастроить на использование этих симлинков — тогда проблемы при перезагрузке исчезнут.


  7. А еще, можно на номера начхать:

    Звонить по модему с указанным IMEI

    exten => _X.,1,Dial(Datacard/i:123456789012345/${EXTEN})

    Звонить по модему, с указанием провайдера, например:

    exten => _X.,1,Dial(Datacard/p:UA-KYIVSTAR/${EXTEN})


  8. А как можно сделать так, чтоб бы вместо callerid «asterisk» подставлялся номер звонящего?


  9. Ребята, подскажите, что сделать, если у меня 10 модемов и они отваливаются , если вставляешь больше 6шт одновременно?


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.