USB андроид

В недавней статье на Geektimes в комментариях возник вопрос о поддержке в ОС Android периферии, подключенной к шине USB. Действительно, большинство вендорского ПО, к примеру, для работы с принтерами и МФУ, поддерживает только подключение по сети. Однако это не означает, что в самой ОС Android нет такой возможности — это означает лишь то, что большинство устройств не имеют полноценного USB хоста, и далеко не все имеют поддержку OTG. По сети же могут работать абсолютно все без исключения.
Большинство устройств на Android при наличии порта OTG поддерживают на уровне системы (ядра Linux или стандартных компонентов Android) следующие классы устройств:

  • Устройства ввода — клавиатуры, мыши, джойстики (HID)
  • Накопители (Mass Storage)

Несколько реже:

  • Сотовые модемы
  • Сетевые адаптеры
  • Вебкамеры

Хабы поддерживаются при наличии полноценных хост-портов, но не поддерживаются на портах OTG.
Подробнее список устройств, поддерживаемых на уровне ядра Linux, можно получить в sysfs:
$ ls /sys/bus/usb/drivers

Если же модуль в принципе доступен в исходниках ядра Linux, но не включен в Android — не стоит рассчитывать на то, что его получится собрать и расставить на все целевые системы.
Однако, начиная с Android 3.1 (API 12), в системе содержатся средства, достаточные для поддержки на уровне приложения любой USB периферии. Данные средства описаны в разделе USB Host руководства по Android API. Здесь же я хочу привести примеры реальной работы с некоторыми видами устройств.

Права доступа

Как и для прочих действий, Android требует, чтобы приложение получило разрешение на доступ к USB периферии. Существует 2 способа получить такое разрешение:

  • Задекларировать список устройств в AndroidManifest
  • Явно показать пользователю диалог «разрешить”

Поскольку для моих задач лишние вопросы к пользователю были нежелательны, я использовал первый способ.
Итак, нам необходимо добавить в манифест следующее:

<activity ...>... <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> </intent-filter> <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" /></activity><uses-feature android:name="android.hardware.usb.host" /><uses-sdk android:minSdkVersion="12" />

А в res/xml/device_filter.xml вписать следующее:

<?xml version="1.0" encoding="utf-8"?><resources> <!-- Serial converters --> <!-- 0x0403 / 0x6001: FTDI FT232R UART --> <usb-device vendor-id="1027" product-id="24577" /> <!-- … more devices … --></resources>

Отмечу, что хотя общепринято указывать VID:PID в 16-ричной системе счисления, здесь они должны быть указаны в десятичной. В документации заявляется, что возможно указание только класса, без VID и PID, но у меня это не стало работать.

Принтеры

На примере принтера я покажу, как непосредственно использовать API android.hardware.usb. На уровне передачи данных все принтеры поддерживают стандартый класс USB устройств:

int UsbConstants.USB_CLASS_PRINTER = 7;

Класс предельно простой. В рамках этого класса устройство должно поддерживать:

  • Обязательный bulk out endpoind для отправки данных на принтер
  • Опциональный bulk in endpoind для получения статуса принтера
  • 3 управляющих запроса

int GET_DEVICE_ID = 0;int GET_PORT_STATUS = 1;int SOFT_RESET = 2;

Код, приведенный ниже, предоставляет функциональность, аналогичную устройству /dev/usb/lp в Linux. Далее нам нужен фильтр, преобразующий исходный документ в пакет данных, понятный конкретной модели принтера. Но это тема иной статьи. Как один из вариантов — можно собрать ghostscript с помощью NDK.
Для работы с устройством нам в первую очередь нужно:
1. Найти устройство. В примере для простоты я ищу первый попавшийся:

UsbDevice findDevice() { for (UsbDevice usbDevice: mUsbManager.getDeviceList().values()) { if (usbDevice.getDeviceClass() == UsbConstants.USB_CLASS_PRINTER) { return usbDevice; } else { UsbInterface usbInterface = findInterface(usbDevice); if (usbInterface != null) return usbDevice; } } return null;}UsbInterface findInterface(UsbDevice usbDevice) { for (int nIf = 0; nIf < usbDevice.getInterfaceCount(); nIf++) { UsbInterface usbInterface = usbDevice.getInterface(nIf); if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_PRINTER) { return usbInterface; } } return null;}UsbDevice mUsbDevice = findDevice();UsbInterface mUsbInterface = findInterface(mUsbDevice);

2. Получить endpoint’ы:

for (int nEp = 0; nEp < mUsbInterface.getEndpointCount(); nEp++) { UsbEndpoint tmpEndpoint = mUsbInterface.getEndpoint(nEp); if (tmpEndpoint.getType() != UsbConstants.USB_ENDPOINT_XFER_BULK) continue; if ((mOutEndpoint == null) && (tmpEndpoint.getDirection() == UsbConstants.USB_DIR_OUT)) { mOutEndpoint = tmpEndpoint; } else if ((mInEndpoint == null) && (tmpEndpoint.getDirection() == UsbConstants.USB_DIR_IN)) { mInEndpoint = tmpEndpoint; }}if (mOutEndpoint == null) throw new IOException("No write endpoint: " + deviceName);

3. Непосредсвенно открыть устройство:

mConnection = mUsbManager.openDevice(mUsbDevice);if (mConnection == null) throw new IOException("Can't open USB connection:" + deviceName);mConnection.claimInterface (mUsbInterface, true);

4. После этого мы можем читать и писать в устройство:

public int read(final byte data) throws IOException { int size = Math.min(data.length, mInEndpoint.getMaxPacketSize()); return mConnection.bulkTransfer(mInEndpoint, data, size, getReadTimeout());}public int write(final byte data, final int length) throws IOException { int offset = 0; while (offset < length) { int size = Math.min(length - offset, mInEndpoint.getMaxPacketSize()); int bytesWritten = mConnection.bulkTransfer(mOutEndpoint, Arrays.copyOfRange(data, offset, offset + size), size, getWriteTimeout()); if (bytesWritten <= 0) throw new IOException("None written"); offset += bytesWritten; } return offset;}

5. По завершении работы — закрыть устройство:

mConnection.close();

Преобразователи USB-Serial

В отличие от притеров, преобразователи USB-Serial гораздо менее стандартизированы. Существует несколько распространенных чипов, для которых существенно отличается установка параметров последовательного порта — битрейта, чётности и проч. К счастью, есть библиотека github.com/mik3y/usb-serial-for-android, поддерживающая практически все существующие чипы. Библиотека полностью скрывает USB API, сводя все необходимые действия к минимуму вызовов с минимумом параметров.
1. Найти и открыть устройство:

UsbSerialPort mUsbSerialPort;UsbManager mUsbManager = (UsbManager) DEVICE.getSystemService(Context.USB_SERVICE);String type = "FTDI”;for (UsbDevice usbDevice: mUsbManager.getDeviceList().values()) { UsbSerialDriver usbSerialDriver = UsbSerialProber.probeSingleDevice(usbDevice); if (usbSerialDriver == null) continue; if (!type.equals(usbSerialDriver.getShortDeviceName())) continue; mUsbSerialPort = usbSerialDriver.getPort(0); mUsbSerialPort.open(mUsbManager); break;}

2. Установить параметры последовательного порта:

mUsbSerialPort.setParameters(baudRate, dataBits, stopBits, parity);

3. Читать и писать в порт:

public int read(final byte data) throws IOException { return mUsbSerialPort.read(data, getReadTimeout());}public int write(final byte data, final int length) throws IOException { return mUsbSerialPort.write(data, length, getWriteTimeout());}

4. По завершении работы — закрыть порт:

mUsbSerialPort.close();

Резюме

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

Программы для Android, которые полезны для работы с шиной USB.

1. USB Host Diagnostics site:play.google.com.

Программа определяет возможности Android как хоста USB — позволяет ли аппаратура и версия операционной системы работать с устройствами USB. Приложение бесплатное.

Android-USB-Host-Diagnostics

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

