Для сегодняшнего занятия нам понадобятся аммиачная селитра, алюминиевая пудра и немножко тротила GSM-модем широко известной в узких кругах фирмы Huawei, а также компьютер с линуксом (и USB-портом, чтоб этот свисток воткнуть), и некоторое количество широко распространённого программного обеспечения, включённого в большинство современных дистрибутивов (usb_modeswitch, minicom и asterisk).
Поехали.
1. GSM-модем в виде USB-свистка обычно добывается у вашего мобильного оператора в составе пакета для доступа в интернет. Или у какого-нибудь другого. МТС их когда-то продавал по 750 рублей. Мой оператор сейчас раздаёт по 10 евро. Прежде чем покупать, убедитесь, что конкретная модель поддерживает не только передачу данных, но и голосовые функции. Достоверно известно, что, например, E1550 и E173 это умеют (хотя для этого их надо чуточку доработать напильником).
2. Где взять компьютер с линуксом, сами придумаете, не маленькие.
3. Втыкаем свисток (можно пока без SIM-карты) в USB-порт. И.. вместо USB-модема с удивлением обнаруживаем всего-навсего новый CD-ROM (и, возможно, MicroSD-считыватель).
kernel: scsi 8:0:0:0: CD-ROM HUAWEI Mass Storage 2.31 PQ: 0 ANSI: 2 kernel: scsi 9:0:0:0: Direct-Access HUAWEI SD Storage 2.31 PQ: 0 ANSI: 2
На CD-ROM’е находятся драйвера для Windows. После установки они должны включить в свистке дополнительные устройства для обмена данными. В других операционных системах они нафиг не нужны, и в принципе можно даже отключить этот виртуальный CD-ROM командой AT^U2DIAG с соответствующим параметром.
В линуксе для этого применяется usb_modeswitch. Если его нет, поставьте соответствующий пакет. Если у вас относительно свежий дистрибутив, то, возможно, usb-modeswitch у вас уже установлен и сконфигурирован, и он всё это сделает самостоятельно, и вы сразу получите свой ttyUSB.
Если нет, запустите lsusb, посмотрите на идентификатор производителя и устройства, который выглядит примерно так:
Bus 002 Device 008: ID 12d1:140c Huawei Technologies Co., Ltd.
и введите соответствующее заклинание. Для многих моделей заклинания уже написаны в файлах с соответствующими названиями, поэтому достаточно просто указать маршрут к файлу:
# usb_modeswitch -c /etc/usb_modeswitch.d/12d1:1446
Looking for target devices ...
No devices in target mode or class found
Looking for default devices ...
Found default devices (1)
Accessing device 007 on bus 002 ...
Using endpoints 0x01 (out) and 0x81 (in)
Inquiring device details; driver will be detached ...
Looking for active driver ...
OK, driver found ("usb-storage")
OK, driver "usb-storage" detached
SCSI inquiry data (for identification)
-------------------------
Vendor String: HUAWEI
Model String: Mass Storage
Revision String: 2.31
-------------------------
USB description data (for identification)
-------------------------
Manufacturer: HUAWEI Technology
Product: HUAWEI Mobile
Serial No.: not provided
-------------------------
Setting up communication with interface 0 ...
Trying to send the message to endpoint 0x01 ...
OK, message successfully sent
Device is gone, skipping any further commands
Checking for mode switch (max. 20 times, once per second) ...
Original device is gone already, not checking
Searching for target devices ...
Searching for target devices ...
Searching for target devices ...
Searching for target devices ...
Searching for target devices ...
Found correct target device
Mode switch succeeded. Bye.
Ну или то же самое вручную:
# usb_modeswitch -v 0x12d1 -p 0x1446 -M 55534243123456780000000000000011060000000000000000000000000000
После этого ядро должно обнаружить новые устройства:
kernel: usbserial: USB Serial Driver core kernel: USB Serial support registered for GSM modem (1-port) kernel: option 2-2:1.0: GSM modem (1-port) converter detected kernel: usb 2-2: GSM modem (1-port) converter now attached to ttyUSB0 kernel: option 2-2:1.1: GSM modem (1-port) converter detected kernel: usb 2-2: GSM modem (1-port) converter now attached to ttyUSB1 kernel: option 2-2:1.2: GSM modem (1-port) converter detected kernel: usb 2-2: GSM modem (1-port) converter now attached to ttyUSB2 kernel: option 2-2:1.3: GSM modem (1-port) converter detected kernel: usb 2-2: GSM modem (1-port) converter now attached to ttyUSB3
Эту процедуру надо проводить каждый раз после включения питания у модема, поэтому лучше приделать её через udev, если пакет usb-modeswitch в вашем дистрибутиве не делает этого самостоятельно. В убунте, например, делает.
Теперь у вас в системе есть 4 устройства /dev/ttyUSB[0-3], первое из которых (/dev/ttyUSB0) эмулирует обычный модем. Четвёртое тоже эмулирует модем, но ещё самопроизвольно выдаёт информацию о текущем состоянии и уровне сигнала. Через второе устройство передаются голосовые данные, а зачем нужно третье, я сам не знаю. Короче, через первое устройство можно модемом немножко порулить, чем мы и займёмся.
4. Запускаем minicom -s, заходим в Serial port setup, указываем там порт /dev/ttyUSB0. Скорость не важна, это на самом деле не последовательный порт, а его эмуляция через USB.
Первым делом уточняем модель модема:
ATI Manufacturer: huawei Model: E173 Revision: 11.126.85.00.00 IMEI: 860051012****** +GCAP: +CGSM,+DS,+ES OK
И проверяем,поддерживает ли он голосовые функции:
AT^CVOICE? ^CVOICE:0,8000,16,20 OK
Вопреки человеческой логике режим 0 означает, что голосовые функции включены, а 1 — выключены. В данном случае они включены, 8000 — частота дискретизации (8kHz), 16 — размер сэмпла (16 бит), что такое 20 — не знаю. Возможно, идентификатор кодека. На самом деле, там используется какая-то разновидность PCM.
Если модем показал режим 1, попробуйте активировать голосовые функции командой AT^CVOICE=0 и проверьте, что получилось, командой AT^CVOICE?.
Если не получилось, или модем на все команды говорит ERROR или COMMAND NOT SUPPORT то вам не повезло, ищите другой модем.
5. Заодно можно проверить, не залочен ли модем на оператора.
AT^CARDLOCK? ^CARDLOCK: 2,9,0 OK
Первое число, равное 1, означает, что модем залочен, 2 — не залочен. Привязка к оператору снимается командой AT^CARDLOCK="секретный код". Секретный код вычисляется из IMEI, например, тут или тут.
6. Отключаем на SIM-карте запрос PIN-кода, если он там включён.
Сначала вводим команду AT+CPIN?.
Если в ответ модем сказал READY, значит запрос пина отключён (или вы его уже ввели). Если он сказал SIM PIN, значит он ожидает ввода пина. Если он сказал SIM PUK, значит вы много раз ввели неправильный PIN, и теперь надо вводить уже PUK.
Введите PIN с помощью команды AT+CPIN=ваш_пин и убедитесь, что модем ответил OK. После этого команда AT+CPIN? уже точно должна вернуть READY.
Теперь вводим команду AT+CLCK="SC",2. Если модем ответил 0, то запрос PIN-кода уже выключён, больше ничего делать не надо. Если 1, то запрос включен, и его надо выключить командой AT+CLCK="SC",0,"ваш_пин".
И проверить, точно ли он выключился: AT+CLCK="SC",2.
(Если что, обратно запрос включается командой AT+CLCK="SC",1,"ваш_пин").
7. С железкой разобрались, ставим Asterisk. К нему понадобится дополнительный модуль для работы с GSM-модемами Huawei (chan_dongle). Но в основную поставку Asterisk’а он не включён, его придётся собирать из исходников. Для этого, кроме собственно Asterisk’а, надо установить пакет для разработки (asterisk-dev).
Однако chan_dongle под некоторые устаревшие версии Asterisk’а может не собираться. С 1.6.2, например, не собрался. В этом случае придётся и сам Asterisk собрать из более свежих исходников. Текущая версия (1.8.11-cert2) собралась без вопросов, и chan_dongle с ней — тоже.
8. Создаём конфигурационный файл для chan_dongle (dongle.conf) в /etc/asterisk/ (или где у вас хранятся конфигурационные файлы):
[general] ; общие параметры драйвера
interval=15
[defaults] ; это настройки по умолчанию для всех модемов, далее они могут быть переопределены для конкретных модемов
context=dongle-incoming ; контекст для входящих вызовов, SMS и USSD
group=0 ; calling group
rxgain=0 ; усиление громкости входящего звука (может быть отрицательным)
txgain=0 ; усиление громкости исходящего звука (может быть отрицательным)
resetdongle=yes ; выполнить сброс модема путём посылки команды ATZ
u2diag=-1 ; параметр для команды переключения режима устройства путём посылки команды ^U2DIAG
; 0: отключить всё, кроме модема; -1: не посылать команду ^U2DIAG
usecallingpres=yes ; use the caller ID presentation or not
callingpres=allowed_passed_screen ; set caller ID presentation. By default use default network settings
; see http://www.the-asterisk-book.com/unstable/applikationen-setcallerpres.html
disablesms=yes ; отключить приём SMS. Они нас пока не интересуют
language=en ; set channel default language
disable=no ; yes полностью отключит конфигурацию этого устройства
[dongle0] ; параметры для конкретного модема
; здесь можно просто указать IMEI и/или IMSI модема, остальное драйвер найдёт сам
imei=860051012******
;imsi=612849384756451
В extensions.conf вписываем соответствующий контекст:
[dongle-incoming] exten => s,1,Playback(demo-echotest) exten => s,2,Echo exten => s,3,Playback(demo-echodone)
Подробную информацию о директивах драйвера см. на http://wiki.e1550.mobi/doku.php?id=configuration
9. Запускаем # asterisk -vvvc. После того, как вся отладочная информация о процессе загрузки астериска проедет, и появится приглашение *CLI>, можно проверить, успешно ли подключился модем:
*CLI> dongle show devices ID Group State RSSI Mode Submode Provider Name Model Firmware IMEI IMSI Number dongle0 0 Free 8 0 0 ****** E173 11.126.85.00.00 8600510******** 2720305******** **********
Список поддерживаемых драйвером команд можно получить, введя core show help dongle. Например, dongle show device settings и dongle show device state.
10. Теперь можно позвонить в модем с обычного телефона. Если всё настроено правильно (включая валидацию SIM-карты и деньги на счету), то Asterisk должен показать принятый звонок, а звонящему должен проиграться звуковой файл с описанием работы Asterisk’а, после чего всё сказанное звонящим будет воспроизводиться ему обратно в режиме эха с небольшой задержкой.
11. Далее можно настраивать dialplan по вкусу, но это уже выходит за рамки данного маленького руководства.
Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.
no subject
no subject
Вообще я это писал сам себе на память, ну и может ещё кому пригодится.
no subject
no subject