Чи можна запрограмувати Android на фізичну клавіатуру USB?


80

Насправді я хочу знати, чи це апаратна проблема, чи проблема програмного забезпечення. Чи можу я підключити свій телефон Android до комп’ютера через USB і зробити так, щоб він діяв як апаратна клавіатура. Я не хочу нічого встановлювати на комп’ютер, я хочу, щоб андроїд поводився як стандартне обладнання.


Редагувати: уточнення Я хочу написати програму / бібліотеку для android, яка дозволяє пристрою повністю емулювати звичайну клавіатуру, щоб операційна система повідомляла про неї як про стандартний клавіатурний пристрій, і вона працювала б у BIOS або де-небудь ще, де клавіатура робіт.


1
Ядро Linux включає цю функціональність , але я не уявляю, яким є стан підтримки HID-гаджетів у ядрах Android.
Грег Іноземцев

3
Вам вдалося? Чи доступна ваша програма в магазині ігор?
jeet.chanchawat

Відповіді:


44

Я змінив ядро ​​на Nexus 7, щоб діяти як стандартна HID-клавіатура та миша, не втрачаючи MTP / ADB / інші функції USB.

Ви можете використовувати утиліту командного рядка usb-gadget-test для надсилання натискань клавіш та рухів миші на ваш ПК. Я хочу пізніше створити віддалений адміністратор, який надсилатиме ключові події та отримуватиме відео з камери.

Виправлення ядра, двійкові файли та інструкції: https://github.com/pelya/android-keyboard-gadget

Редагувати: я опублікував відповідний додаток у Google Play , якщо ваш Nexus 7 укорінений, ви можете прошивати ядро ​​прямо з програми та надсилати з ним натискання клавіш.


Чи можливо це взагалі з iOS?

3
Дуже малоймовірно, оскільки вам доведеться робити джейлбрейк і встановлювати власне ядро ​​XNU із власними виправленнями - мої виправлення не працюватимуть, оскільки це не ядро ​​Linux. Практично купувати Nexus 4/5/7 б / у набагато дешевше, ніж налаштовувати і, можливо, обробляти iPad.
пеля

де я можу дізнатись більше про ядро ​​xnu та як зробити власні виправлення? Я не надто з ним знайомий. Припустимо, пристрій iOS розбитий

привіт @pelya, я намагався скомпілювати ядро ​​для мого android mtk 6589 на базі. Але, здається, щось спіткане. Ви можете допомогти ? Я бачив, що ти писав багато подібних речей і
робиш

На жаль, з тих пір додаток було видалено з магазину ігор.
Jacob Sánchez

14

Для роботи більшості USB-клавіатур потрібні драйвери. Будь-яка функціональність клавіатури (нестандартні кнопки), що перевищує можливості стандартних драйверів HID , потребує встановлення деякого програмного забезпечення на комп'ютері.

З огляду на це, можливо, можна використовувати USB-можливості Android , а також написати власний драйвер, якщо HID за замовчуванням недостатній, для досягнення вашої мети. Ймовірно, це дуже нетривіальна справа.

Редагувати: Я вважаю, що Крістофер Мічінський має рацію, що рівень контролю, який ви отримуєте за допомогою стандартного Android USB API, недостатній для цієї мети. Два його рішення щодо модифікації мікропрограми для зв’язку із використанням стандартів HID, а також апаратний посередник, який переводить з протоколу Android Accessory в HID, здаються мені дійсними. Якщо про встановлення драйверів на комп’ютері не може бути й мови, це можуть бути єдиними двома варіантами.

Однак, якщо ви готові встановити драйвер для такої поведінки, має бути можливість створити власний драйвер, який може обробляти протокол Android USB та правильно перекладати на правильні виклики / переривання для функціонування клавіатури. Якщо пам’ять спрацьовує, кожна периферійна клавіатура, якою я користувався протягом останніх 10 років, потребувала встановлення драйвера для повної функціональності, тому це може не вважатися нестандартною поведінкою. (Хоча просто трапляється, що такий підхід дозволить пристрою функціонувати як клавіатура всередині вікон, а не під час процесу завантаження)


Я нагородив вас нагородою, оскільки, хоча я сумніваюся, що ваша відповідь може призвести до рішення, ви надали тут найбільш орієнтовану на рішення відповідь, яка намагається вирішити проблему за допомогою деяких корисних ресурсів. Дякую, ~)
Біллі Мун,

