- Работа с устройствами USB в Android
- Права доступа
- Принтеры
- Преобразователи USB-Serial
- Резюме
- ТОП 10 Самых популярных Micro USB — USB кабелей для Android устройств из Китая с Алиэкспресс
- 1. USB — Micro USB кабель UGREEN
- 2. USB — Micro USB кабель TOPK
- 3. USB — Micro USB кабель SUNTAIHO
- 4. USB — Micro USB кабель BASEUS
- 5. USB — Micro USB кабель USAMS
- 6. USB — Micro USB кабель UGREEN
- 7. USB — Micro USB кабель GOLF
- 8. USB — Micro USB кабель JELLICO
- 9. USB — Micro USB кабель UGREEN
- 10. USB — Micro USB кабель VENTION
- Работаем с USB Custom HID на Android
- Теория. Максимально коротко
- Подальше от железа, поближе к Android
- Заключение
Работа с устройствами USB в Android
В недавней статье на 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
- Явно показать пользователю диалог “разрешить”
Поскольку для моих задач лишние вопросы к пользователю были нежелательны, я использовал первый способ.
Итак, нам необходимо добавить в манифест следующее:
А в res/xml/device_filter.xml вписать следующее:
Отмечу, что хотя общепринято указывать VID:PID в 16-ричной системе счисления, здесь они должны быть указаны в десятичной. В документации заявляется, что возможно указание только класса, без VID и PID, но у меня это не стало работать.
Принтеры
На примере принтера я покажу, как непосредственно использовать API android.hardware.usb. На уровне передачи данных все принтеры поддерживают стандартый класс USB устройств:
Класс предельно простой. В рамках этого класса устройство должно поддерживать:
- Обязательный bulk out endpoind для отправки данных на принтер
- Опциональный bulk in endpoind для получения статуса принтера
- 3 управляющих запроса
Код, приведенный ниже, предоставляет функциональность, аналогичную устройству /dev/usb/lp в Linux. Далее нам нужен фильтр, преобразующий исходный документ в пакет данных, понятный конкретной модели принтера. Но это тема иной статьи. Как один из вариантов — можно собрать ghostscript с помощью NDK.
Для работы с устройством нам в первую очередь нужно:
1. Найти устройство. В примере для простоты я ищу первый попавшийся:
2. Получить endpoint’ы:
3. Непосредсвенно открыть устройство:
4. После этого мы можем читать и писать в устройство:
5. По завершении работы — закрыть устройство:
Преобразователи USB-Serial
В отличие от притеров, преобразователи USB-Serial гораздо менее стандартизированы. Существует несколько распространенных чипов, для которых существенно отличается установка параметров последовательного порта — битрейта, чётности и проч. К счастью, есть библиотека github.com/mik3y/usb-serial-for-android, поддерживающая практически все существующие чипы. Библиотека полностью скрывает USB API, сводя все необходимые действия к минимуму вызовов с минимумом параметров.
1. Найти и открыть устройство:
2. Установить параметры последовательного порта:
3. Читать и писать в порт:
4. По завершении работы — закрыть порт:
Резюме
Надеюсь, что мне удалось показать, что работа с USB периферией достаточно проста и логична. Безусловно, реализация протоколов некоторых конкретных устройств не блещет простотой — но это проявится в любой системе в одинаковой степени.
Все приведенные примеры я взял из реального проекта, лишь исключил очевидные проверки, оставив только ключевые строки.
Источник
ТОП 10 Самых популярных Micro USB — USB кабелей для Android устройств из Китая с Алиэкспресс
Привет друзья! Сегодня посмотрим на 10 самых популярных/покупаемых кабелей для зарядки ваших гаджетов стандарта Micro USB в Китае, на момент создания этого ТОПа, а именно на сайте Алиэкспресс. Ну что, поехали!
1. USB — Micro USB кабель UGREEN
Это самый популярный/покупаемый Micro USB кабель на Алиэкспресс. Купили его 70797 раз и оставили 37105 отзывов, 96% из которых положительные и нет ни одного отзыва на 1, 2 или 3 звезды. Подавляющее большинство покупателей кабелем абсолютно довольны. Кабель идет в нейлоновой оплетке, длиной от 25см до 3 метров. На выбор предоставляется 4 цвета. Кабель поддерживает быструю зарядку стандарта Quick Charge 3.0. Заявленная пропускная способность до 480Mbps. При производстве кабеля используется экранированный бескислородный медный проводник, имеется защитная резиновая прослойка, покрытая плетеным нейлоном, продлевающим срок службы кабеля и позолоченные контакты. В зависимости от варианта исполнения за кабель придется отдать от 87 до 281 рубля.
2. USB — Micro USB кабель TOPK
Это второй по популярности Micro USB кабель на Алиэкспресс. Его купили 52303 раза и оставили 18691 отзыв, 94% из которых на 5 звезд и ни одного отзыва на 1, 2 или 3 звезды. Данный кабель также имеет нейлоновую оплетку, что продлит срок эксплуатации кабеля и предотвратит его скручивание в узел. Производитель заявляет, что контакты устойчивы к окислению, но про позолоту ни слова. Из отзывов: “Кабель добротный, 2 Ампера пропускает, насчёт большего не могу сказать! Нейлоновая оболочка хорошего качества. Позолота возможно настоящая))) но это не точно.” Также нет информации о пропускной способности и поддержки быстрой зарядки, вернее указано, что быстрая зарядка поддерживается, но не указано какого стандарта и не понятно, что производитель подразумевает под быстрой зарядкой. При заказе можно выбрать один из четырех цветов и длину кабеля от 50 см до 2 метров.
3. USB — Micro USB кабель SUNTAIHO
Это также нейлоновый кабель, с поддержкой быстрой зарядки стандарта Quick Charge 3.0 и пропускной способностью до 480Mbps. Этот кабель можно заказать как из Москвы, так и из Китая. Стоимость кабеля от 59 до 223 рублей в зависимости от длины и цвета, доступно на выбор 7 цветовых оформлений и длина от 25 см до 3 метров. Купили этот кабель 39956 раз и оставили 22239 отзыва, 93% из которых на 5 звезд и только 1% на 1 звезду.
4. USB — Micro USB кабель BASEUS
Отличительной особенностью данного кабеля является то, что разъем у него реверсивный, то есть его можно подключать к устройству, не боясь перепутать верх с низом, если обычный Micro USB коннектор вверх ногами не подключить к устройству, то этот можно. Кабель имеет защиту от излома на выходе из коннекторов, покрыт нейлоновой оплеткой, держит ток до 2,4 ампера при 5 Вольт и имеет пропускную способность до 480Mbps. На выбор имеется три цвета и три варианта длины кабеля: 0.5, 1 и 2 метра. Цена кабеля варьируется от 126 до 211 рублей. Купили этот кабель 38074 раза и оставили 16188 отзывов, 95% из которых на 5 звезд и ни одного отзыва на 1 или 2 звезды.
5. USB — Micro USB кабель USAMS
Кабель изолирован термопластичным эластомером, максимальный ток 2 Ампера. На выбор предоставляется 5 цветов и 3 варианта длины: 60, 120 и 200 см. Стоимость кабеля от 77 до 140 рублей. Купили его 37020 раз и оставили при этом 15385 отзывов, 93% из которых на 5 звезд и ни одного отзыва на 1 или 2 звезды. Из отзывов: “Всё работает! Продавец очень общительный, рекомендую. 5*****. Продавец отличный, рекомендую. Почта России посылку два месяца по России гоняла! Продавец всё время был на связи! Покупаю не первый товар в этом магазине-ещё не подводил. )))))”
6. USB — Micro USB кабель UGREEN
И снова кабель от бренда UGREEN. По большому счету это тот же кабель, который был под номером один, только без нейлоновой оплетки. Кабель предлагается в четырех цветовых решениях и длиной от 25 см до 3 метров. Стоимость, от выбранного кабеля, варьируется от 95 до 259 рублей. Кабель купили 29174 раза и оставили 16423 отзыва, 95% из которых на 5 звезд и ни одного отзыва на 1 или 2 звезды.
7. USB — Micro USB кабель GOLF
Обычный недорогой кабель, покрытый нейлоновой оплеткой. Но в отличии от того же UGREEN не имеет позолоченных контактов и экранирования, соответственно можно предположить, что срок службы у него будет ниже и передача данные явно меньше, хотя в отзывах кабель нахваливают, но без каких-либо тестов и замеров. На выбор есть 6 цветов и длина от 25 см до 3 метров. Стоимость от 70 до 237 рублей. Купили этот шнур 26028 раз и оставили 13530 отзывов, 92% из которых на 5 звезд и 1% на 1 звезду.
8. USB — Micro USB кабель JELLICO
Очередной бюджетный, но весьма популярный кабель от бренда JELLICO. Кабель можно приобрести как в нейлоновой оплетке, так и без. Контакты не имеют позолоты, про экранирование так же ни слова, отсутствие которых может негативно сказаться на пропускной способности и сроке эксплуатации кабеля. Информация о пропускной способности и точных данных о токовых характеристиках на странице продавца отсутствует. Кабель предлагается в трех цветовых решениях и длиной 1 или 2 метра. Стоимость от 35 до 140 рублей. Был куплен 24228 раз и оставлено 5141 отзыв, 91% из которых на 5 звезд и 1% на 1 звезду.
9. USB — Micro USB кабель UGREEN
И снова UGREEN. И снова все те же характеристики: пропускная способность до 480Mbps, поддержка быстрой зарядки Quick Charge 3.0, максимальный ток до 2,4 Ампера, позолоченные контакты и т.д. В общем такой же кабель, что и предыдущие от этого бренда, только немного измененный дизайн. Кабель не имеет нейлоновой оплетки, предлагается 2 цвета исполнения, и длина от 25 см до 3 метров. Стоимость варьируется от 94 до 273 рублей. Купили этот кабель 19019 раз и оставили 11186 отзывов, 97% из которых на 5 звезд и ни одного отзыва на 1, 2 или 3 звезды.
10. USB — Micro USB кабель VENTION
И 10-ый по популярности Micro USB кабель на Алиэкспресс, это кабель от бренда Vention. Это довольно популярный бренд в Китае, производящий качественные кабели и различные аксессуары. Кабель имеет никелированные контакты, пропускную способность до 480Mbps, и экранирование. Кабель предлагается как с круглым сечением, так и плоской формой, предлагается 3 цветовых решения и длина от 25 см до 3 метров. Цена от 88 до 218 рублей. Купили кабель 16969 раз и оставили 11773 отзыва, 94% из которых на 5 звезд и 1% на 1 звезду.
Это были самые популярные/покупаемые USB — Micro USB кабели на Алиэкспрессе, не факт что они лучшие, но зато самые популярные, возможно среднестатистический покупатель ищет золотую середину между ценой и качеством. Был ли у вас опыт приобретения этих или других Micro USB кабелей в Китае? Если да, то пишите в комментариях свой отзыв, возможно именно ваш комментарий/отзыв поможет читателям сделать верный выбор и не выкинуть деньги на ветер!
Источник
Работаем с USB Custom HID на Android
В современных Android — приложениях для взаимодействия с другими устройствами чаще всего используются беспроводные протоколы передачи данных, как например Bluetooth. В годы, когда часть устройств имеют беспроводную зарядку, сложно представить себе связку Android устройства и периферийного модуля, в которой необходимо использование проводных интерфейсов. Однако когда такая необходимость возникает, на ум сразу же приходит USB.
Давайте разберем с вами гипотетический кейс. Представьте, что к вам приходит заказчик и говорит: “Мне нужно Android приложение для управления устройством сбора данных и вывода этих самых данных на экран. Есть одно НО — приложение надо написать на одноплатный компьютер с операционной системой Android, а периферийное устройство подключено по USB”
Звучит фантастически, но и такое иногда случается. И тут как нельзя кстати пригодится глубокое знание USB стека и его протоколов, но данная статья не об этом. В данной статье мы рассмотрим, как управлять периферийным устройством по протоколу USB Custom HID с Android устройства. Для простоты напишем Android-приложение (HOST), которое будет управлять светодиодом на периферийным устройством (DEVICE) и получать состояние кнопки (нажатия). Код для периферийной платы приводить не буду, кому интересно — пишите в комментариях.
Итак, приступим.
Теория. Максимально коротко
Для начала немного теории, максимально коротко. Это упрощенный минимум, достаточный для понимания кода, но для большего понимания советую ознакомиться с этим ресурсом.
Для общения по USB на периферийном устройстве необходимо реализовать интерфейс взаимодействия. Разные функции (например, USB HID, USB Mass Strorage или USB CDC) будут реализовывать свои интерфейсы, а некоторые будут иметь несколько интерфейсов. Каждый интерфейс содержит в себе конечные точки — специальные каналы связи, своего рода буферы обмена.
На моем периферийном устройстве реализован Custom HID с одним интерфейсом и с двумя конечными точками, одной для приёма, другой для передачи. Обычно информация с существующими на устройстве интерфейсами и конечными точками написана в спецификации на устройство, в противном случае определить их можно через специальные программы, к примеру USBlyzer.
Устройства в USB HID общаются через репорты. Что такое репорты? Так как данные передаются через конечные точки, то нам надо как-то идентифицировать, а также распарсить в соответствие с протоколом. Устройства не просто кидают друг другу байты данных, а обмениваются пакетами, имеющими четко определенную структуру, которая описывается на устройстве в специальном дескрипторе репорта. Таким образом, по дескриптору репорта, мы можем точно определить, какой идентификатор, структуру, размер и частоту передачи имеют те или иные данные. Идентификация пакета происходит по первому байту, который представляет из себя ID репорта. Например данные о состоянии кнопки, идут в репорта с а светодиодом мы управляем через репорт с >
Подальше от железа, поближе к Android
В Android поддержка USB устройств появилась начиная с API версии 12 (Android 3.1) Для работы с периферийным устройством нам необходимо реализовать режим USB host. Работа с USB достаточно неплохо описана в документации.
Для начала необходимо идентифицировать ваше подключаемое устройство, среди всего разнообразия USB девайсов. USB девайсы идентифицируются по сочетанию vid (vendor id) и pid (product id). Создадим в папке xml файл device_filter.xml со следующим содержимым:
Теперь необходимо внести соответствующие разрешения и action (если вам они необходимы) в манифест приложения:
В android:resource мы указываем файл с необходимыми фильтрами для устройств. Также, как я уже говорил ранее, можно назначить intent фильтры, для запуска приложения, к примеру, в результате подключения вашего устройства.
Для начала необходимо получить UsbManager, найти устройство, интерфейс и конечные точки устройства. Это необходимо делать при каждом подключении устройства.
Здесь мы видим те самые интерфейсы и конечные точки, речь о которых шла в прошлом разделе. Зная номер интерфейса, мы находим обе конечные точки, на прием и передачу, и инициируем usb соединение. На этом все, теперь можно читать данные.
Как я уже говорил ранее, устройства общаются через репорты.
В метод sendReport мы передаем массив байт, в котором нулевым байтом является репорт ID, берем текущее USB подключение к устройству и выполняем передачу. В качестве параметров в метод BulkTransfer передаем номер конечной точки, данные, их размер и таймаут передачи. Стоит отметить, что класс UsbDeviceConnection имеет методы для реализации обмена данными с устройством USB — методы bulkTransfer и controlTransfer. Их использование зависит от типа передачи, который поддерживает та или иная конечная точка. В данном случае используем bulkTransfer, хотя для HID чаще всего характерно использование конечных точек с типом control. Но у нас Custom HID, так что делаем что хотим. Про тип передачи советую почитать отдельно, так как от него зависит объем и частота передаваемых данных.
Для получения данных необходимо знать размер получаемых данных, который можно, как знать заранее, так и получить из конечной точки.
Метод получения данных по USB HID является синхронным и блокирующим и выполнять его необходимо в другом потоке, кроме того, репорты от устройства могут приходить постоянно, либо в любое время, поэтому необходимо реализовать постоянный опрос репорта, чтобы не пропустить данные. Сделаем это при помощи RxJava:
Получив массив байт, мы должны проверить нулевой байт, так как он является report ID и в соответствии с ним парсить полученные данные.
По завершении всех действий с USB нужно закрыть соединение. Можно выполнять это в onDestroy activity или в onCleared во ViewModel.
Заключение
В статье рассмотрен очень небольшой и примитивный, исключительно демонстративный код с реализацией для конкретного устройства. Конечно, классов USB существует много, не только HID и для них естественно реализация будет иная. Однако все методы достаточно неплохо документированы и имея хорошее представление о USB стеке можно легко разобраться в том, как их применять.
Источник