【问题标题】:Simulate USB/Bluetooth HID device locally in order to inject events?在本地模拟 USB/蓝牙 HID 设备以注入事件?
【发布时间】:2014-08-06 13:06:51
【问题描述】:

是否可以模拟连接到 Android 的 USB 或蓝牙设备?

我想制作一个能够本地模拟 HID 设备的应用。我的意思是:该应用程序应该让 Android 相信连接了 USB/蓝牙 HID 设备。我希望这将允许我的应用程序在全球范围内注入触摸事件。反正有模拟(虚拟)设备吗?请注意,我并不真正关心设备,我只想使用对 HID 输入的内置支持。

我知道很多人已经询问过触摸事件注入,但这种方法似乎有点不同。我确实想将它用于测试目的,所以 InstrumentationTestCase 之类的东西不会有帮助。

root 设备可能是一种选择,尽管我也可以想象要求我的最终用户手动安装专门签名的应用程序(根据 https://stackoverflow.com/a/16737083/2923406https://stackoverflow.com/a/22902808/2923406 这是可行的,但它是特定于设备的)。

我知道:

  1. Simulate a mouse input on android - 这个人似乎在他自己的应用程序中做到了,尽管他的问题没有得到回答;)

  2. http://www.pocketmagic.net/2013/01/programmatically-injecting-events-on-android-part-2/#.U58SqfldVHV - 需要 Root。有人成功使用这个吗?此外,该解决方案似乎又是针对特定设备的。

  3. Bluetooth + simulating mouse - 这不是我想要的。手机本身不应是 HID 设备,而应使用(虚拟创建的)设备本身。同样的: https://stackoverflow.com/a/8174973/2923406

请注意,我确实想将我的手机变成任何类型的 HID 设备。

【问题讨论】:

  • 否 - 作为设计原则,应用程序不得在系统或其他应用程序中冒充用户。如果在没有外部硬件的情况下意外发生,那将被视为安全漏洞并已修补。

标签: android hid touch-event


【解决方案1】:

模拟是一个广义的术语。创建蓝牙应用时,我以两种方式“模拟”了蓝牙连接。

方式 1:使用 serial port UART converter 并将其连接到 Bluetooth module 发射器。

然后你可以使用像CoolTerm这样的终端程序来发送你的数据。

喜欢so。在这种情况下,我编写了一个字符串以在与设备成功连接时发送,但是您可以进行无限循环以有效地进行测试,而不需要将您的手机变成 HID 设备。

方式 2(不容易):在服务器/客户端关系模型中使用您的计算机蓝牙。

这更难做到。您可以做的是将您的 pc/mac 转换为服务器,将 Android 手机转换为客户端,反之亦然。为此,您需要编写需要在 jvm(java 虚拟机)上单独编译的外部代码。可以在here 找到执行此操作的过程。如果您使用的是 Linux 机器,则必须单独下载 Bluez 模块。除了 Ubuntu 之外,我还没有在任何其他操作系统上尝试过这个,而且很难运行。

希望对您有所帮助。

【讨论】:

  • 这没有回答所提出的问题,因为它涉及实际(而不是模拟)硬件。
  • @ChrisStratton 我尽我所能回答了这个问题。我相信我与 Rolf 进行了聊天讨论并帮助他解决了这个问题。欢迎您提出您的解决方案(如果您知道的话)。根据您在上述问题中的评论,这正是我告诉 Rolf 并给了他这些替代方法的内容。
  • 您的评论聊天的结果(附加到已删除的未回答)是您告诉 Rolf“它不能按照您想要的方式完成”这是您应该从一开始就发布的内容.您在此处的可见答案给人的印象非常不同,因为它解决的问题与曾经提出的任何问题都大不相同。你进行这么长时间讨论的全部原因是,Rolf 花了一段时间才发现你实际上并没有回答他的问题,也没有提出任何可以真正解决他的问题的建议。
  • @ChrisStratton Rolf 发布的答案(错误地)在其中包含 cmets。在这些 cmets 中,我告诉他,如果我没记错的话,明确表示不能按照他想要的方式完成。我想我也记得引用了安全原因。
【解决方案2】:

是的,使用 AOA2 协议检查 thisthis 链接非常简单(您需要将设备切换到附件模式)

【讨论】:

  • 问题是如何模拟硬件,而不是如何使用实际硬件。
  • 以上述方式使用 AOA2 与使用已接受答案中提到的 BluZ 蓝牙堆栈完全相同,唯一不同的是 AOA2 HID 是通过 USB 进行的,而 BlueZ 解决方案是结转BT
  • 没有。问题根本不是关于实际硬件,而是关于模拟它。
  • 使用 BluZ 或 AOA2 U 可以通过台式机模拟设备,而不是 USB/BT 硬件键盘等物理设备
  • 首先,不,它不能 - 数据以不同的方式进入 android 并得到不同的处理。但更重要的是,这无关紧要,因为让一个硬件伪装成另一个硬件仍然需要一个硬件。问题是关于通过让手机上的软件伪装成硬件来规避手机的安全性,而这(出于显而易见的原因)被安全模型阻止了。
【解决方案3】:

使用Robolectric 库可能会(或至少更容易)这可能会在本地模拟完整的 Android 设备。虽然它主要用于测试,但它在本地模拟整个设备(包括Bluetooth 和 USB)这一事实意味着添加到它可能是一种更简单的方法。

换句话说,您可以修改它用来在本地模拟这些能力的类(即在没有模拟器或设备的 IDE 本身中),以便在设备本身上模拟它们。毕竟,它确实提供了这些功能的完整模拟。您可以简单地更改这些蓝牙和 USB 模拟类以加载到设备本身,而不是加载到本地 Robolectric 测试“设备”。

这只是一个想法 - 我无法确认这是否可行 - 这可能是您开始的好地方。

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 2011-11-16
    • 2015-03-20
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多