11

Схоже, хтось нарешті це зробив, це трохи крихітно - але ось воно:

http://forum.xda-developers.com/showthread.php?t=1871281

Це передбачає деяку перекомпіляцію ядра та трохи редагування, і ви втрачаєте часткову функціональність (MDC?) .. але це зроблено.

Однак особисто, тепер, коли я бачу "справжню вартість", я, мабуть, зібрав би невеликий адаптер на Teency чи щось інше - припускаючи, що Android може спілкуватися з послідовними пристроями через USB. Але це засновано на тому, що у мене є Samsung, і для того, щоб зробити підключення через USB, у будь-якому випадку потрібен спеціальний кабель - без зайвої болі мати трохи пристрою в кінці, якщо мені все одно доведеться носити проклятий кабель.


Так, я втратив усі інші функціональні можливості за допомогою USB, і це далеко не ідеально, але він робить те, що робить. Я все ще можу використовувати adb через wifi та передавати файли через SD-карту. Якщо у мене є час на якомусь етапі, я можу спробувати вдосконалити його, щоб відновити початкову функціональність, ідеально додавши ще одну опцію в меню usb, що дозволяє вибрати клавіатуру
Дарк,

На жаль, здається SOP, що пристрої завжди здаються ядрами, які не підтримують повний комплімент модулів [gadget]. чи то Kindle, андроїд чи навіть оцінна дошка. я намагався створити комбіноване рішення для масового зберігання / HID для використання BitLocker на планшеті .. блінно розчаровує. PS: біса прекрасна робота, яку ви зробили.
Оруелофіл

Я зацікавлений у додаванні масового сховища пізніше, але допрацюю це спочатку. Після того, як я цим задоволений, я опублікую підручник про те, як я все зробив. Зараз я працюю над тим, щоб отримати додаток для Android, щоб поговорити з водієм через невеликий додаток, написане на
мові

5

Здається, хтось це зробив, виправивши ядро. Я щойно натрапив на статтю під назвою "Експлуатування підключення смарт-телефону через USB для розваги та отримання прибутку" Анджелоса Ставру, Чжаохуй Ванга, Університет Джорджа Мейсона, Файрфакс, штат Вірджинія. (доступно вільно за допомогою гуглювання вищезазначеного заголовка). Тут два дослідники досліджують можливість компрометованого андроїд-пристрою, який контролює підключений ПК, маючи андроїд-пристрій, що представляється як HID-пристрій (клавіатура). Як доказ концепції, здається, що вони успішно виправили ядро, роблячи саме те, що ви хочете. Вони не надали детальних кроків, але в будь-якому випадку я просто цитую те, що вони сказали, що зробили:

..... ми розробили спеціальний драйвер гаджетів USB на додаток до існуючого композитного інтерфейсу USB на ядрі Android Linux за допомогою API гаджетів USB для Linux [4]. Структура UGAL допомогла нам впровадити просту функціональність USB Human Interface Driver (HID) (тобто драйвер пристрою) та код склеювання між різними API ядра. Використовуючи код, наданий у: “drivers / usb / gadget / composite.c”, ми створили власний драйвер гаджета як додатковий складений інтерфейс USB. Цей драйвер імітує пристрій USB-клавіатури. Ми також можемо імітувати пристрій USB-миші, що надсилає запрограмовану команду введення в настільну систему. Тому просто представити себе як звичайну USB-мишу або клавіатурний пристрій і надсилати заздалегідь визначену команду крадькома, щоб імітувати зловмисні інтерактивні дії користувачів. Щоб перевірити цю функціональність, в наших контрольованих експериментах ми надсилаємо послідовності кодів для виконання не фатальних операцій і показуємо, як такий маніпульований пристрій може завдати шкоди Зокрема, ми змоделювали USB-клавіатуру Dell (vendorID = 413C, productID = 2105), надіславши клавішу "CTRL + ESC" комбінація та послідовність клавіш "U" та "Enter" для перезавантаження машини. Зверніть увагу, що для цього потрібне лише підключення через USB і ви можете отримати привілей "поточного користувача" в настільній системі. За допомогою додаткового локального або віддаленого експлоїта, надісланого як корисне навантаження, шкідливе програмне забезпечення може посилити привілей та отримати повний доступ до настільної системи. productID = 2105) надсилаючи комбінацію клавіш "CTRL + ESC" та послідовність клавіш "U" та "Enter" для перезавантаження машини. Зверніть увагу, що для цього потрібне лише підключення через USB і ви можете отримати привілей "поточного користувача" в настільній системі. За допомогою додаткового локального або віддаленого експлоїта, надісланого як корисне навантаження, шкідливе програмне забезпечення може посилити привілей та отримати повний доступ до настільної системи. productID = 2105) надсилаючи комбінацію клавіш "CTRL + ESC" та послідовність клавіш "U" та "Enter" для перезавантаження машини. Зверніть увагу, що для цього потрібне лише підключення через USB і ви можете отримати привілей "поточного користувача" в настільній системі. За допомогою додаткового локального або віддаленого експлоїта, надісланого як корисне навантаження, шкідливе програмне забезпечення може посилити привілей та отримати повний доступ до настільної системи.


3

Єдиний спосіб, я бачив це можливим, це якщо ви:

  • модифікував прошивку Android, щоб надати вам доступ на рівні USB на досить низькому рівні, щоб ви могли працювати за необхідним протоколом

або

  • Зробив якийсь спеціальний апаратний перетворювач рівня, який ви прикріпили до пристрою.

(Отже, я думаю, залежно від того, скільки роботи ви хочете зробити, це може бути проблема апаратного чи програмного забезпечення.)


Не могли б ви пояснити трохи більше про опцію модифікації мікропрограми, наприклад, які обмеження? Які проблеми це створює (чи можна запустити наявне програмне забезпечення / оновити телефон)? Де я можу отримати інформацію про те, як робити подібні речі? Ура.
Біллі Мун,

Ну, я не думаю, що за замовчуванням (тобто на стандартній прошивці) можливості USB (також згадані Slothsberry) дадуть вам доступ до апаратного забезпечення USB на досить низькому рівні, щоб контролювати вихід необхідним способом для реалізації виводу вам потрібно це зробити. (Тобто, вам потрібно вивести сигнал, а не приймати його ..)
Крістофер Міцінський

А як щодо розмитого зуба? Я не маю на увазі використовувати андроїд як blutooth-клавіатуру, але, можливо, існує існуючий usb-пристрій, який приймає сигнал blutooth-клавіатури і передає його на комп'ютер без необхідного драйвера на комп'ютері ... я думаю, що, можливо, я сподіваюся, але це працювати для мене.
Біллі Мун

Теоретично це було б можливо. Вам доведеться придбати приймач Bluetooth, який може зв’язуватися з пристроєм Android, а потім зробити невелику схему, яка інтерпретує сигнал BT з телефону, а потім перетворює його в дійсний сигнал клавіатури. Ви можете придбати всі деталі на SparkFun, але це не буде надто просто (тобто, можливо, хак на вихідні?). Я б зробив це, якби у мене було багато грошей / часу, :-), оскільки я впевнений, що це можливо, але я не думаю, що це є нестандартно.
Kristopher Micinski

2

Я вважаю, що ви можете це зробити, якщо у вас є корінний пристрій із недавньою ОС Android. Наприклад, Asus Eee Pad Transformer під управлінням Android 4 має бібліотеки /system/lib/libusb.soі /system/lib/libusbhost.so, отже, ви можете написати програму Java, яка викликає їх за допомогою JNI для емуляції клавіатури USB. Це означає, що ви повинні написати трохи клею C-коду, який імітує спосіб взаємодії USB-клавіатури з ПК (= ви повинні вивчити, як працює протокол USB).

Я кажу "вкорінений", оскільки для використання цих бібліотек зазвичай потрібні деякі дозволи.

Редагувати: Вище зазначене відповідає дійсності при програмуванні пристрою Android на роль хоста USB, у вашому випадку вам потрібно бути «гаджетом». Я не знаю, скільки функцій гаджета Linux міститься в ядрі вашого пристрою Android. Дивіться це для подібного питання.


2

Ваш Android вже ідентифікується з VID / PID при підключенні до хосту. У нього вже є інтерфейс для масового зберігання. Вам потрібно буде зламати драйвер на низькому рівні, щоб підтримати другий інтерфейс для 03:01 HID. Тоді мова йшла б просто про надсилання сканованих кодів до модифікованого драйвера. Це було б не просто, але це був би акуратний хак. Одним із варіантів буде введення довгих випадкових паролів для входів.


