是否可以将 Android 编程为物理 USB 键盘?

Posted

技术标签:

【中文标题】是否可以将 Android 编程为物理 USB 键盘?【英文标题】:Is it possible to program Android to act as physical USB keyboard? 【发布时间】:2012-04-06 00:53:56 【问题描述】:

我真正想知道的是这是硬件问题,还是软件问题。我可以通过 USB 将我的安卓手机插入电脑并让它充当硬件键盘吗?我不想在电脑上安装任何东西,我希望 android 表现得像标准硬件。


编辑:澄清 我想为 android 编写一个程序/库,使设备能够完全模拟普通键盘,以便操作系统将其报告为标准键盘设备,并且它可以在 Bios 或其他任何键盘工作的地方工作。

【问题讨论】:

The Linux kernel includes this functionality,但我不知道 Android 内核中 HID 小工具支持的状态如何。 你成功了吗?您的应用在 Play 商店中可用吗? 【参考方案1】:

我在 Nexus 7 上修改了内核,使其像标准 HID 键盘和鼠标一样工作,而不会丢失 MTP/ADB/其他 USB 功能。

您可以使用 usb-gadget-test 命令行实用程序将击键和鼠标移动发送到您的 PC。我想稍后创建一个远程管理应用程序,它将发送关键事件并从相机接收视频。

内核补丁、二进制文件和说明: https://github.com/pelya/android-keyboard-gadget

编辑:I've published a proper app to Google Play,如果您的 Nexus 7 已植根,您可以直接从应用程序中刷新内核,并使用它发送按键。

【讨论】:

这在 iOS 上是否可行? 不太可能,因为您需要越狱并使用自己的补丁安装自定义 XNU 内核 - 我的补丁不起作用,因为它不是 Linux 内核。实际上,购买二手 Nexus 4/5/7 比对 iPad 进行调整和可能会变砖要便宜得多。 在哪里可以了解有关 xnu 内核以及如何制作自己的补丁的更多信息?我对它不太熟悉。假设 iOS 设备已越狱 嗨@pelya我正在尝试为我的android mtk 6589编译内核。但似乎有些东西已经磨损了。你能帮我吗 ?我看到你写了很多这样的东西,让安卓几乎成为一个通用的电脑小工具:D 很遗憾,该应用已从 Play 商店中删除。【参考方案2】:

大多数 USB 键盘需要驱动程序才能运行。任何超出standard HID drivers 功能的键盘功能(非标准按钮)都需要在计算机上安装一些软件。

话虽如此,如果默认 HID 不足,可以使用 Android 的 USB capabilities 以及编写自定义驱动程序来实现您的目标。这可能是一项非常重要的任务。

编辑: 我认为 KristopherMicinski 是正确的,您使用现有的 Android USB API 获得的控制级别不足以实现此目的。他修改固件以使用 HID 标准进行通信的两种解决方案,以及从 Android 附件协议转换为 HID 的硬件中间人对我来说似乎都是有效的。如果无法在计算机上安装驱动程序,则可能只有这两个选项。

但是,如果您愿意为此行为安装驱动程序,则应该可以编写一个可以处理 Android USB 协议的自定义驱动程序,并正确转换为键盘功能的正确调用/中断。如果没有记错的话,我在过去 10 年中使用的每个外围键盘都需要安装驱动程序才能获得全部功能,因此这可能不会被视为非标准行为。 (虽然只是发生这种方法只会允许设备在 Windows 内用作键盘,而不是在启动过程中)

【讨论】:

我授予您赏金,因为尽管我怀疑您的回答能否带来解决方案,但您在这里提供了最以解决方案为导向的答案,它试图通过一些有用的资源来解决问题。谢谢,~)【参考方案3】:

看起来有人终于做到了,它有点难看 - 但它是:

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

它涉及一些内核重新编译和一些编辑,并且您失去了部分功能(MDC?)......但它已经完成了。

但就我个人而言,既然我看到了“真正的成本”,我可能会在 Teency 或其他东西上安装一个小适配器 - 假设 Android 可以通过 USB 与串行设备通信。但这是基于我有一个三星的事实,并且无论如何都需要一根特殊的电缆来建立 USB 连接 - 如果我不得不随身携带该死的电缆,那么最后有一个小设备不会带来额外的痛苦。

【讨论】:

是的,我确实失去了 USB 的所有其他功能,这远非完美,但它可以做到。我仍然可以通过 wifi 使用 adb 并通过 SD 卡传输文件。如果我在某个阶段有时间,我可能会尝试改进它以恢复原始功能,最好在 USB 菜单中添加另一个选项,让您选择键盘 可悲的是,设备似乎总是发布不支持 [gadget] 模块的完整补充的内核,这似乎是 SOP。无论是kindle、android,甚至是评估板。我一直在尝试为平板电脑上的 BitLocker 使用构建一个组合的海量存储/HID 解决方案。该死的令人沮丧。 PS:该死的,你做得很好。 我有兴趣在以后添加大容量存储,但会先完成。一旦我对它感到满意,我将发布一个关于我如何做所有事情的教程。我目前正在努力让一个 Android 应用程序通过一个用 C 编写的小应用程序与司机交谈。希望在下周左右完成【参考方案4】:

似乎有人通过修补内核来做到这一点。我刚刚看到弗吉尼亚州费尔法克斯乔治梅森大学计算机科学系 Angelos Stavrou、Zhaohui Wang 撰写的题为“利用智能手机 USB 连接获得乐趣和利润”的论文。 (可通过谷歌搜索上述标题免费获得)。在这里,两位研究人员正在调查受感染的 android 设备通过让 android 设备将自身呈现为 HID 设备(键盘)来控制连接的 PC 的可能性。作为概念证明,他们似乎已经成功地修补了内核,完全符合您的要求。他们没有提供详细的步骤,但无论如何我只是引用他们所说的他们所做的:

.....除了现有的 USB 之外,我们还开发了一个特殊的 USB 小工具驱动程序 使用 USB Gadget 在 Android Linux 内核上的复合接口 适用于 Linux[4] 的 API。 UGAL 框架帮助我们实现了一个简单的 USB 人机界面驱动程序 (HID) 功能(即设备驱动程序)和 各种内核 API 之间的粘合代码。使用提供的代码 在:“drivers/usb/gadget/composite.c”中,我们创建了自己的小工具驱动程序 作为附加的复合 USB 接口。此驱动程序模拟 USB 键盘设备。我们也可以模拟一个USB鼠标设备发送 桌面系统的预编程输入命令。因此它是 直接伪装成普通的 USB 鼠标或键盘设备,并且 偷偷发送预定义的命令来模拟恶意交互 用户活动。为了验证这个功能,在我们控制的 实验中,我们发送键码序列来执行非致命操作 并展示这种被操纵的设备如何造成损害 特别是,我们模拟了一个戴尔 USB 键盘(vendorID=413C, productID=2105) 发送“CTRL+ESC”组合键和“U”和“Enter” 重新启动机器的键序列。请注意,这只需要 USB 连接并且可以获得桌面上的“当前用户”权限 系统。使用作为有效负载发送的附加本地或远程漏洞利用, 恶意软件可以提升权限并获得对 桌面系统。

【讨论】:

【参考方案5】:

我认为这是可能的唯一方法是,如果你:

修改了 Android 固件,为您提供了足够低的 USB 级别访问权限,您可以使用必要的协议进行操作

制作了某种特殊的硬件电平转换器,连接到设备上。

(所以我想,这取决于你想做多少工作,可能是硬件软件问题。)

【讨论】:

您能否详细解释一下固件修改选项,例如,有哪些限制?这会产生什么问题(您可以运行现有软件/更新手机)?我在哪里可以获得有关如何执行此类操作的信息?干杯。 好吧,我不认为默认情况下(即,在库存固件上)USB 功能(Slothsberry 也提到过)会让您以足够低的级别访问 USB 硬件来控制以必要的方式输出以实现您需要实现的输出。 (即,您需要输出信号,而不是接受它..) 蓝牙呢?我的意思不是将 android 用作蓝牙键盘,但也许有一个现有的 USB 设备可以接收蓝牙键盘信号,并将其中继到计算机而无需计算机上的驱动程序......我想我可能是有希望的,但那会为我工作。 这在理论上是可能的。您必须获得一个可以与 Android 设备通信的蓝牙接收器,然后制作一个小电路来解释来自手机的 BT 信号,然后将其转换为有效的键盘信号。您可以在 SparkFun 上购买所有零件,但这不会非常简单(即,可能是周末黑客?)。如果我有很多钱/时间,我会这样做,:-),因为我确信这是可能的,但我不认为有一个开箱即用的。【参考方案6】:

我相信,如果您的设备是最新的 Android 设备,那么您可以做到这一点。例如,运行 Android 4 的 Asus Eee Pad Transformer 具有库 /system/lib/libusb.so/system/lib/libusbhost.so,因此您可以编写一个 Java 应用程序,使用 JNI 调用它们来模拟 USB 键盘。这意味着您必须编写一些胶水 C 代码来模拟 USB 键盘与 PC 通信的方式(=您必须研究 USB 协议的工作方式)。

我说“rooted”,因为使用这些库通常需要一些权限。

编辑:在将 Android 设备编程为 USB 主机时,上述情况是正确的,在您的情况下,您需要成为“小工具”。我不知道你的 Android 设备的内核中包含了多少 Linux 小工具功能。类似问题请参见this。

【讨论】:

【参考方案7】:

您的 Android 在插入主机时已通过 VID/PID 进行识别。 它已经有一个大容量存储接口。 您需要在低级别破解驱动程序以支持 03:01 HID 的第二个接口。 那么这只是将扫描码推送到修改后的驱动程序的问题。 这并不简单,但这将是一个巧妙的技巧。 一种用途是输入长的随机密码进行登录。

【讨论】:

我希望这需要手机被植根。您预计会有任何其他先决条件吗? 是的,您可能需要root。您想要使用的接口是 Linux“Gadget”API。 link刚刚注意到Greg对这个问题的评论,就是答案,即Gadget。 你看过我勾选的答案了吗?你同意吗?您是否有任何信息可以确认或否认由于 Android 在 rom 上存储接口描述符而无法实现 - 因此不可编程? 我的 Android 可以响应至少两个 VID/PID,一个用于 FastBoot,一个用于正常的 Android 操作。在正常的 Android 操作中,它支持两个接口,USB Mass Storage 和 ADB。我不知道究竟是如何添加额外的接口,但它显然不受硬件限制。 USB Gadgets 似乎是正确的方向。 感谢@Renate - 看起来很有希望!【参考方案8】:

不要放弃。 Linux 可以通过“USB Gadgets”使用正确的硬件来做到这一点。并给出以下事实:

    我的旧诺基亚 N95 可以将它的 USB 用作“大容量存储设备”、“媒体播放器”、“GSM 调制解调器”或打印照片。 我可以通过 Apple USB-Camera 无源适配器将 iPhone 插入 iPad,然后它们可以传输照片。 iPhone 可以明显呈现为许多事物,例如当他们进入 DFU 时。

为什么所有这些都是相关的?

因为如果我正在编写一个 linux 手机,我知道它会做什么,以及它会如何做。答案将涉及 USB 小工具。

阅读此处发布的链接之一,

是Linux内核,代码在drivers/usb/gadget/中 如果你有兴趣,kernel.org 树。 Android确实有一些 不在主线中的特定小工具补丁,但不是全部 那么多。您只需查看他们的内核就可以看到所有这些 git 树,无需打扰他们的开发人员。

我猜你可能会尝试一下 - 但它会涉及重新编译 android 内核/操作系统 - 或者至少有一个构建环境,如果你愿意,你/可以/重建内核。

顺便说一句,我有一个 Atmel NGW100mkII,它支持 USB 小工具,但不附带 HID 模块。而且我将不得不做以上以及更多。

【讨论】:

我会尽量不放弃 - 但如果从一开始就完全不可能的话,这似乎是一项艰巨的任务。你在这篇文章中给了我很多思考/研究的机会。谢谢。 我刚刚找到了一个用于越狱 iPhone 的应用程序,它将它变成一个带有多个可选“虚拟磁盘”的 USB 大容量存储设备,并更改了 USB devId,因此它不会启动 iTunes/照片导入。 (对你没有帮助,但它对 iPhone 来说是很棒的东西)。我还为我的 Texas TI84+ SE 计算器找到了一个 USB 库,可以满足您的需求(它还可以解锁 Playstation)。不管怎样,我的三星 Galaxy Note 今天到了,所以我实际上会有一个 Android 设备。【参考方案9】:

这是可能的,无需任何额外的驱动程序。

您可以使用小型 USB 加密狗大小的设备模拟 PC 的 USB 键盘,然后使用您的 Android 设备通过蓝牙发送键盘(和/或鼠标)数据。

观看 Indiegogo 活动中的描述性视频:http://igg.me/at/hiDBLUE/x/3400885

顺便说一句:产品技术文档可在此处获得:http://www.flyfish-tech.com/hiDBLUE

【讨论】:

【参考方案10】:

您必须建立某种类型的连接才能实现开箱即用的 android,例如通过 tcp/ip 和 adb,所以不要在计算机上至少安装 adb 和监听器。

但是,如果您有一个通过 USB 发送硬件键盘之类的数据的活动,那为什么不呢?我猜不会很容易。此时,usuas 论坛的回答马上就来了:“你为什么不改变你的计划,然后……” :)

【讨论】:

我不想改变我的计划,因为我想开发一个库,允许 android 作为标准计算机设备的硬件键盘运行。作为开发人员或用户,这显然比必须绕开需要非标准设置的某种抽象通信协议更可取。【参考方案11】:

其他一些人认为这是错误的。与此同时,我分享他们的意见。对不起。

旧的错误答案:

在我看来,这几乎是不可能的。

您的计算机使用 USB 设备描述符或 USB 接口描述符识别任何 USB 设备。为了能够将您的 android 设备用作键盘,您必须更改这些。实际上,我认为这些都保存在设备的 ROM 中,因此您必须更改硬件。 即使设备仅在关闭状态下充电,设备也需要与主机识别自己(必须告诉 USB 主机有关功耗,否则最多只有几毫安)。对我来说,这指向了一个方向,你必须改变硬件

“最简单”的方法可能是组装一个适配器,其中包含一个带有 µC 的 usb 主机芯片,它将接收到的数据(您仍然必须通过 usb 发送)转换为您发送到的 ps/2 或 usb-client 信号计算机。

在我看来,最简单的方法是:购买一个可以滚动的键盘并将它们也放入包中。

【讨论】:

您能否指出一个资源来证实您对 Android USB 连接的 ROM 识别的怀疑? 我勾选了你的答案,因为它看起来是正确的 - 尽管我想确认 Android 描述符是硬编码的。 ,~) 是错误的。 Android 上的大多数 USB 设备都是在软件中实现的。【参考方案12】:

我在这个问题上发表评论有点晚了,但它可能对其他人有用。

您可以让您的安卓手机像键盘、鼠标、相机、声音流系统、网络共享设备一样工作。简而言之,您在市场上看到的任何 USB 小工具,直到并且除非硬件不限制您。例如速度,或小工具界面不可用。

USB 设备有两种类型,主机和小工具。 所以gadget设备就像客户端一样,通常在大多数手机中都有usb otg接口。 因此,在小工具端,您可以通过在不同配置之间切换来使您的手机完全像不同的设备一样运行(当您进入 USB 设置并将您的设备作为大容量存储或其他任何东西时,您已经这样做了)。

但要完成所有这些,您必须修改 android 内核。如果您是 Android 设备开发人员,您一定可以做到。

【讨论】:

郑重声明,这不是博客,不应被视为博客。查看FAQ 了解更多信息。编辑:在那张纸条上,考虑在元输出上检查this question。【参考方案13】:

作为用户,我在这里有一些经验。最明显的解决方案是通过客户端/服务器模型通过 tcp/ip。那里的许多工具,如 airkeyboard (http://www.freenew.net/iPhone/air-keyboard-111/171415.htm) 使用这种方法来创建使用智能手机操作系统的键盘/鼠标替换。请注意,在实施中会出现一些安全问题。例如,您必须先登录才能使用服务器组件。

其他跨平台工具(即 windows/mac 控制另一个 windows/mac 实例)使​​用类似的方法。见协同效应:http://synergy-foss.org/

【讨论】:

感谢您的反馈,但实际上我只是在寻找手机上的软件,计算机上没有安装任何软件。

以上是关于是否可以将 Android 编程为物理 USB 键盘?的主要内容,如果未能解决你的问题,请参考以下文章

将 USB 设备连接到 Android 模拟器?

将物理 USB 端口关联到设备

Android:如何将通过USB连接的外部条形码扫描仪设备集成到Android应用程序[关闭]

以编程方式通过 USB 将文件从 android 传输到计算机

如何模拟 USB 设备?

H5监听Android物理返回键