После некоторых мучений и поисков, что чего и куда, решил написать статью для потомков о настройке модемов 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
[E1550_t](!)
[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
Для начала установим необходимые пакеты. Всё нижесказанное для системы 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
...
[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
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()
[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