Я сподіваюся, для цього потрібно буде вкорінити телефон. Як ви очікуєте, існують якісь інші передумови?
Billy Moon

Так, вам, мабуть, довелося б викорінити. Інтерфейсом, який ви хотіли б використовувати, буде API "Гаджет" Linux. посилання Я щойно помітив коментар Грега до питання, тобто відповідь, тобто Гаджет.
Ренате

Ви читали відповідь, яку я поставив? Ви згодні? Чи є у вас інформація, яка підтверджує або заперечує, що це неможливо через те, що ANdroid зберігає дескриптор інтерфейсу на ROM - і, отже, не програмується?
Billy Moon

Мій Android може відповісти принаймні двома VID / PID, один для FastBoot і ввімкнений для нормальної роботи Android. У звичайній роботі Android він підтримує два інтерфейси, USB Mass Storage та ADB. Як саме один додає додаткові інтерфейси, я не знаю, але це явно не апаратно. USB-гаджети здаються правильним напрямком.
Ренатувати

Дякую @Renate - це виглядає багатообіцяюче!
Billy Moon

2

Не здавайтесь. Linux може робити це з правильним обладнанням за допомогою "USB-гаджетів". І наводячи такі факти:

  1. Моя стара Nokia N95 могла використовувати свій USB для того, щоб бути "Пристроєм масового зберігання даних", "Медіаплеєром", "GSM-модемом" або друкувати фотографії.
  2. Я можу підключити iPhone до iPad через пасивний адаптер Apple USB-Camera, і вони передають фотографії.
  3. iPhone може бути очевидним як ряд речей, наприклад, коли вони переходять у DFU.

Чому все це актуально?

Тому що, якби я писав телефон для Linux, я знаю, що він буде робити і як це робити. І відповідь стосуватиметься гаджетів USB.

Читаючи одне з посилань, яке було розміщено тут,

Це ядро ​​Linux, код знаходиться у драйверах / usb / gadget / у дереві kernel.org, якщо вам це цікаво. Android має кілька специфічних виправлень для гаджетів, які не є основними, але це не все так багато. Ви можете побачити все це, просто перевіривши їхнє ядро ​​git-дерева, не потрібно турбувати своїх розробників.

Я здогадуюсь, що вам це вдасться - але це буде передбачати перекомпіляцію ядра / операційної системи Android - або, принаймні, створення середовища збірки, в якому ви / зможете / відновити ядро, якщо хочете.

До речі, у мене є Atmel NGW100mkII, який підтримує гаджети USB, але не постачається з модулем HID. І мені доведеться робити вищезазначене та багато іншого.


Я намагатимусь не здаватися - але це здається великим завданням, якщо це може бути абсолютно неможливим з самого початку. Ви дали мені багато думок / досліджень у цій публікації. Дякую.
Біллі Мун,

Я щойно знайшов додаток для зламаного iPhone, який перетворює його на USB-накопичувач із декількома вибором "Віртуальних дисків" та змінює USB-пристрій, щоб він не запускав iTunes / Photo Import. (Допомоги вам немає, але це дивовижна штука для iPhone). Я також знайшов USB-бібліотеку для мого калькулятора Texas TI84 + SE, яка робить те, що ви хотіли (він також розблоковує Playstations). У будь-якому разі, мій Samsung Galaxy Note прибув сьогодні, тож я справді буду мати пристрій Android.
Оруелофіл,

2

Це можливо без додаткових драйверів.

Ви можете емулювати USB-клавіатуру ПК за допомогою невеликого пристрою розміром USB-ключа, а потім використовувати свій пристрій Android для надсилання даних клавіатури (та / або миші) через Bluetooth.

Погляньте на описове відео в кампанії Indiegogo: http://igg.me/at/hiDBLUE/x/3400885

До речі: Технічна документація на виріб доступна тут: http://www.flyfish-tech.com/hiDBLUE


1

Вам потрібно встановити якийсь зв’язок, щоб зробити це з Android, не з коробки, наприклад, через tcp / ip та adb, тому не потрібно без встановлення принаймні adb та прослуховувача на комп’ютері.

