» F.A.Q.

Подключение официально неподдерживаемых 3G-модемов к Android-девайсам. Часть 2: Порты, AT-команды и режимы работы модема

Как известно, ограничения на подключение различных моделей 3G-модемов в операционной системе Android чисто программные. В данной статье мы разберемся со всеми тонкостями и особенностями подключения модема к Android-устройству.

В предыдущей, первой статье данного цикла мы разобрались с общими понятиями подключения модемов к планшетам и электронным книгам на Android, и в чем кроется суть проблемы. Данная статья будет более практически-ориентирована. Давайте приступим.

Начнем мы с определения файлов устройств (порта) в ОС Android, через который будет работать модем. При подключении 3G-модема к планшету создаются соответствующие файлы устройств: ttyUSB или ttyACM. Заходим в установленный ранее эумулятор терминала и вводим команду:

            ls /dev/ttyUSB* (или, для некоторых устройств, — ls /dev/ttyACM*)

На экран будет выведен список, который имеет следующий вид:

app_46@android:/ $ export PATH=/data/local/bin:$PATH:.

app_46@android:/ $ ls /dev/ttyUSB*

/dev/ttyUSB0

/dev/ttyUSB1

/dev/ttyUSB2

app_46@android:/ $

Если таких файлов в системе найдено не было, то тогда придется проделывать некоторые другие манипуляции, о которых мы поговорим немного позже. Важно: к одной и той же шине USB устройства, помимо модема, могут быть подключены другие устройства. Тогда вышеописанную команду нужно выполнить до и после подключения 3G-модема, и определяем, какие порты появились. Номера портов могут изменяться, в зависимости от того, когда был подключен модем – до включения самого устройства или после, а также при сбоях в работе. Сейчас разберем случай, если всё обнаруживается, как надо.

Теперь из полученного списка нужно выделить порты, через которые отправляются AT-команды в модем, и через которые он соединяется с сетью. Для этого для каждого порта отправляем команду «AT» через терминал (подробнее, как это сделать, мы рассмотрим ниже). Если девайс отобразит на экране ответ «ОК», значит это именно тот порт, через который происходит связь с модемом. Запоминаем номер данного порта. Если ответа «ОК» не последовало, то переподключаем модем и снова отправляем команду «AT», уже в следующий порт, пока не получим подтверждающий ответ.

Нужный для соединения с сетью (PPP) порт можно определить, выполняя попытки подключения. Когда после команды «AT» получили ответ «ОК», в терминале вводим следующую команду:

echo «ATDT*99#» > /dev/ttyUSB0

Если после введенной команды модем выдал ответ «ОК» и «CONNECT», то это нужный нам PPPD порт. Важно! Если ранее подключение при помощи данного модема с данной SIM-картой на компьютере не проводилось, то предварительно вводим в терминале команду:

echo «AT+CGDCONT=1,»IP»,»apn.com»» > /dev/ttyUSB0

Где apn.com, соответственно, — точка доступа у вашего провайдера мобильного интернета. Вместо ttyUSB0 нужно ввести проверяемый порт. Изредка у операторов номер дозвона может быть не *99#, тогда команда ATDT будет отличаться.

Касательно отправки AT-команд модему. Делать это можно как из-под Android, так и из-под Windows на персональном компьютере. Сначала разберемся с отправкой AT-команд непосредственно с Android-устройства. Команды отправляются через терминал. Например, следующая команда отправляет команду «AT» в порт модему ttyUSB0:

cat /dev/ttyUSB0 &

echo AT > /dev/ttyUSB0

Команда cat /dev/ttyUSB0 & используется для того, чтобы увидеть на экране устройства ответ модема. После её использования, желательно остановить её командой killall cat («killall -9 cat» или «busybox killall cat»), или kill $PPID, где $PPID – это номер, который выводится терминалом справа от числа в квадратных скобках после использования команды cat. Также, вместо «cat /dev/ttyUSB0 &» допустимо использовать команды «tr -s «» < /dev/ttyUSB0 &» или «busybox tr -s «» < /dev/ttyUSB0 &»). Важно – после того, как работа с AT-командами завершена, обязательно нужно перезагрузить Android-устройство.

