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

时间:2012-03-21 13:35:39

标签: android keyboard usb

我真正想知道的是它是硬件问题还是软件问题。我可以通过USB将我的Android手机插入电脑,并将其作为硬件键盘。我不想在计算机上安装任何东西,我希望android的行为与标准硬件一样。


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

13 个答案:

答案 0 :(得分:37)

我在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已植根,您可以直接从应用中刷新内核,并随之发送按键。

答案 1 :(得分:12)

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

话虽如此,有可能使用Android的USB capabilities,以及在默认HID不足的情况下编写自定义驱动程序,以实现您的目标。这可能是一项非常重要的工作。

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

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

答案 2 :(得分:11)

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

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

它涉及一些内核重新编译和一些编辑,你放弃了部分功能(MDC?)..但它已经完成了。

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

答案 3 :(得分:4)

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

  

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

答案 4 :(得分:3)

我能看到这种可能性的唯一方法就是:

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

  • 制作了一些附在设备上的特殊硬件电平转换器。

(所以我想,根据你想做多少工作,它可能是硬件软件问题。)

答案 5 :(得分:2)

我相信如果你有一个带有最新Android的root设备,你可以这样做。例如,运行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

答案 6 :(得分:2)

您的Android在插入主机时已经识别出VID / PID。 它已经具有Mass Storage接口。 您需要以低级别破解驱动程序以支持03:01 HID的第二个接口。 那么这只是将扫描码推送到修改后的驱动程序的问题。 这并不简单,但这将是一个整洁的黑客。 一种用途是为登录键入长随机密码。

答案 7 :(得分:2)

不要放弃。 Linux可以通过“USB Gadgets”使用合适的硬件来实现。并提供以下事实:

  1. 我的旧诺基亚N95可以使用它的USB作为“大容量存储设备”,“媒体播放器”,“GSM调制解调器”,或打印照片。
  2. 我可以通过Apple USB-Camera无源适配器将iPhone插入iPad,然后传输照片。
  3. iPhone可以作为许多东西显而易见,例如当他们进入DFU时。
  4. 为什么所有这些都相关?

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

    阅读此处发布的其中一个链接,

      

    这是Linux内核,代码在驱动程序/ usb / gadget /中   kernel.org树如果你有兴趣的话。 Android确实有一些   不在主线中的特定小工具补丁,但并非全部   那么多。你可以通过检查他们的内核来看到所有这些   git tree,不需要打扰他们的开发人员。

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

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

答案 8 :(得分:2)

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

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

在Indiegogo广告系列中查看描述性视频:http://igg.me/at/hiDBLUE/x/3400885

BTW:产品技术文档可在此处获取:http://www.flyfish-tech.com/hiDBLUE

答案 9 :(得分:1)

你必须建立某种连接来做那个开箱即用的机器人,比如通过tcp / ip和adb,所以不能没有在计算机上安装至少adb和一个监听器。< / p>

但是如果你有一个通过usb发送硬件键盘数据的活动那么为什么不呢?我想是不容易的。在这一点上,usuas论坛的答案马上就出现了:“你为什么不改变你的计划......”:)

答案 10 :(得分:1)

其他人发现这是错误的。在此期间,我分享他们的意见。对不起。

错误回答:

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

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

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

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

答案 11 :(得分:1)

我在这个博客上发表评论有点迟,但对其他人来说可能有用。

你可以使你的Android手机像键盘,鼠标,相机,声音流系统,网络共享设备一样工作。简而言之,除了硬件不限制你之外,你在市场上看到的所有小工具。如速度或小工具界面不可用。

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

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

答案 12 :(得分:0)

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

其他跨平台工具(即控制另一个Windows / mac实例的windows / mac)使用类似的方法。请参阅synergy:http://synergy-foss.org/