Але якщо у вас є діяльність, яка надсилає апаратну клавіатуру, як дані через usb, то чому б і ні? Нелегко, я здогадуюсь. У цей момент одразу з’являється відповідь форуму usuas: "Чому б вам не змінити свої плани і ...." :)


1
Я не хочу змінювати свої плани, тому що хочу розробити бібліотеку, яка дозволяє android працювати як апаратна клавіатура для стандартних комп’ютерних пристроїв. Як розробнику або як користувачеві, це явно переважніше, ніж необхідність обіймати шведа навколо якогось абстрактного протоколу зв'язку, що вимагає нестандартної настройки.
Біллі Мун,

1

Деякі інші зрозуміли, що це неправильно. Тим часом я поділяю їхню думку. Вибачте.

Стара неправильна відповідь:

На мою думку, це навряд чи можливо.

Ваш Комп’ютер ідентифікує будь-який пристрій USB за допомогою дескриптора пристрою USB або дескриптора USB-інтерфейсу. Щоб мати змогу використовувати пристрій Android як клавіатуру, вам доведеться змінити їх. Насправді я думаю, що вони зберігаються на ПЗУ у пристрої, тому вам довелося б змінити апаратне забезпечення. Пристрій повинен ідентифікувати себе з хостом, навіть якщо його заряджається лише у вимкненому стані (має повідомити usb-хосту про споживану потужність, інакше лише кілька мА). Для мене це вказує на те, що вам доведеться міняти апаратне забезпечення

«Найпростішим» способом, мабуть, було б зібрати адаптер, що містить мікросхему хоста usb з µC, який перетворює отримані дані (які вам все-таки потрібно було надіслати через usb) у сигнали ps / 2 або usb-клієнта, які ви надсилаєте на комп’ютер.

На мій погляд, найпростішим способом було б: придбайте одну з цих клавіатур, яку ви можете покатати, і покладіть їх у свою сумку.


Чи можете ви вказати на ресурс, який підтверджує вашу підозру щодо ідентифікації ПЗУ підключень USB Android?
Біллі Мун

2
Я позначив вашу відповідь, оскільки це виглядає правильно - хоча я хотів би отримати підтвердження жорсткого кодування дескриптора Android. , ~)
Біллі Мун,

4
Є неправильно. Більшість пристроїв USB на Android реалізовані в програмному забезпеченні.
Дарвін

1

Я запізнився з коментарем у цьому питанні, але це може бути корисним для деяких інших людей.

Ви можете зробити так, щоб ваш телефон Android працював як клавіатура, миша, камера, система потокової передачі звуку, пристрій прив’язки. Коротше кажучи, будь-який пристрій USB, який ви бачите на ринку, і до тих пір, поки апаратне забезпечення не обмежує вас. Такі як швидкість або інтерфейс гаджета недоступні.

Пристрій USB буває двох типів, хост і гаджет. Отже, гаджетний пристрій діє як клієнт і зазвичай має інтерфейс usb otg у більшості телефонів. Отже, в кінці гаджета ви можете змусити свій телефон взагалі поводитися як різний пристрій, перемикаючись між різними конфігураціями (ви вже робите це, коли заходите в налаштування usb і робите свій пристрій як накопичувач чи щось інше).

Але для цього потрібно змінити ядро ​​Android. Якщо ви розробник пристрою для Android, ви можете це точно зробити.


3
На протокол, це не щоденник, і не слід розглядати його як такий. Перегляньте поширені запитання, щоб дізнатися більше. РЕДАГУВАТИ: У цій примітці розгляньте це питання на мета-ауті.
Жуль

0

У мене є певний досвід роботи як користувача. Найбільш очевидне рішення - через tcp / ip через модель клієнт / сервер. Багато інструментів, таких як клавіатура (http://www.freenew.net/iPhone/air-keyboard-111/171415.htm), використовують цей метод для створення заміни клавіатури / миші за допомогою ОС смартфона. Зверніть увагу, що при впровадженні виявляються деякі проблеми безпеки. Наприклад, ви повинні увійти в систему, щоб використовувати компоненти сервера.

Інші крос-платформні інструменти (тобто windows / mac, що керують іншим екземпляром windows / mac) використовують подібний підхід. Див. Синергію: http://synergy-foss.org/


Дякую за ваш відгук, але я насправді шукав лише програмне забезпечення для телефону, на комп'ютері якого не було встановлене програмне забезпечення.
Біллі Мун,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.