Например, для Galaxy Nexus сообщалось (в том числе и в магазине приложений Google), что он поддерживает USB host, но на самом деле хост не работал (это было исправлено в обновлении Android 4.0.2). Это привело к неработоспособности некоторых программ.

Это только один пример из множества. Также бывают случаи, когда поставщики OEM декларируют поддержку USB хост, но аппарат на самом деле эту функцию не предоставляет. Это случается, когда поддержка хоста USB не была протестирована компанией Google, или когда OEM поспешил с выпуском новой прошивки для модели Android.

Это приложение было создано для того, чтобы иметь возможность самостоятельно протестировать функцию хоста USB, и не зависеть от Google или от поставщиков OEM. Разработчик программы предлагает пользователям передать (с соглашения пользователя) результаты тестирования на сайт программы, чтобы расширить информационную базу данных для устройств и прошивок Android касательно поддержки хоста USB. Программа может также оказаться полезной при портировании прошивок Anroid на различное железо.

Требования к Android:

— Версия Android 2.3.1 или более новая.
— (не обязательно) права Root
— Наличие кабеля USB OTG cable (если конечно в Вашем устройстве Android отсутствует полноразмерный порт USB).
— Флешка USB или любое другое устройство USB — чтобы протестировать соединение с ним.

База данных результатов тестирования доступна здесь: http://usbhost.chainfire.eu/
Конференция разработчиков XDA здесь: http://forum.xda-developers.com/showthread.php?t=1493325

2. USB Device Info site:play.google.com.

Начиная с версии Android 3.1 представлена поддержка режима хоста USB, которая позволяет пользователю подключить к смартфону или планшету Android различные устройства USB точно так же, как их подключают к обычному компьютеру или ноутбуку, чтобы расширить функционал. Это приложение предоставляет информацию почти обо всех подключенных к Android устройствах USB (см. ниже о том, что подразумевается под ‘почти’). Программа бесплатна, и предоставляет доступ к исходному коду (проект можно скомпилировать в Eclipse/ADT или Android Studio).

Android-USB-device-info1 Android-USB-device-info2 Android-USB-device-info3 Android-USB-device-info4

Информация об устройствах USB включает в себя:

• Класс устройства USB.
• Путь к устройству USB в операционной системе Android.
• Числовой идентификатор производителя (Vendor ID, VID), и числовой идентификатор продукта (Product ID, PID).
• Список всех интерфейсов и всех конечных точек устройства.

Если после установки программы Вы закачаете базу данных об устройствах, то приложение также может предоставить дополнительную информацию о производителе/вендоре (Vendor, причем необязательно, что это будет известный бренд!), логотип вендора и имя продукта.

Для сбора информации об устройстве USB приложение использует 2 разных метода:

1. Режим Android, в котором для получения информации используется обычный программный интерфейс для USB, предоставленный и описанный Google (native android USB API).
2. Режим Linux, в котором делается парсинг папки /sys/bus/usb/devices/.

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

Приложение было написано с целью исследования нового USB host API и его тонкостей.

• База данных устройств USB: http://www.linux-usb.org/usb.ids
• Все логотипы компаний-производителей устройств USB являются их собственностью.
• В программе отсутствует реклама и она бесплатна.
• Исходный код программы доступен: https://github.com/alt236/USB-Device-Info—Android

3. USB device data site:play.google.com.

Программа выводит список всех устройств USB, которые подключены в настоящий момент к Android.

Android-USB-device-data1 Android-USB-device-data2 Android-USB-device-data3

4. Read iManufacturer and iProduct of USB Device from raw Device Descriptors.

Программа демонстрирует получение списка устройств USB, подключенных к Android. Для каждого устройства может быть прочитан список интерфейсов и список конечных точек с дополнительной информацией. Программа поставляется в виде исходного кода и его описания на сайте, и может служить хорошим пособием для изучения программирования устройств USB на платформе Android.

AndroidUSBHost-read-raw-descriptors-USD-device-android-er.blogspot.ru

1. Как сделать для смартфона Android кабель microUSB OTG.

