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


78

我真正想知道的是硬件问题还是软件问题。我可以将我的Android手机通过USB插入计算机,并使其充当硬件键盘。我不想在计算机上安装任何东西,我希望android表现得像标准硬件一样。


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


Linux内核包含此功能,但我不知道HID小工具支持的状态在Android内核中是什么样。
Greg Inozemtsev 2012年

3
你成功了吗?Play商店中有您的应用吗?
jeet.chanchawat 2012年

Answers:


43

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

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

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

编辑:我已经将适当的应用发布到Google Play上,如果您的Nexus 7已植根,则可以直接从该应用中刷新内核,并发送按键。


iOS完全可以吗?

3
不太可能,因为您需要越狱并使用自己的补丁程序安装自定义XNU内核-我的补丁程序不起作用,因为它不是Linux内核。实际上,购买二手Nexus 4/5/7便宜得多,而不是进行调整并可能使您的iPad变砖。
pelya

在哪里可以了解有关xnu内核的更多信息以及如何制作自己的补丁?我不太熟悉。假设iOS设备已越狱

您好@pelya我正在尝试为基于Android mtk 6589的内核编译内核。但是似乎有些破旧。你能帮我吗 ?我看过您已经写了很多这样的东西,并使android几乎成为通用的PC小工具:D
Abhigyan

不幸的是,此应用已从Play商店中删除。
雅各布·桑切斯

14

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

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

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

但是,如果您愿意为此安装驱动程序,则应该可以编写一个可处理Android USB协议的自定义驱动程序,并将其正确转换为正确的键盘功能调用/中断。如果有足够的内存,我在过去十年中使用的每个外围键盘都需要安装驱动程序以实现全部功能,因此这可能不被视为非标准行为。(尽管只是发生了这种方法,仅允许设备在Windows中充当键盘,而不是在启动过程中)


我授予您赏金,因为尽管我怀疑您的回答会导致解决方案,但您在此处提供了最以解决方案为导向的答案,试图通过一些有用的资源解决问题。谢谢,〜)
Billy Moon

11

看起来好像有人终于做到了,这有点丑陋-但这是:

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

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

不过,就我个人而言,既然我看到了“真正的成本”,我可能会在Teency或类似设备上组装一个小适配器-假设Android可以通过USB与串行设备通信。但这是基于以下事实:我拥有三星,并且无论如何都需要一条特殊的电缆来建立USB连接-如果我无论如何都要带那根该死的电缆,那么在终端上放一点设备就不会感到额外的痛苦。


是的,我确实放弃了USB的所有其他功能,这远非完美,但它能做什么。我仍然可以通过wifi使用adb并通过SD卡传输文件。如果我有时间在某个阶段,我可能会尝试对其进行完善以恢复其原始功能,最好在USB菜单中添加另一个选项以允许您选择键盘
Darc 2012年

令人遗憾的是,似乎SOP似乎总是在发行不支持[gadget]模块完整功能的内核。无论是kindle,android还是评估板。我一直在尝试为平板电脑上的BitLocker使用构建大容量存储/ HID组合解决方案。.该死的令人沮丧。PS:你做得很好。
Orwellophile 2012年

我有兴趣在以后增加大容量存储,但将首先完成。一旦我对它感到满意,我将发布一个关于我如何做的教程。我目前正在努力通过一个用C编写的小应用程序使Android应用程序与驱动程序对话。希望在下周左右完成
Darc 2012年

5

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

.....我们使用适用于Linux的USB Gadget API [4],在Android Linux内核上除了现有的USB复合接口外,还开发了一种特殊的USB小工具驱动程序。UGAL框架帮助我们实现了简单的USB人机界面驱动程序(HID)功能(即设备驱动程序)以及各种内核API之间的粘合代码。使用“ drivers / usb / gadget / composite.c”中提供的代码,我们创建了自己的小工具驱动程序,作为附加的复合USB接口。该驱动程序模拟USB键盘设备。我们还可以模拟将USB鼠标设备发送到桌面系统的预编程输入命令。因此,简单地将其摆成普通的USB鼠标或键盘设备并秘密发送预定义的命令即可模拟恶意的交互式用户活动。要验证此功能,在我们的受控实验中,我们发送键码序列以执行非致命操作,并展示这种被操纵的设备如何造成损坏。特别是,我们模拟了一个戴尔USB键盘(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硬件,从而以必要的方式控制输出以实现输出您需要做到这一点。(即,您需要输出信号,而不是接受信号。)
Kristopher Micinski 2012年

蓝牙呢?我并不是说要使用Android作为蓝牙键盘,但是也许有一个现有的USB设备可以接收蓝牙键盘信号,并将其中继到计算机,而无需计算机上的驱动程序……我想我也许是充满希望的,但是那会为我工作。
比利·穆恩

从理论上讲这是可能的。您必须获得可以与Android设备通信的蓝牙接收器,然后进行一个小的电路来解释来自手机的BT信号,然后将其转换为有效的键盘信号。您可以在SparkFun上购买所有零件,但这不会变得非常简单(例如,可能是周末破解?)。如果我有很多金钱/时间,我会这样做:-),因为我敢肯定,这是可能的,但我认为没有一个是开箱即用的。
克里斯托弗·米辛斯基

2

我相信,如果您的设备已安装了最新的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小工具功能。见对类似的问题。


2

插入主机后,您的Android已经可以识别VID / PID。它已经具有大容量存储的接口。您可能需要在较低级别上破解驱动程序,以支持03:01 HID的第二个接口。然后,这只是将扫描代码推送到修改后的驱动程序的问题。这不是简单的事情,但它是一个整洁的技巧。一种用途是输入用于登录的长随机密码。


我希望这将需要扎根手机。您是否希望还有其他先决条件?
比利·穆恩

是的,您可能必须扎根。您要使用的接口将是Linux“ Gadget” API。链接我刚刚注意到格雷格对问题的评论,那就是答案,即小工具。
2012年

你读我打勾的答案了吗?你同意吗?您是否有任何信息确认或拒绝由于ROM上存储了ANdroid接口描述符而无法实现的信息,因此无法编程?
Billy Moon

我的Android可以至少响应两个VID ​​/ PID,一个用于FastBoot,另一个用于正常Android操作。在正常的Android操作中,它支持两个接口,USB Mass Storage和ADB。我不知道如何精确地添加其他接口,但这显然不受硬件限制。USB小工具似乎是正确的方向。
2012年

谢谢@Renate-看起来很有希望!
比利·穆恩

2

不要放弃 Linux可以通过“ USB小工具”使用合适的硬件来实现。并给出以下事实:

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

为什么所有这些都相关?

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

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

它是Linux内核,如果您感兴趣的话,代码位于kernel.org树的drivers / usb / gadget /中。Android确实有一些不在主线中的特定小工具补丁,但这还不是全部。您只需检查其内核git树即可看到所有这些信息,而无需打扰其开发人员。

我想您会对此有所了解-但它会涉及到重新编译android内核/操作系统-或至少拥有一个构建环境,您可以在其中/可以/重新构建内核。

顺便说一句,我有一个Atmel NGW100mkII,它支持USB小工具,但未随HID模块一起提供。而且,我将不得不做上面的事情以及更多。


我将尽量不放弃-但如果从一开始就完全不可能的话,这似乎是一项艰巨的任务。您在这篇文章中给了我很多思考/研究的机会。谢谢。
比利·穆恩

我刚刚找到了一个越​​狱iPhone的应用程序,它将它变成具有多个可选“虚拟磁盘”的USB海量存储设备,并更改了USB devId,因此它不会启动iTunes / Photo Import。(对您没有帮助,但这对于iPhone来说是很棒的东西)。我还为我的Texas TI84 + SE计算器找到了一个USB库,可以完成您想要的操作(它也可以解锁Playstations)。无论如何,我的三星Galaxy Note今天就到货了,所以我实际上将有一个Android设备。
Orwellophile 2012年


1

您必须建立某种连接才能直接使用android,例如通过tcp / ip和adb,因此不要在计算机上至少安装adb和一个监听器。

但是,如果您有一项活动通过USB发送像数据一样的硬件键盘,那为什么不呢?我猜这不会容易。这时,usuas论坛的答案马上就来了:“为什么不更改计划并....“ :)


1
我不想更改我的计划,因为我想开发一个库,该库允许android用作标准计算机设备的硬件键盘。作为开发人员或用户,这显然比必须绕过某种需要非标准设置的抽象通信协议更好。
比利·穆恩

1

其他人发现这是错误的。同时,我也分享他们的看法。对不起。

答案:

我认为这几乎是不可能的。

您的计算机会使用USB设备描述符或usb接口描述符识别任何USB设备。为了能够将您的android设备用作键盘,您必须进行更改。实际上,我认为这些已保存在设备的ROM中,因此您必须更改硬件。即使设备仅在关闭状态下充电,设备也需要与主机进行自我识别(必须告知USB主机功耗,否则只能告诉几个mA)。对我来说,这指明了方向,那就是您必须更换硬件

“最简单”的方法可能是组装一个包含带µC的USB主机芯片的适配器,该适配器将接收到的数据(您仍然必须通过USB发送)转换为ps / 2或u客户端信号,然后再发送给计算机。

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


您能否指向一个资源来证实您对Android USB连接的ROM标识的怀疑?
比利·穆恩

2
我在您的回答上打了勾,看起来很正确-尽管我想确认一下Android描述符已被硬编码。,〜)
Billy Moon

4
是错的。Android上的大多数USB设计都是通过软件实现的。
达尔文,

1

对于这个问题,我来不及评论了,但对其他一些人可能有用。

您可以使Android手机像键盘,鼠标,摄像头,声音流系统,网络共享设备一样工作。简而言之,您会在市场上看到什么USB设备,直到并且除非硬件没有限制您。例如速度或小工具界面不可用。

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

但是对于所有这些,您必须修改android内核。如果您是android设备开发人员,则可以确定。


3
根据记录,这不是博客,也不应该这样对待。查看常见问题以了解更多信息。编辑:关于那条注释,考虑在meta out上检查此问题
Jules 2013年

0

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

其他跨平台工具(即Windows / mac控制另一个Windows / mac实例)也采用了类似的方法。参见协同作用:http : //synergy-foss.org/


感谢您的反馈,但是我实际上只是在寻找一款电话软件,而计算机上没有安装任何软件。
比利·穆恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.