17 авг. 2012 г.

Настройка модемов Huawei для работы с АТС Asterisk PBX

После некоторых мучений и поисков, что чего и куда, решил написать статью для потомков о настройке модемов Huawei для работы с АТС Asterisk.

Для начала установим необходимые пакеты. Всё нижесказанное для системы Debian. Для других дистрибутивов нужно будет подправить команды и возможно пути.

aptitude install asterisk-dev libusb libusb-dev subversion build-essential

Теперь идём на реальную вин-машину. Втыкаем туда нашего зверька, винда должна пошуршать дровами, затем надо установить из памяти устройства программульку U'manager. Она установит дрова именно на сам модем. Для верности, заходим в свойства в прожке и проверяем, виден ли наш модем.


Теперь скачиваем прожку для крякания модемчиков Хуявей тут Huawei_Modem_Unlocker.zip


Вначале слева делаем Check Status и жмякаем SERVICE, если в логе внизу покажет, что модем залочен, то делаем ему UNLOCK и независимо от этого обязательно делаем ENABLE VOICE - ну собсно чтобы он звонил :)

Далее втыкаем донгл в сервер и, если у вас Asterisk на виртуалке, то заходим в свойства виртуальной машины и пробрасываем ей девайс:


Если у вас такой картинки нету, то ковыряем настройки. Может быть, надо зайти в свойства хоста и сделать как на картинке (Advanced settings - Edit - отмечаем юсб хабы):


Когда вы так или иначе прикрутили модем к серверу Asterisk, проверим:

lsmod | grep usb
usb_wwan                8068  1 option
usbserial              27676  6 option,usb_wwan
usb_storage            40217  0
usbhid                 33292  0
hid                    63257  1 usbhid
usbcore               123122  8 option,usb_wwan,usbserial,usb_storage,usbhid,uhci_hcd,ehci_hcd
nls_base                6377  1 usbcore
scsi_mod              126725  9 usb_storage,vmw_pvscsi,sd_mod,sg,sr_mod,mptspi,mptscsih,scsi_transport_spi,libata


ls /dev/ | grep USB
ttyUSB0
ttyUSB1
ttyUSB2


Если у вас примерно похожее, то всё окей.

В некоторых случаях модем линуксом сразу не определяется. А определяется как cr-rom или какой-нибудь флеш... в общем, ttyUSB нема. В этой ситуации может помочь утилитка USB Mode Switch, которая с помощью манипуляций правилами udev делает то, что нам нужно :) Качаем ее с офф сайта (на Debian/Ubuntu она есть в репозиториях) http://www.draisberghof.de/usb_modeswitch/ затем распаковываем и компилируем. Не забываем установить утилиту tcl - без нее ругаться не будет, но и работать тоже... При следующем подключении модема, утилитка должна сработать и дать нам наши ttyUSB.

Теперь надо скачать для Asterisk-a модуль для работы с хуйвей модемами. Есть два варианта - модуль chan_datacard и chan_dongle. Мне вначале попался 1й и я заюзал его. Как оказалось, зря. Т. к. работало всё, кроме отправки USSD-запросов. А не знать свой баланс - пичалька. Потому ставить лучше 2й. Скачиваем последнюю версию с сайта http://code.google.com/p/asterisk-chan-dongle/downloads/list и компилим (предварительно сделав noload в modules.conf 1-му модулю, если он у вас уже есть):

wget http://asterisk-chan-dongle.googlecode.com/files/chan_dongle-1.1.r10.tgz

tar -xzvf chan_dongle-1.1.r10.tgz 
cd chan_dongle-1.1.r10/
./configure 
make
make install
ls /usr/lib/asterisk/modules
cp etc/dongle.conf /etc/asterisk/
nano /etc/asterisk/dongle.conf

В конфиге прописываем параметры для нашего модемчика. Для моего Huawei E173 это выглядело так:
...
[defaults]
...
rxgain=4
txgain=4
...
[dongle0]
audio=/dev/ttyUSB1              ; tty port for audio connection;        no default value
data=/dev/ttyUSB2               ; tty port for AT commands;             no default value


