Программирование USB в Android. Используем для связи интерфейс USB::Журнал СА 6.2014
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Наука и технологии
Подписка
Где купить
Авторам
Рекламодателям
Магазин
Архив номеров
Вакансии
Контакты
   

  Опросы

Какие курсы вы бы выбрали для себя?  

Очные
Онлайновые
Платные
Бесплатные
Я и так все знаю

 Читать далее...

1001 и 1 книга  
20.12.2019г.
Просмотров: 4293
Комментарии: 0
Dr.Web: всё под контролем

 Читать далее...

04.12.2019г.
Просмотров: 5619
Комментарии: 0
Особенности сертификаций по этичному хакингу

 Читать далее...

28.05.2019г.
Просмотров: 6853
Комментарии: 2
Анализ вредоносных программ

 Читать далее...

28.05.2019г.
Просмотров: 7253
Комментарии: 1
Микросервисы и контейнеры Docker

 Читать далее...

28.05.2019г.
Просмотров: 6326
Комментарии: 0
Django 2 в примерах

 Читать далее...

Друзья сайта  

Форум системных администраторов  

sysadmins.ru

 Программирование USB в Android. Используем для связи интерфейс USB

Архив номеров / 2014 / Выпуск №6 (139) / Программирование USB в Android. Используем для связи интерфейс USB

Рубрика: Разработка /  Инструменты

Сергей Ильичев СЕРГЕЙ ИЛЬИЧЕВ, ЧОУ «ТПКГ», г. Тула, системный администратор и учитель информатики, sergil68@mail.ru

Программирование USB в Android
Используем для связи интерфейс USB

Попытаемся разобраться в том, как организовать обмен информацией между различными (в том числе и самостоятельно разработанными) электронными устройствами и аппаратами (планшетами или телефонами), работающими под управлением операционной системы (ОС) Android с использованием USB

Для того чтобы не запутать читателя, в статье первые будут называться просто «устройства», а вторые – «мобильные устройства».

Данная статья адресована прежде всего тем, у кого есть какое-либо электронное устройство (разработанное самостоятельно или кем-то еще), протокол обмена данными с которым хорошо известен (например, уже есть программа, работающая с этим устройством в ОС Windows/Linux), и хотелось бы иметь программу, работающую с ним еще и в Android.

USB и Android

Уже сравнительно давно, начиная с Android Honeycomb (версия 3.1), в ОС от Google появилась возможность использовать мобильное устройство в режиме хоста (Host mode), в котором оно питает шину и может определять подключенные устройства с помощью прикладного программного интерфейса (API) на языке Java (см. [1] и рис. 1).