Теперь разберемся с отправкой AT-команд через компьютер с ОС Windows. Подключаем модем к компьютеру, устанавливаем программное обеспечение для модема, если оно не было установлено ранее. Закрываем программу для работы с модемом – это важно, можно перепроверить в трее. Далее потребуется любая Telnet-программа. Подойдет стандартный для Windows XP Hyper Terminal («Все программы» -> «Стандартные» -> «Связь»). Открываем панель управления, раздел «Система», смотрим «Диспетчер устройств», а именно раздел «Модемы». Открываем свойства подключенного нами модема. Во вкладке смотрим номер COM-порта, назначенного модему.

Теперь запускаем Hyper Terminal. Вводим название подключения – оно может быть любым, это не важно. Выбираем порт, который определили через панель управления. В свойствах порта можно изменить такие параметры как «Скорость» (на 115200 и «Управление потоком» (ставим «Нет»). Вводим команду «AT», ждём ответа «ОК». В случае, если вводимые символы не отображаются на экране, вводим команду «ATE1» и нажимаем Enter (вслепую). Можно также через меню «Файл», в «Свойствах» на вкладке «Параметры» нажать «Параметры ASCII» и поставить галку возле пункта «Отображать введенные символы на экране».

Всё, после проделанных действий можно вводить нужные AT-команды в терминал на компьютере и смотреть ответы на них.

Может понадобиться переключение режима модема, а также отключение автозагрузки и так называемого ZeroCD. Разберемся, что это такое, и как произвести отключение. Дело в том, что большая часть поставляемых на рынок 3G-модемов – это составные USB-устройства, то есть помимо непосредственно функции модема, они являются кард-ридерами, а также в них применяется технология ZeroCD. ZeroCD позволяет при первом подключении к персональному компьютеру подключать также и виртуальный CD-ROM с встроенной флэш-памяти. На данном накопителе находятся необходимые для работы устройства на Windows или других операционных системах драйвера. Обычно после завершения установки драйверов устройство самостоятельно переключается в режим USB-модема. Но, естественно, в случае с Android-планшетом всё не так просто. Чтобы проверить, в каком режиме в данный момент находится модем, нужно после его подключения и определения Android-девайсом в эмуляторе терминала ввести команду dmesg. Внизу выведенного на экран списка смотрим подобные строки:

<6>[   71.366413] option 2-1:1.0: GSM modem (1-port) converter detected

<6>[   71.379932] usb 2-1: GSM modem (1-port) converter now attached to ttyUSB0

<6>[   71.394260] option 2-1:1.1: GSM modem (1-port) converter detected

<6>[   71.402965] usb 2-1: GSM modem (1-port) converter now attached to ttyUSB1

<6>[   71.413425] option 2-1:1.3: GSM modem (1-port) converter detected

<6>[   71.422902] usb 2-1: GSM modem (1-port) converter now attached to ttyUSB2

Если такие строки есть, значит модем подключен в нужном нам режиме, а если нет, то проделываем следующие действия. Существует автоматическое и принудительное переключение режима работы с модемом. Отметим, что раньше UNIX-системы не поддерживали работу с USB-модемами, но это стало возможно благодаря программе usb_modeswitch, написанной Josua Dietze, за что ему отдельное спасибо. Так вот, чтобы проверить, установлена ли эта программа в системе нашего устройства, вводим в терминале команду:

usb_modeswitch

Если на экран выведена информация и краткая справка по этой программе – значит она уже есть в системе, если же нет, придется прибегнуть к принудительному переключению, но об этом позже. Проследить работу программы usb_modeswitch можно при помощи /system/bin/u3gmonitor. Для этого в терминале вводим u3gmonitor. После чего подключаем модем к устройству. Если переключение прошло успешно, то будут отображены подобные строки:

app_52@android:/ $ export PATH=/data/local/bin:$PATH

app_52@android:/ $ u3gmonitor

 

Reading config file: /system/etc/usb_modeswitch.d/19d2_2000

 

* usb_modeswitch: handle USB devices with multiple modes

* Version 1.2.0 © Josua Dietze 2011

* Based on libusb0 (0.1.12 and above)

 

! PLEASE REPORT NEW CONFIGURATIONS !

 

DefaultVendor= 0x19d2

DefaultProduct= 0x2000

TargetVendor= 0x19d2

TargetProduct= not set

TargetClass= not set

TargetProductList=»0001,0002,0015,0016,0017,0031,0037,0052,0055,0063,0064,0066,0091,0108,0117,

0128,2002″

 

DetachStorageOnly=0

HuaweiMode=0

SierraMode=0

SonyMode=0

QisdaMode=0

GCTMode=0

KobilMode=0

SequansMode=0

MobileActionMode=0

CiscoMode=0

MessageEndpoint= not set

MessageContent=»5553424312345678000000000000061e000000000000000000000000000000″

MessageContent2=»5553424312345679000000000000061b000000020000000000000000000000″

MessageContent3=»55534243123456702000000080000c85010101180101010101000000000000″

NeedResponse=1

ResponseEndpoint= not set

 

InquireDevice disabled

Success check enabled, max. wait time 20 seconds

System integration mode disabled

 

 

usb_set_debug: Setting debugging level to 15 (on)

usb_os_find_busses: Found 005

usb_os_find_busses: Found 004

usb_os_find_busses: Found 003

usb_os_find_busses: Found 002

usb_os_find_busses: Found 001

usb_os_find_devices: Couldn`t open /dev/bus/usb/005/001

usb_os_find_devices: Couldn`t open /dev/bus/usb/004/002

usb_os_find_devices: Couldn`t open /dev/bus/usb/004/001

usb_os_find_devices: Couldn`t open /dev/bus/usb/003/001

usb_os_find_devices: Couldn`t open /dev/bus/usb/002/002

usb_os_find_devices: Couldn`t open /dev/bus/usb/002/001

usb_os_find_devices: Couldn`t open /dev/bus/usb/001/001

Looking for target devices …

No devices in target mode or class found

Looking for default devices …

No devices in default mode found. Nothing to do. Bye.

 

/system/etc/usb_modeswitch.d/19d2_0031 does not exist.

 

На данном наглядном примере видно, что при переключении режима модем автоматически изменил идентификаторы VIP_PID со значения 19d2_2000 на 19d2_0031.

Но ранее при проверке строки с «GSM modem» не были отображены, а значит, скорее всего, нужный файл конфигурации отсутствет. И на экране будет видно намного более короткое сообщение, что-то вроде:

app_52@android:/ $ export PATH=/data/local/bin:$PATH

app_52@android:/ $ u3gmonitor

/system/etc/usb_modeswitch.d/19d2_2000 does not exist.

Где 19d2_2000 – это идентификатор модема, который состоит из двух частей: VID = 19d2 (код производителя, VendorID) и PID = 2000 (код продукта, ProductID), в режиме флэш-накопителя или виртуального CD-ROM.

Если программы u3gmonitor в системе нет, то определяем данные параметры через терминал, при помощи команды lsusb (busybox lsusb). Её необходимо исполнять до и после подключения модема – чтобы сравнить список подключенного оборудования. Например:

app_52@android:/ $ export PATH=/data/local/bin:$PATH

app_52@android:/ $ busybox lsusb

Bus 001 Device 001: ID 1d6b:0001

Bus 002 Device 001: ID 1d6b:0002

Bus 003 Device 001: ID 1d6b:0001

Bus 004 Device 001: ID 1d6b:0002

Bus 005 Device 001: ID 1d6b:0001

Bus 004 Device 002: ID 0bda:8176

app_52@android:/ $ busybox lsusb

Bus 001 Device 001: ID 1d6b:0001

Bus 002 Device 001: ID 1d6b:0002

Bus 003 Device 001: ID 1d6b:0001

Bus 004 Device 001: ID 1d6b:0002

Bus 005 Device 001: ID 1d6b:0001

Bus 004 Device 002: ID 0bda:8176

Bus 002 Device 003: ID 19d2:2000

app_52@android:/ $

 

В данном случае появилось устройство под названием «Bus 002 Device 003: ID 19d2:2000» — то, о чем шла речь немного раньше. Это модем в режиме виртуального CD.

Теперь нужно узнать соответствующие индикаторы после переключения из режима виртуального CD-ROM`а в режим, собственно, модема. Сделать это несложно – достаточно иметь под рукой персональный компьютер и установленные для модема драйвера. Подключаем модем к компьютеру, заходим в «Панель управления», далее «Система», где открываем «Диспетчер устройств». В разделе «Модемы» открываем свойства подключенного модема, во вкладке «Сведения» ищем в выпадающем списке «ИД оборудования», где и можно найти нужные идентификаторы VID и PID.

Далее следует создать файл конфигурации с именем 19d2_2000 (или другим, в зависимости от полученных идентификаторов). Лучше всего скопировать схожий по содержанию файл из директории /etc/usb_modeswitch.d (или /system/etc/usb_modeswitch.d), переименовать соответственно VID и PID, и поправить содержимое текстовым редактором (Notepad++ или AkelPad, например). Примечание: иногда искомый файл может находиться в папке /etc/ppp/setup/, и иметь название вроде E3131.setup.

Типичный файл конфигурации имеет следующий вид:

########################################################

# ZTE MF100 (Beeline RU)

 

DefaultVendor= 0x19d2

DefaultProduct=0x2000

 

TargetVendor= 0x19d2

TargetProduct= 0x0031

 

MessageContent=»5553424312345678000000000000061e000000000000000000000000000000″

MessageContent2=»5553424312345679000000000000061b000000020000000000000000000000″

 

NeedResponse=1

 

CheckSuccess=20

 

Конечно, бывают варианты, но в целом всё похоже. Теперь меняем значения. DefaultVender и DefaultProduct меняем на VID и PID виртуального CD-ROM соответственно. А TargetVendor и TargetProduct изменяем на VID и PID модема, которые мы ужзнали при подключении его к персональному компьютеру. MessageContent –шестнадцатеричный код. Переключается он режимом модема. После проделанных манипуляций с файлом, помещаем его в папку /etc/usb_modeswitch.d (/system/etc/usb_modeswitch.d) или же /etc/ppp/setup зависит это от конкретной модели устройства.

 

Теперь несколько слов о принудительном переключении. Осуществляется оно посыланием модему в его порт определенной AT-команды через терминал. Примерный список команд:

Huawei – переход в режим «только модем»: AT^U2DIAG=0

Переход в обычный режим: AT^U2DIAG=255

ZTE — переход в режим «только модем»: AT+ZCDRUN=8

Переход в обычный режим: AT+ZCDRUN=9

ZTE MF192, MF652 (процессор ICERA) переход в режим «только модем»: AT%USBMODEM=

В обычный: AT%USBMODEM=1

 

Важно! Команда AT+ZCDRUN=8 в модемах от компании ZTE удаляет флаг AUTORUN.FLG (или CD_STARTUP_FLAG) во встроенной файловой системе модема. То же самое можно сделать в Windows программой QPST с EFSExplorer. Или, например, с помощью плагина EFS (Embedded file system) для известного файлового менеджера Total Commander.

Если устройство в системе Android как модем не определяется, то соответственно не создаются файлы устройств, так что AT-команды отправлять не получится. Потому режим нужно переключать на «старшем брате» — персональном компьютере. О том, как посылать модему AT-команды, мы говорили немного выше.

Также есть готовые программы, которые автоматизировано выполняют те же действия – например 3G Modem Mode Switcher.

На этом пока всё. В следующей, последней статье данного цикла, мы поговорим, как донастроить модем для корректной работы с Android-устройством, а также о некоторых особенностях и тонкостях касательно данного вопроса.