USB-накопители удобны, но вы не можете использовать один с вашим телефоном. Ну, если у вас нет телефона Android и вы не знаете, что такое USB OTG.

USB On-The-Go (OTG) — это стандартизированная спецификация, которая позволяет устройству считывать данные с устройства USB без использования ПК. Устройство в основном становится хостом USB, что не есть у каждого гаджета.

С этим вы можете многое сделать. Например, вы можете подключить флэш-накопитель USB к телефону или использовать контроллер видеоигры с устройством Android.

,

USB OTG не является особенностью Android. Но поскольку это наиболее популярное использование, мы сосредоточимся на использовании его с Android.

Проверьте, поддерживает ли ваш Android USB OTG

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

Другой простой способ — использовать приложение для проверки USB OTG. В магазине Google Play есть множество таких бесплатных приложений, но некоторые загружены рекламой. Easy OTG Checker является надежным приложением для этого. Скачайте и запустите его, и вы узнаете, поддерживает ли ваш телефон USB OTG.

Не каждое устройство Android поддерживает USB OTG; это то, что производитель должен включить. Если вы обнаружите, что ваш телефон не совместим, когда вы используете USB OTG Checker, это, к сожалению, не будет работать для вас.

Что нужно для использования USB OTG

Ваше устройство Android имеет стандартный порт micro-USB или USB-C (наше руководство по USB-кабелям). Однако большинству USB-устройств требуется полноразмерный USB-порт. Вы можете решить это с помощью конвертера / адаптера.

В частности, ищите micro-USB или USB-C (в зависимости от того, что использует ваш телефон) мужчина на полноразмерный USB женский пол адаптер — эти мужские и женские обозначения имеют важное значение. Amazon предлагает множество таких адаптеров, например, популярный адаптер Anker USB-C-USB.

Играть с контроллерами видеоигр

Android Pie и новее изначально поддерживают контроллер Xbox One. Но старый контроллер Xbox 360 также работает с устройствами Android через USB OTG. Это просто, как подключи и играй, чтобы начать игру с контроллером. Конечно, вам нужно играть в игры, совместимые с контроллером.

Если у вас есть root-устройство Android, вы также можете подключить контроллеры PlayStation. При этом вы можете подключить контроллер PS2 и превратить ваше Android-устройство в ретро игровой центр!

Управление Android с помощью клавиатуры и мыши

Открытая природа Android позволяет легко подключаться практически ко всему. Если вы хотите использовать свой планшет в качестве ноутбука

клавиатура и мышь являются неотъемлемой частью опыта. Вам будет приятно узнать, что Android хорошо работает с большинством беспроводных и проводных клавиатур и мышей.

Мы рекомендуем приобрести беспроводную клавиатуру и мышь с унифицированным приемником, поскольку у вас есть только одно доступное USB-соединение. Я не видел функционирующего USB-концентратора, работающего через USB OTG.

Вы должны купить стандартный беспроводной набор Plug-and-Play, который совместим со всеми платформами. Тем не менее, убедитесь, что вы не покупаете что-то, что требует сопутствующего программного обеспечения, например, некоторые устройства Logitech, которым требуется программное обеспечение SetPoint.

Как отмечено в нашем подробном руководстве по подключению USB-клавиатуры к устройствам Android

ОС по умолчанию имеет значение QWERTY. Вам понадобится специальное приложение для клавиатуры для других макетов, таких как Colemak или DVORAK.

Печать напрямую с принтера

Как и клавиатуры, принтеры со стандартным подключаемым USB-интерфейсом хорошо работают на устройствах Android. Они позволяют начать печать, не требуя беспроводного соединения или необходимости что-либо передавать на ПК.

Android не поддерживает режим USB Mass Storage в течение некоторого времени. Таким образом, если вы хотите распечатать фотографии и документы, вам потребуется использовать режимы PTP или MTP для подключения USB.

Конечно, легче, если ваш принтер поддерживает Wi-Fi. Если этого не произойдет, возможно, пришло время перейти на один из лучших принтеров для дома и небольших офисов.