Рисунок 1. Иллюстрация работы Android-устройства в режимах USB Host и Accessory (рисунок с сайта http://developer.android.com)

Рисунок 1. Иллюстрация работы Android-устройства в режимах USB Host и Accessory (рисунок с сайта http://developer.android.com)

Устройство, работающее в хост-режиме, является инициатором передачи данных и управляет процессом обмена информацией по каналу связи.

USB Host API появился в Android в середине 2011 года, однако информации по его использованию на русском языке в сети до сих пор очень мало. Интерес к этому вопросу подогревает наличие на рынке мобильных устройств, на которых работает этот API, стоимостью менее 3000 руб. (см., например, тестирование в [2]).

Отметим, что USB – не единственный способ связи с тем же самодельным устройством. Android позволяет использовать еще Bluetooth, NFC, Wi-Fi P2P, SIP, а также стандартное сетевое подключение [3]. Так что в арсенале разработчика достаточно возможностей для осуществления своих самых смелых замыслов.

Другим распространенным вариантом связи с различными устройствами до сих пор является использование переходника USB-COM. Материал в сети по применению переходника USB-COM в Android есть – см., например, [4]. Популярность такого подключения обусловлена наличием большого количества уже разработанных с использованием различных микроконтроллеров устройств, связь с которыми осуществляется с помощью COM-порта (последовательного порта), что 10 лет назад являлось почти стандартным способом передать данные от компьютера к самодельной железке.

В сравнении с COM-портом использование USB позволяет существенно повысить скорость передачи данных и сделать этот процесс удобным для пользователя. Cкорость передачи, которая даже в случае низкоскоростных устройств (клавиатуры, мыши, джойстики) составляет 10-1500 Кбит/c, простота и невысокая стоимость кабельной системы и подключений, самоидентификация устройств с автоматическим конфигурированием, скрытие подробностей электрического подключения от конечного пользователя (плюс возможность отключения кабеля без выключения устройств), контроль ошибок и их восстановление на уровне протокола – вот неоспоримые преимущества данной технологии (см. [4], с. 12).

Вообще, говоря об использовании USB для передачи данных, не лишним будет упомянуть книгу П.Агурова «Интерфейс USB» [5].

Она, хотя часто и критикуется в сети и выпущена последний раз в 2006 году, не раз помогла найти верное решение при поиске информации по различным аспектам применения этой технологии. В книге рассмотрены вопросы от выбора микросхемы и схемотехники для контроллера до написания программы микроконтроллера и примеров программирования передачи данных по протоколу USB со стороны компьютера.

Нельзя не указать и первоисточник данных по этому вопросу – сайт некоммерческой организации USB IF (USB Implementers Forum), занимающейся разработкой спецификаций этого интерфейса [6], правда, данный материал на английском языке. Однако именно там вы найдете исчерпывающие сведения об устройстве интерфейса USB. Есть неплохой перевод частей спецификации [7]. Интересующимся программными решениями со стороны микроконтроллера также можно посмотреть ссылку [8].

Немного о классах USB-устройств

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

Привести примеры программ связи для всех типов USB-устройств в рамках одной статьи по понятным причинам невозможно (начальные сведения о программировании различных типов устройств можно почерпнуть в [5]). Однако мы ограничимся тем, что приведем код, реализующий поиск нужного устройства и доступ к его контрольным точкам для обмена информацией.

Также разберем отправку данных на примере одного из типов USB-устройств, а именно класса устройств HID (human interface device – класс устройств для взаимодействия с человеком). Этот класс включает в себя «медленные» устройства, такие как клавиатура, мышь, джойстик, и примеров его реализации с помощью различных микроконтроллеров в сети достаточно (есть, например, и в [8]).

Почему именно класс HID так полюбился изготовителям различных самодельных устройств? Процитируем Википедию [9]: «Помимо детальных спецификаций классических устройств ввода (типа клавиатур и мышек), стандарт HID определяет особый класс устройств без детальных спецификаций. Этот класс именуется USB HID Consumer Control и представляет собой, по сути, нерегламентированный канал связи с устройством.

При этом устройство пользуется теми же стандартными для операционной системы драйверами, что и мышка с клавиатурой. Таким образом, можно создать USB-устройство, которое не требует создания и инсталляции специальных драйверов в большинстве распространенных компьютерных операционных систем». Остается добавить только, что работает эта спецификация и в ОС Android (не исключая прошивок CyanogenMod).

Одним из вариантов обмена данными с HID-устройством является передача по прерываниям (interrupt transfer), которая используется в том случае, когда необходимо передать пакеты данных небольшого размера (максимальный размер пакета зависит от скорости передачи и составляет от 64 до 1024 байт) через заданный временной интервал. Пакет для передачи называется репортом (англ. – report, см. [5], с. 71, 95).

Такой длины репорта обычно вполне хватает для обмена информацией с самодельным устройством. Например, 64 байта информации в одном пакете – это довольно много для контроллера, ведь для передачи состояний светодиода или простейшего датчика достаточно 1 бита информации.

Необходимые инструменты

Итак, нам понадобятся планшет или телефон с Android-версией не ниже 3.1. Здесь необходимо отметить, что вышеуказанный USB Host API полностью реализован не на всех мобильных устройствах (об этом упоминается и на сайтеdeveloper.android.com [1].

В некоторых планшетах/телефонах разъем USB используется только для зарядки и связи с персональным компьютером. Еще раз отправлю читателя к списку мобильных устройств, пригодных или непригодных для наших опытов [2].

Понадобятся также какое-либо USB-устройство (для первых опытов будет достаточно обычного USB-флеш-накопителя), переходник OTG (On-The-Go – см. рис. 2) и/или шнур USB для связи с устройством. В Википедии по поводу OTG говорится: «При подключении через USB OTG ранг устройства (ведущий или ведомый) определяется наличием или отсутствием перемычки между контактами 4 и 5 в штекере соединительного кабеля. В USB OTG-кабеле такая перемычка устанавливается лишь в одном из двух разъемов [10]». Соответственно нам необходима такая перемычка со стороны мобильного устройства.

Рисунок 2. Различия в схеме обычного USB-кабеля и OTG-кабеля (рисунок с сайта tech.firstpost.com)

Рисунок 2. Различия в схеме обычного USB-кабеля и OTG-кабеля (рисунок с сайта tech.firstpost.com)

Неплохим подспорьем в работе будет также программа USB Device Info, установленная из хранилища Google Play Market. Программа умеет определять подключенные к USB-разъему планшета/телефона устройства как с помощью Java API, так и с помощью ядра Linux. То есть если ваше устройство не определилось с помощью Java USB Host API в USB Device Info, то с большой вероятностью тщетно будет использовать для этого мобильного устройства какую-либо (в том числе и свою) Android-программу, написанную с помощью Java и USB Host API.

Иногда очень полезной бывает информация, выводимая командой lsusb операционной системы Linux. С ключами -v и -d lsusb выводит о USB-устройстве все, или почти все, что необходимо разработчику программного обеспечения для устройств этого класса.

Далее необходим компьютер с установленным Android SDK и интегрированной средой разработки (IDE) Eclipse с плагином ADT (хотя можно обойтись и только SDK). Как создать и установить приложение для Android, можно посмотреть, например, в [11, 12] или в сети Интернет. Ну и, конечно, необходимо хотя бы минимальное знание языка программирования Java, а также желание добиться результата, без него никак!

Отмечу, что на выяснение некоторых технических вопросов применения USB в Android автору потребовались недели кропотливого поиска информации.

Статью целиком читайте в журнале «Системный администратор», №6 за 2014 г. на страницах 70-74.

PDF-версию данного номера можно приобрести в нашем магазине.


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-41
Fax: (499) 277-12-45
E-mail: sa@samag.ru