среда, 5 февраля 2014 г.

Бюджетный GSM шлюз для Asterisk 11



Что нам понадобится:

  1. ПК с развернутым Asterisk'ом, как установить описано в статье Установка Asterisk 11 из исходников на CentOS 6.5
  2. 3g модем Huawei E171,E1550. С другими может не работать.

Тестированные модемы:

  • E171 - ОК
  • E1550 - ОК
  • E150 - Голос только в одну сторону
  • E3131 - Работают не стабильно, при исходящих голос только в одну сторону
  • E352 - Нет голосовых функций 


Для работы с 3g модемами нам потребуется следующее:
usb-modeswitch - применяется в Unix системах для подключения устройств через USB интерфейс.
chan_dongle - модуль Asterisk для работы с 3g модемами.

Установим дополнительные пакеты, которые нам понадобятся:
yum install zip unzip usbutils libusb-devel tcl  autoconf automake
Перейдем в директорию
cd /tmp
Переходим на сайта http://repoforge.org/use/ и ищем подходящий репозитарий

Установим репозиторий
Для CentOS 6.5 x64:
rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
Для CentOS 6.5 x86:
rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686.rpm

Установим usb-modeswitch
yum install usb_modeswitch
Загрузим chan_dongle пропатченый под Asterisk 11
wget https://github.com/jstasiak/asterisk-chan-dongle/archive/asterisk11.zip
Распакуем
unzip asterisk11
Перейдем в директорию
cd asterisk-chan-dongle-asterisk11/
Выполним команды поочередно(если посыпятся ошибки, это нормально)
aclocal
autoconf
automake -a
./configure
make
make install
Скопируем файл настроек chan_dongle
cp etc/dongle.conf /etc/asterisk/
Скопируем сконфигурированный модуль chan_dongle
x64:
cp chan_dongle.so /usr/lib64/asterisk/modules/
x86:
cp chan_dongle.so /usr/lib/asterisk/modules/

Зайдем в Asterisk
asterisk -r
Инициализируем модуль chan_dongle
CLI> module load chan_dongle
Вставим модем в USB порт и выполним команду
lsusb
В ответе должны увидеть подобную строку для каждого вставленного модема
Bus 001 Device 003: ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem
Выполним команду
ls /dev/ | grep USB
Ответ для одного модема
ttyUSB0
ttyUSB1
ttyUSB2

Настроим chan_dongle
nano /etc/asterisk/dongle.conf
Приведем к виду:
[general]
interval=15                     ; Количество секунд между попытками подключения к устройствам
[defaults]
context=dongle-incoming                       ; контекст для входящих вызовов
rxgain=4                        ; увеличить громкость входящих; может быть отрицательным
txgain=4                        ; увеличить громкость исходящих; может быть отрицательным
usecallingpres=yes              ;использовать АОН
callwaiting=no          ; Ожидающие вызовы включены 'yes'
dtmf=relax
[GSM1]
;Для определения модема можно использовать 2 типа. Определение по imei предпочтительнее, ;тк после перезагрузки моде может инициализироваться как другой USB интерфейс.
;Нужное раскоментировать
;Определение по USB;audio=/dev/ttyUSB1 ; определить модем по USB устройству
;data=/dev/ttyUSB2 ; определить модем по USB устройству
;Определение по imei;imei=012345678901234 ; определить модем по imei
Настройка sip.conf ЗАМЕНИТЕ IP 192.168.1.1 И СЕТЬ 192.168.1.0/255.255.0.0 на свои
nano /etc/asterisk/sip.conf
Приведем к виду:
[general]
externip=192.168.1.1; внешний айпишник астериска, не важно его или гейта который прокидывает к нему порты, это внешний айпишник, адрес которого будут содержать пакеты идущие к астериску
externaddr=192.168.1.1; тоже самое
localnet=192.168.1.0/255.255.0.0; сеть, которую астериск будет считать внутренней и не устраивать сложные танцы с маскарадом для нее
nat=force_rport,comedia; необходимый режим работы если астериск за натом и к нему прокидываются порты
context=public; контекст, в который приходят звонки по умолчанию. важно чтобы тут был какой-то контекст в котором будет совершенно не определен план звонков, чтобы все звонки по умолчанию
allowguest=no; не принимать звонки неизвестно от кого.
[100] ;имя аккаунта
type=friend
host=dynamic
secret=SECRED ; пароль
context=default
canreinvite=yes
dtmfmode=rfc2833
permit=0.0.0.0/0.0.0.0
qualify=yes
Настройка extension.conf
nano /etc/asterisk/extensions.conf
Приведем к виду:
[globals]
[default]
exten => 100,n,Dial(SIP/100)
exten => _7X.,1,Dial(Dongle/GSM1/holdother:+${FILTER(0-9,${EXTEN})})
exten => _+7X.,1,Dial(Dongle/GSM1/holdother:+${FILTER(0-9,${EXTEN})})
exten => _8X.,1,Dial(Dongle/GSM2//holdother:+7${FILTER(0-9,${EXTEN:1})})
exten => _007X.,1,Dial(Dongle/GSM1/holdother:+7${FILTER(0-9,${EXTEN:3})})
exten => h,1,Hangup()
[dongle-incoming-sms]
exten => sms,1,Noop(Incoming SMS from ${CALLERID(num)} ${BASE64_DECODE(${SMS_BASE64})})
exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} — ${DONGLENAME} — ${CALLERID(num)}: ${BASE64_DECODE(${SMS_BASE64})}' >> /var/log/asterisk/sms.txt)
exten => sms,n,Hangup()
[dongle-incoming-ussd]
exten => ussd,1,Noop(Incoming USSD: ${BASE64_DECODE(${USSD_BASE64})})
exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} — ${DONGLENAME}: ${BASE64_DECODE(${USSD_BASE64})}' >> /var/log/asterisk/ussd.txt)
exten => ussd,n,Hangup()
[dongle-incoming]
include => dongle-incoming-sms
include => dongle-incoming-ussd
exten => s,1,Dial(SIP/100)
exten => s,n,Hangup()
Зайдем в Asterisk
asterisk -r
 Инициализируем применим наши настройки
CLI> sip reload
CLI> dialplan reload
CLI> dongle reload now

Проверим подключились модемы или нет
CLI> dongle show devices

Вывод:

Все теперь подключаемся к сип клиентом к Asterisk'у , например 3CX. И можем принимать и отправлять звонки.) Все входящие СМС и USSD складываются в /var/log/asterisk/ файлы sms.txt ussd.txt .

Комментариев нет:

Отправка комментария