Причем, номера ttyUSBх могут отличаться для разных модемов - находям, если что, методом "тыка". А строки с усилением звука - потому что слишком низкий уровень звука по-умолчанию был у меня.

Далее, в папке etc, которая находится там, куда вы распаковали исходники модуля есть файл extensions.conf, в котором примеры чего и как прописывать в диалплан.

Если мы в /etc/asterisk/dongle.conf ничего явно не указали, то входящий вызов по-умолч. приходит в секцию [dongle-incoming].

Там я прописал :


include => dongle-incoming-sms
include => dongle-incoming-ussd

exten => s,n,Goto(incoming,s,1)

1е 2 строчки нужны для приема SMS и USSD-запросов. А 3я перекидывает вызов в стандартную секцию для входящих звонков моего диалплана. Содержимое инклюдов взял из гугла:


[dongle-incoming-ussd]
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()

[dongle-incoming-sms]
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 => _7.,1,Dial(Dongle/dongle0/+${EXTEN})
exten => _0.,1,Dial(Dongle/dongle0/${EXTEN})

1-я строчка - для звонков в Россию. 2-я - для звонков на мобильные номера по Украине (я нахожусь в Украине - соотв., для других стран может быть по-другому здесь).

Дальше. Я так и не понял, как посылать USSD-запросы через диалплан (т. е. тупо набирая в SIP-телефоне). Но, через CLI Asterisk'a это делается просто:

asterisk -rx dongle ussd dongle0 *111#

Где dongle0 - как вы обозвали своё устройство в конфиге, а за ним сам запрос. Если в диаплане у вас прописана обработка USSD так же, как и у меня, то результаты запросов будут дописываться в файл /var/log/asterisk/ussd.txt.

Я написал скрипт на Python, который проверяет балланс через эту команду и отсылает результат на меил. Но о нем я напишу в другой статье.

входящие SMS сохраняются автоматом в файле /var/log/asterisk/sms.txt, если вы прописали как я.

З. Ы. Для тех, кто по каким-либо причинам решит юзать модуль chan_datacard, приведу кратко настройку его.

svn checkout http://chan-datacard.googlecode.com/svn/trunk/ chan-datacard-read-only
cd chan-datacard-read-only/
./configure 
make install
cp etc/datacard.conf /etc/asterisk/datacard.conf
nano /etc/asterisk/datacard.conf

[E1550_t](!)
context=incoming-datacard       ; context for incoming calls
rxgain=3                        ; increase the incoming volume
txgain=-3                       ; 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)

[datacard0](E1550_t)
context=incoming-datacard
audio=/dev/ttyUSB1              ; tty for audio connection
data=/dev/ttyUSB2               ; tty for AT commands
group=1                         ; calling group

Диалплан:

[incoming-datacard]
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,Goto(succ-incoming,s,1)
exten => s,n,Hangup()

[outgoing]
exten => _0.,1,Dial(Datacard/datacard0/${EXTEN})

UPD:

Last chan_dongle url - https://asterisk-chan-dongle.googlecode.com/files/chan_dongle-1.1.r14.tgz

Полезные команды в Asterisk CLI:

dongle show device settings dongle0 - показывает все настройки для модема

UPD2:
Как выяснилось чуть позже, операторы не разрешают использовать свои обычные симки в GSM-гейтвеях или вот таких вот модемах (который по сути - дешевый GSM-гейт). Для того, чтобы оператор не заблокировал SIM-карточкУ, необходимо перейти на корпоративный тариф, разрешающий использование гейта (обычно тариф дороже обычных). О переходе и тарифе можете узнать у свогео ОПсоСа.

UPD3:
Обычный chan_dongle переехал на github: https://github.com/bg111/asterisk-chan-dongle (работает только с Asterisk 1.6, 1.8).
Форк для работы с Asterisk 11: https://github.com/jstasiak/asterisk-chan-dongle/
Форк для работы с Asterisk 13: https://github.com/oleg-krv/asterisk-chan-dongle