Вопрос или проблема
Я хочу использовать один ПК в качестве USB-клавиатуры для другого ПК. Это должно быть неотличимо от настоящей USB-клавиатуры. Как я могу этого достичь?
Решение, которое работает с любой из версий Ubuntu Linux 14 и выше, OS X 10.11 или Windows 10, будет приемлемо. Должно работать с USB 2.0 или 3.0.
Обновление: Машина, принимающая ввод, не должна требовать какой-либо специфической установленной программы или сетевого доступа. Мне нужно использовать физический USB-кабель, и машина-получатель должна реагировать, как если бы физическая клавиатура присутствовала в этом USB-порту.
Вы можете использовать Raspberry Pi Zero в режиме USB-гаджета. В этом режиме Raspberry Pi может вести себя как множество стандартных USB-устройств (клавиатура, мышь, накопитель и т.д.), и вы сможете, например, “вставлять” нажатия клавиш из программы, запущенной на Pi (и вы можете управлять этой программой удаленно, как вам удобно).
Raspberry Pi Zero – не единственное устройство, которое это позволяет; но оно дешевое, его легко достать, и существует множество документаций, объясняющих, как это сделать, поэтому это (по моему мнению) довольно хорошая отправная точка для проекта такого плана!
У меня получилось с etherkey, Teensy и UART to USB bridge.
Хост-компьютер отправляет команды на Teensy через UART-бридж. Teensy притворяется клавиатурой и нажимает виртуальные кнопки на другом ПК. Etherkey – это программное обеспечение, которое выполняется на Teensy и передает клавиши от хост-компьютера к виртуальной клавиатуре.
Компьютер-получатель моментально обнаружил новую “клавиатуру” и не требовал никаких настроек.
Обновление: Я также запустил Etherkey на плате разработки ATmega32u4, которая более доступна и дешевле, чем Teensy.
В конце концов, я нашел аппаратное устройство для этого на AliExpress. Это делает его чем-то вроде черного ящика, хотя я подозреваю, что внутренне оно работает похоже на ответ от Sjoerd.
USB-конец устройства отображается как клавиатура HID на хосте, и я могу подключаться к серийному концу с другого компьютера и отправлять ему символы, которые будут ‘набираться’. Существуют специальные паттерны для использования модификаторных клавиш. Если у отправляющего компьютера нет настоящего последовательного порта, можно использовать обычный USB-последовательный адаптер, хотя это затрудняет определение, какая сторона притворяется клавиатурой.
Это было, безусловно, самое дешевое решение, которое я нашел, ~10 долларов США, по сравнению с другими продуктами, которые я видел, стоящими около 100 долларов или больше. Если бы мне понадобилось больше, и продукт с AliExpress исчез бы, я бы попробовал решение с Teensy.
Вы можете использовать usbip для того, чтобы сделать USB-устройства (включая клавиатуру) на хост-компьютере доступными как USB-устройства на клиентском компьютере через сеть. Поскольку это USB-устройство, оно будет неотличимо от любого USB-устройства, подключенного локально.
Клиенты существуют для Windows, и usbip долгое время был стандартной частью ядра. На Debian и Ubuntu пакет usbip
содержит программы для настройки и управления таким соединением.
Подробности о том, как это настроить, можно легко найти в интернете, например, здесь.
Похожие вопросы:
Это возможно с чипом CH9329. CH9329 преобразует UART в USB-клавиатуру.
Вот дешевый USB-to-USB кабель с чипами CH340 USB-to-UART и CH9329 UART-to-USB-клавиатура:
Вот программное обеспечение для отправки нажатий клавиш через UART:
- GitHub: sjmf/ch9329-keyboard: Скрипт контроллера клавиатуры CH9329.
- Блог: Управление Raspberry Pi без экрана или клавиатуры – Размышления.
Обновление: Это работает. Я приобрел CH9329+CH340UART/TTL преобразователь последовательного порта в USB HID полную клавиатуру и мышь без драйверов. На маленьком конце это представляется как последовательный порт CH340. На большом конце это представляется как “WCH UART TO KB-MS_V1.8” клавиатура. Я использовал модуль Python ch9329 для отправки нажатий клавиш:
from serial import Serial
from ch9329 import keyboard
ser = Serial("/dev/tty.usbserial-1110", 9600, timeout=0.05)
keyboard.write(ser, "Hello World\n")
ser.close()
Кабель может набирать со скоростью 23 символа в секунду. Однако библиотека Python ch9329 имеет дополнительные задержки, которые снижают эту скорость до 12 символов в секунду.
Я сталкиваюсь с той же ситуацией (специфический сценарий: мне нужно разблокировать своё рабочее место удаленно с экрана PRE-OS BitLocker). Я заказал следующее оборудование, поэтому делюсь своим исследованием, но не опытом
«Источник» компьютер имеет следующее:
-
Устройство захвата USB HDMI. Устройства низшего уровня можно найти на AMZN за ~20 долларов США.
-
USB периферийное устройство для имитации USB HID. Это стоит 90 долларов США
Это должно предоставить исходящей машине ту же функциональность, что и эта все-в-одном USB за 500 долларов.
Целевой компьютер имеет следующее:
- Разветвитель HDMI, чтобы я мог иметь консоль, когда нахожусь за компьютером. Устройства низшего уровня можно найти на Amazon за 15 долларов США.
Общая стоимость составит ( $20 + $90 + $15 ) * 2 = $250 долларов США
, так что каждая пара компьютеров может мониторить и управлять друг другом от POST до полностью рабочей ОС (уровень 5).
Пожелайте мне удачи получить одобрение этого расхода у моего администратора!
Учитывая временной промежуток между вопросом и данным моментом, это может быть не актуально. Однако для тех, кто задает подобный вопрос, я предлагаю следующее решение:
- Купите дешевую USB-клавиатуру, те, которые стоят около 5-20 долларов.
- Разберите ее и извлеките контроллер и секцию USB-порта, затем подключите ваш “контроллер” к контактам, предназначенным для матрицы клавиатуры. (Само собой разумеется, потребуется пайка.)
- Составьте карту контактов, либо исследуя контактную матрицу, либо программно.
- Создайте управляющую программу, используя карту контактов.
- Настройте вашу программу на запуск при загрузке и вперед!
Управляющая программа может быть написана на любом языке, который поддерживает виды вывода, которые могут управлять входами “клавиш” матрицы контроллера клавиатуры, а USB-коннектор подключается к целевому компьютеру как USB-клавиатура.
Если используется ОС на базе Linux, вероятно, Python будет вашим языком выбора. Если используется ОС на базе Windows, вероятно, .Net будет вашим языком выбора (специфический вкус C#, VB – на ваше усмотрение). Возможно, даже Node.js или PHP могут быть использованы, если вы можете управлять GPIO или контактами параллельного порта.
Удачного взлома!
Используйте USB-приемник Logitech Unifying и эмулируйте виртуальную клавиатуру с этим:
Общая стоимость должна составить около 20 долларов.
Одно из возможных решений – добавить Bluetooth-адаптер к целевому ПК и имитировать Bluetooth-клавиатуру с хоста ПК.
.
Ответ или решение
Для того, чтобы симулировать USB клавиатуру с одного компьютера на другой, необходимо реализовать устройство, которое будет распознано целевым компьютером как обычная USB клавиатура. Данная задача подразумевает создание аппаратного или программно-аппаратного решения, способного эмулировать действия клавиатуры на оборудовании, поддерживающем технологии USB 2.0 или 3.0, при этом, ни целевой компьютер, ни источник не должны требовать установки дополнительного программного обеспечения на целевом компьютере, а соединение должно осуществляться через физический USB кабель.
Теория
Аппаратное устройство, способное эмулировать USB клавиатуру, действует по принципу так называемого USB периферийного устройства, которое имитирует набор текста и взаимодействие с компьютером как стандартная клавиатура. Основным принципом является эмуляция сигнала, который обычная клавиатура отправляет на компьютер через USB интерфейс. Это может включать в себя эмуляцию нажатий и отпусканий клавиш, использование модификаторов (Control, Shift и т.д.) и отправку сложных комбинаций.
Примеры
-
Raspberry Pi Zero в режиме USB гаджета. Одним из популярных способов реализации является использование Raspberry Pi Zero, работающего в режиме USB-гаджета. В этом режиме Raspberry Pi может быть настроен на работу как MIDI-устройство, клавиатура, мышь и т.д. Это позволяет создать программу, запускаемую на Raspberry Pi, способную "вставлять" нажатия клавиш.
-
Использование контроллеров Teensy или ATmega32u4. Эти микроконтроллеры позволяют реализовать USB HID (Human Interface Device) и прийти к тому же результату посредством программирования. Например, с помощью библиотеки для Arduino можно настроить Teensy для имитации клавиатуры, где устройство будет отправлять команды на активацию клавиш на другом ПК.
-
Использование коммерческого оборудования. Существует целый ряд готовых решений, покупка которых позволяет достичь желаемого результата без необходимости глубокого погружения в программирование микроконтроллеров. Например, устройства с чипом CH9329, которые конвертируют сигналы UART в команды USB клавиатуры.
Применение
Для реализации этого проекта вам потребуется:
-
Аппаратная платформа. Raspberry Pi Zero, Teensy или другое подобное устройство, поддерживающее эмуляцию USB HID.
-
Среда разработки. Вам может понадобиться утилита или программа, чтобы загружать код в ваше аппаратное устройство. Обычно, для Raspberry Pi достаточно иметь доступ к терминалу, в случае элементов на базе Arduino или Teensy потребуется IDE Arduino.
-
Программное обеспечение. Это может быть Python-программа, которая непосредственно взаимодействует с API управления устройством и транслирует команды в понятной для целевого устройства форме.
-
Соединение и тестирование. Соединение устройства с целевым ПК должно быть осуществлено через стандартный USB кабель. Для тестирования работоспособности выполните ряд тестов по проверке реакции устройства на эмулированные нажатия клавиш.
Заключение
Эмуляция USB клавиатуры посредством аппаратного и программного обеспечения является интересной и увлекательной задачей, открывающей широкие возможности для автоматизации и интеграции устройств. Используя Raspberry Pi, Teensy или коммерческие USB решения, вы можете создать устройство, способное взаимодействовать с любым ПК без необходимости установки дополнительного ПО на целевой машине. Это решение идеально подходит для ситуаций, где необходим доступ к машинам, находящимся за физическим ограничением или без сетевых средств взаимодействия. Важно иметь четкое понимание используемого оборудования и программных средств, чтобы избежать нежелательных последствий и обеспечить корректное взаимодействие между устройствами.