Расскажу о своем опыте создания 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 и смотрим видит ли он модемы:
Если у Вас номер не определился, тогда самостоятельно его впишите в 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
В карте сети нужно добавить внешний шлюз:
Прописываем нужную маршрутизацию в сценариях для выходя через эти внешние линии.
Все! Можно звонить:
SMS приходят на вход 🙂
Скажите, насколько стабильно данное решение?
Пока тестирую… Уже 3 сутки без подвисаний и перезагрузок!
Наблюдаю дальше… Как только зависнет — отпишусь 😉
Как себя ведут модемы на Астериске? 🙂
Что могу сказать?
Работа шлюза: up 6 days, 15:55
Устройства сами не пропадают:
root@wolf:~# ls /dev/ttyUSB*
/dev/ttyUSB0 /dev/ttyUSB2 /dev/ttyUSB4
/dev/ttyUSB1 /dev/ttyUSB3 /dev/ttyUSB5
Все работает отлично! Будем доставлять модемы и увеличивать нагрузку…
USB порты на которые подключены модемы находятся на хабе?
Да, на таком же хабе: http://vk.it-sfera.com.ua/496.html
В одинаковых условиях 😉
Хорошая новость. А сколько ампер на выходе блока питания этого хаба? 0,5А*7=3,5А — я прав?
На блоке питания написано: 5V, 200mA
Permalink
Уже количество модемов увеличил до 6!
Разобрался как отправлять и принимать SMS и USSD…
Я так понимаю, работа стабильная? Модемы планово перезагружаете?
За все это время ничего не перегружал! Разве что рестратнул службу Asterisk когда добавил в конфиг новые модемы…
Permalink
Уже 9 модемов (2 USB HUB) висит на одном *
Есть проблема с перезагрузкой сервера: модемы частично поднимаються… А вот такого на Oktell SIP-GSM не наблюдалось (8 модемов)… Странно…
Permalink
Очень интересно… Сам как-то баловался…
Вопрос:
Что лучше и надежней при использовании модемов: Oktell sip gsm или Chan ?
У меня уже около года использую оба варианта. Оба отлично работают с 1-2 модемами — это факт!
Сейчас у меня с chan — 8 модемов. Проблема с перегрузкой сервера — произвольное присвоение девайсов ttyUSB, что приводит к нерабочей ситуации 🙁 Приходится во время перезагрузки стоять возле компа и по 1 втыкать модемы. Так же отваливаются модемы….
На SIP-GSM тоже 8 модемов. Устройства назначаются одинаково сколько не перегружай. Модемы тоже отваливаются, но благо есть кнопка «Применить» или можно убить службу.
Можно (и нужно) поиграться с udev-ом, чтобы по характеристикам модемов устройства назначать. Либо, как вариант, перед запуском астерикса пускать самодельный скрипт, который будет опрашивать модемы (читать номера), и создавать в каком-нибудь каталоге (например /var/modem/) симлинки с нужными именами. Астерикс перенастроить на использование этих симлинков — тогда проблемы при перезагрузке исчезнут.
А еще, можно на номера начхать:
Звонить по модему с указанным IMEI
exten => _X.,1,Dial(Datacard/i:123456789012345/${EXTEN})
Звонить по модему, с указанием провайдера, например:
exten => _X.,1,Dial(Datacard/p:UA-KYIVSTAR/${EXTEN})
А как можно сделать так, чтоб бы вместо callerid «asterisk» подставлялся номер звонящего?
Параметры аппаратуры — Использовать в качестве callerid
Спасибо, я нашел способ сделать это через IVR
Ребята, подскажите, что сделать, если у меня 10 модемов и они отваливаются , если вставляешь больше 6шт одновременно?
Permalink