,

Управляйте своей зеркальной камерой

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

,

Вам понадобится приложение DSLR Controller и в идеале камера Canon. Он работает с некоторыми камерами Nikon и Sony, но они официально не поддерживаются. Это огромные 8 долларов за приложение, но весьма полезные для энтузиастов владельцев DSLR.

Другой большой Android USB

Изучение USB OTG и его многократного использования открывает множество новых приемов для устройств Android. Фактически, если у вас лежит старый Android-планшет или телефон, одно из приложений USB OTG, приведенное выше, может дать ему новую жизнь.

Помимо OTG, на Android есть еще одна функция USB, о которой вы должны знать. Если вы еще не знаете об этом, прочтите об отладке Android USB и узнайте, почему это здорово

,

С помощью технологии OTG (расшифровывается как On The Go) вы можете подключать к своему смартфону различные устройства. Например, вы можете подключить мышку или карту памяти. И то, и другое должно работать, но только при условии, что смартфон поддерживает OTG. К счастью, эту технологию поддерживают почти все современные сенсорные устройства. Вопрос — как пользоваться OTG, как включить эту функцию?

А никак ее не надо включать, просто подключите устройство к смартфону. Для этого вам понадобится кабель OTG. В нашем примере — micro USB, но в продаже есть и версии USB Type-C. Вот наш:

Берем смартфон, одной стороной к нему подключаем OTG-кабель, а к другой стороне кабеля — устройство. Пусть будет карта памяти для примера.

OTG поддерживается устройством — на экране сразу же видим такое сообщение:

Открываем любой файловый менеджер, видим карту памяти.

Открываем ее, после чего работаем с файлами на флешке — проще некуда.

Видеоинструкция

А что, если нужно подключить другое устройство, например, мышку? Действуете точно также, только вместо флешки подключаете мышку.

Курсор появляется через секунду после подключения мыши.

Вот так просто работает OTG.

USB OTG File Manager для NexusПриложение USB OTG File Manager на АндроидПриложение для работы с флешкой на Android

USB OTG File Manager для Nexus позволяет открывать и копировать файлы с любого USB запоминающего устройства с файловой системой FAT32 или NTFS, используя USB OTG порт. Вы можете копировать файлы на любое запоминающее устройство и управлять ими: редактировать имена файлов, добавлять каталоги и удалять файлы.

Вы также можете управлять своими файлами во внутренней памяти устройства. Приложение разрабатывалось для Nexus устройств, у которых есть порт «OnTheGo». Но также возможна работа на любом устройстве с OTG портом USB и Android 4.0+

Инструкция

  • 1. устанавливаем программу USB OTG File Manager.
  • 2. подключаем флешку к своему устройству через OTG кабель.
  • 3. разрешаем приложению стать по умолчанию для открывания флешек.
  • 4. нажимаем в программе CONNECT и ждем соединения.
  • 5. пользуемся программой…
  • 6. перед выходом из программы нажимаем специальную кнопку отключения (смотрим скрин).

Доп. информация

  • 1. при подключении и первом запуске разрешаем приложению стать по умолчанию для открывания флешек.
  • 2. с файловой системой FAT32 доступно чтение и запись. С файловой системой NTFS доступно только чтение.
  • 3. поддерживается открытие файлов непосредственно с устройства USB.
  • 4. приложение может предложить поставить дополнительно для проигрывания музыки Simple Music Player. Ставить или нет — решать вам. Я не ставил.
  • 5. приложения имеет расширенный режим (Advanced Mode) для продвинутых. Если вы не уверенны в своих действиях, то используйте обычный ружим (Normal Mode).
  • 6. приложение не передает и не принимает никаких данных из интернета, что хорошо.

Скачать приложение для работы с флешкой — USB OTG File Manager for Nexus на Андроид вы можете по ссылке ниже.

Разработчик: KyuuDrod
Платформа: Android 4.0 и выше
Язык интерфейса: Русский (RUS)
Состояние: Full (Полная версия)
Root: Не нужен

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *