是否有可能将Android编程为物理USB键盘?
我真正想知道的是这是硬件问题,还是软件问题。 我可以通过USB插入我的android手机到电脑,并作为一个硬件键盘。 我不想在电脑上安装任何东西,我希望Android的行为像标准的硬件。
编辑:澄清我想编写一个android的程序/库,使设备能够完全模拟一个普通的键盘,使操作系统报告它作为一个标准的键盘设备,它可以在BIOS或任何其他地方的键盘作品。
我在Nexus 7上修改了内核,就像标准的HID键盘和鼠标一样,不会丢失MTP / ADB /其他USBfunction。
您可以使用usb-gadget-test命令行工具将按键和鼠标移动发送到您的PC。 我想稍后创build一个远程pipe理应用程序,它将发送重要事件并从相机接收video。
内核补丁,二进制文件和说明: https : //github.com/pelya/android-keyboard-gadget
编辑: 我已经发布了一个适当的应用程序到谷歌播放 ,如果你的Nexus 7根植,你可以从应用程序闪存内核,并发送按键与它。
大多数USB键盘需要驱动程序才能运行。 任何超出标准HID驱动程序function的键盘function(非标准button)都需要在计算机上安装一些软件。
也就是说,使用Android的USBfunction ,以及如果默认HID不足以编写自定义驱动程序来实现您的目标,也许是可能的。 这可能是一个非常不平凡的事业。
编辑:我认为KristopherMicinski是正确的,你的股票Android的USB API的控制水平是不足以达到这个目的。 他的两个修改固件使用HID标准进行通信的解决scheme,以及一个从Android Accessory协议转换为HID的硬件中间人似乎都对我有效。 如果在计算机上安装驱动程序是不可能的,这可能是唯一的两个选项。
但是,如果您打算为此行为安装驱动程序,则应该可以编写能够处理Android USB协议的自定义驱动程序,并正确转换为正确的键盘function调用/中断。 如果使用内存,在过去的10年中,我使用的每个外围键盘都需要安装驱动程序以实现全部function,所以这可能不被视为非标准行为。 (虽然刚刚发生,这种方法将只允许设备作为Windows内的键盘,而不是在启动过程中)
看起来像有人终于做到了,这是一个小小的丑 – 但这里是:
http://forum.xda-developers.com/showthread.php?t=1871281
它涉及一些内核重新编译和一些编辑,并且你松散的部分function(MDC?)..但是完成了。
就个人而言,现在我看到了“真正的成本”,假设Android可以通过USB与串行设备进行通信,那么我可能会在Teency或其他东西上加上一个适配器。 但是,这是基于我拥有三星电子的事实,无论如何,都需要一根特殊的电缆来连接USB连接 – 如果我不得不随身携带这个该死的电缆,那么不用担心会有一个小小的设备。
似乎有人通过修补内核来完成它。 我刚刚遇到了一篇名为“利用智能手机USB连接获得乐趣和利润”的论文,由美国乔治梅森大学计算机科学系的王朝晖教授Angelos Stavrou介绍。 (可以通过使用上面的标题自由获得)。 在这里,两位研究人员正在研究Android设备通过让Android设备呈现为HID设备(键盘)来控制所连接的PC的可能性。 作为一个概念的certificate,看起来他们已经成功地修补了一个正是你想要的内核。 他们没有提供详细的步骤,但无论如何,我只是引用他们所说的话:
…..我们开发了一个特殊的USB小工具驱动程序,除了使用Linux的USB Gadget API [4]在Android Linux内核上的现有USB复合接口。 UGAL框架帮助我们实现了简单的USB人机接口驱动程序(HID)function(即设备驱动程序)以及各种内核API之间的粘合代码。 使用“drivers / usb / gadget / composite.c”中提供的代码,我们创build了自己的小工具驱动程序作为附加的复合USB接口。 该驱动程序模拟USB键盘设备。 我们还可以模拟一个USB鼠标设备发送预编程的input命令到桌面系统。 因此,简单地将其作为一个普通的USB鼠标或键盘设备,并悄悄发送预定义的命令来模拟恶意的交互式用户活动。 为validation此function,在我们的受控实验中,我们发送键码序列来执行非致命操作,并显示如何操作的设备可能造成损害。特别是,我们模拟戴尔USB键盘(vendorID = 413C,productID = 2105) CTRL + ESC“组合键和”U“和”Enter“键序列重新启动机器。 请注意,这只需要USB连接,并且可以在桌面系统上获得“当前用户”权限。 通过将额外的本地或远程漏洞利用作为有效负载发送,恶意软件可以提升权限并获得桌面系统的完全访问权限。
我能看出这是可能的唯一方法是如果你:
- 修改了Android固件,使您可以在足够低的水平上使用USB接口访问,您可以使用必要的协议进行操作
要么
- 制造一些你连接到设备上的特殊硬件电平转换器。
(所以我想,根据你想做多less工作,这可能是一个硬件或软件的问题。)
我相信你可以做到这一点,如果你有一个最近的Android根植设备。 例如,运行Android 4的Asus Eee Pad Transformer具有库 /system/lib/libusb.so
和/system/lib/libusbhost.so
,因此您可以编写一个Java应用程序,使用JNI调用它们来模拟USB键盘。这意味着你必须编写一些模拟USB键盘与PC通信方式的胶水C代码(=你必须研究USB协议的工作方式)。
我说“扎根”,因为通常需要使用这些库的一些权限。
编辑:编程一个Android设备作为USB主机时,上面是真实的,在你的情况下,你需要成为一个“小工具”。 我不知道您的Android设备的内核中包含多lessLinux小部件function。 看到这个类似的问题。
插入主机时,您的Android已经识别出VID / PID。 它已经有一个海量存储界面。 您将需要在低级别破解驱动程序,以支持03:01 HID的第二个界面。 那么这只是将扫描码推送到修改后的驱动程序的问题。 这不是简单的,但它将是一个整洁的黑客。 一个用途是inputlogin长随机密码。
不要放弃。 Linux可以通过“USB小工具”使用正确的硬件来实现。 并给出以下事实:
- 我的旧诺基亚N95可以使用它的USB作为“大容量存储设备”,“媒体播放器”,“GSM调制解调器”,或打印照片。
- 我可以通过Apple USB摄像头无源适配器将iPhone插入iPad,并传输图片。
- iPhone可以作为一些东西明显存在,例如,当它们进入DFU时。
为什么这一切都有关系?
因为如果我正在编写一个Linux手机,我知道它会做什么,以及如何做到这一点。 答案将涉及USB小工具。
阅读这里发布的链接之一,
这是Linux内核,如果您有兴趣,代码位于kernel.org树中的drivers / usb / gadget /中。 Android确实有一些不在主线上的特定小工具补丁,但并不是那么重要。 你可以通过检查他们的内核git树来看到所有这些,不需要打扰他们的开发者。
我猜测你可能会有一些疑问 – 但是它会涉及到重新编译android内核/操作系统 – 或者至less有一个你可以/可以/重build内核的编译环境。
顺便说一句,我有一个Atmel NGW100mkII,它支持USB小工具,但不附带HID模块。 而且我将不得不做更多的事情。
这是可能的,不需要任何额外的驱动程序。
您可以使用小型USBencryption狗大小的设备模拟PC的USB键盘,然后使用您的Android设备通过蓝牙发送键盘(和/或鼠标)数据。
在Indiegogo活动中查看描述性video: http : //igg.me/at/hiDBLUE/x/3400885
顺便说一句:产品技术文件可在这里find: http : //www.flyfish-tech.com/hiDBLUE
有些人认为这是错的。 同时,我分享他们的意见。 对不起。
旧的错误答案:
在我看来,这几乎是不可能的。
您的计算机使用USB设备描述符或USB接口描述符标识任何USB设备。 为了能够使用你的Android设备作为键盘,你将不得不改变这些。 其实我认为这些都保存在设备的ROM中,所以你将不得不改变硬件。 即使只有主机处于closures状态(必须告诉USB主机有关功耗,否则只有几mA最大),设备也需要与主机进行身份识别。 对我来说,这指出了方向,你将不得不改变硬件
“最简单”的方式可能会组装一个适配器,包含一个μC的USB主机芯片,将接收到的数据(您仍然需要通过USB发送)转换成ps / 2或usb-client信号发送到计算机。
在我看来,最简单的方法是:购买这些键盘之一,你可以滚动,并把它们放在你的包里。
你必须build立某种连接才能完成android的开箱即用,就像通过tcp / ip和adb一样,所以不用在计算机上安装至lessadb和一个监听器。
但是,如果你有一个活动,通过USB发送像硬件键盘的数据,那么为什么不呢? 我猜不是很容易。 在这一点上,usuas论坛的答案马上就来:“你为什么不改变你的计划和…”:)
我在这个博客发表评论有点迟,但对其他人可能有用。
你可以让你的Android手机像键盘,鼠标,相机,声音stream媒体系统,共享设备工作。 简而言之,你在市场上看到什么样的USB小工具,除非硬件不限制你。 比如速度,或者小工具界面不可用。
USB设备有两种types,主机和小工具。 所以小工具的设备就像客户端一样,通常在大多数手机中都有usb接口。 因此,在小工具最终,您可以通过在不同configuration之间进行切换(当您进入USB设置并将设备设置为大容量存储器或其他设备时,您已经在执行此操作),可以使您的手机performance得像其他设备一样。
但是为了做所有这些,你必须修改android内核。 如果你是一个Android设备开发者,你可以肯定的做到这一点。
我在这里有一些用户的经验。 最明显的解决scheme是通过客户端/服务器模型的tcp / ip。 许多工具如AirKeyboard(http://www.freenew.net/iPhone/air-keyboard-111/171415.htm)利用这种方法来创build使用智能手机操作系统的键盘/鼠标更换。; 请注意,在实现中会出现一些安全问题。 例如,您必须login才能使用服务器组件。
其他跨平台工具(即控制另一个Windows / Mac实例的Windows / Mac)使用类似的方法。 看到协同作用: http : //synergy-foss.org/