繁体   English   中英

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

[英]Is it possible to program Android to act as physical USB keyboard?

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


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

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

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

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

编辑: 我已经向Google Play发布了一个合适的应用程序 ,如果您的Nexus 7已植根,您可以直接从该应用程序中闪存内核,并发送带有它的按键。

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

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

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

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

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

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

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

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

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

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

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

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

要么

  • 制作了一些附加到设备的特殊硬件级转换器。

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

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

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

  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模块。 而且我将不得不做以上甚至更多。

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

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

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

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

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

\n

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

编辑:当编程Android设备充当USB主机时,以上情况属实,在您需要的情况下,您需要成为“小工具”。 我不知道Android设备的内核中包含了多少Linux小工具功能。 请参阅类似问题。

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

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

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

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

你必须建立某种连接来做那个android-out-of-the-box,比如通过tcp / ip和adb,所以不能没有在计算机上安装至少adb和一个监听器。

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

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

错的回答:

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

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

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

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

发布到一个旧线程,但这就是我搜索它时出现的问题,试图在只有蓝牙键盘的新台式电脑上安装操作系统,我花了一段时间才找到一个可行的解决方案。

我无法从 2013 年获得接受的答案来处理最近的硬件,但仍然可以使用https://github.com/tejado/android-usb-gadget的资源获得一些东西。 该应用程序仍在编译/USB-Keyboard-app 中,但我无法让它工作。 对我有用的是:

  1. 有一个扎根的电话(我用过magisk )。 (顺便说一句,由于解锁引导加载程序的安全隐患,我不建议无缘无故地对您的日常手机执行此操作,但这里需要它)。
  2. 安装https://github.com/tejado/android-usb-gadget
  3. 确保用于设置手机的手机和 PC 连接到同一本地网络
  4. 启用 adb-over-wifi(开发人员设置中的无线调试)。 点击开发者设置中的条目以查找地址和端口。
  5. 在 PC 上, adb connect [address and port] ,例如adb connect 192.168.1.123:45678
  6. https://github.com/pelya/android-keyboard-gadget/tree/master/hid-gadget-test获取 hid-gadget-test 二进制文件
  7. adb push hid-gadget-test /sdcard/
  8. adb shell然后su
  9. cp /sdcard/hid-gadget-test /data/local/tmp/
  10. chmod u+x /data/local/tmp/hid-gadget-test
  11. 从第 2 步打开应用程序,点击顶部的“添加”图标,然后点击“鼠标和键盘”,然后启用它。
  12. 在 PC 上,仍然使用第 8 步中的 adb 作为 root, /data/local/tmp/hid-gadget-test /dev/hidg0 keyboard
  13. 通过 USB 将手机连接到您要控制的任何设备; 它应该被识别为标准键盘
  14. 在 PC 上的命令行中,点击任意键,然后“输入”以发送。 它还支持特殊键(如“enter”或“f2”)。 hid-gadget-test -h

在最近构建的 Pixel 4 上进行了测试,但我预计 2022 年其他接近 AOSP 的手机也可以使用,例如 Pixel 6。 我至少可以 go 进入我的新桌面的启动设置,安装操作系统并配对我的蓝牙键盘,使用我的旧笔记本电脑通过电话远程发送密钥。 仍将 go 归功于上面链接的 2 个 github 存储库的所有者,以完成所有工作。

现在也许有人可以编写一个更新的、工作的前端应用程序来使用小工具工具应用程序,而不是使用 hid-gadget-test over adb?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM