在Windows10上为BLEGATT设备开发HID输入设备驱动程序

Developing an HID input device driver for a BLE GATT device on Windows 10

本文关键字:开发 HID 输入 设备驱动程序 Windows10 上为 BLEGATT      更新时间:2023-10-16

(这是MSDN论坛上的交叉帖子,因为那里已经有很长一段时间没有任何回应了,我想我会在这里得到更好的答案。)

我有一个包含自定义GATT服务的BLE设备,我无法修改其固件。我想从该服务中侦听GATT特征事件,并使Windows将它们作为HID报告使用,以使Windows将其识别为另一个设备。我该怎么做?

我进行了一些研究,发现了以下信息:

  • WDK 8.0中有BLE GATT Profile驱动程序示例,但它们已经过时,不能与VS2017/WDK10一起编译
  • 为了从非HID设备注入HID报告,您需要使用虚拟HID框架,其中有更详细的页面和示例
  • 还有一个Windows物联网核心的示例
  • 似乎不允许为BthLeEnum创建筛选器驱动程序
  • MSDN上提供了适用于C++的BLE GATT函数
  • 有一个关于将它们用于客户端应用程序(而不是驱动程序)的示例

我的问题是,这里需要什么方法来创建这个驱动程序

  • 我需要创建两个驱动程序(一个虚拟HID驱动程序和一个GATT Profile驱动程序),然后以某种方式将它们相互连接吗
  • 我需要从虚拟HID驱动程序进行蓝牙LE API调用吗
  • 我需要创建一个进行HID调用的GATT配置文件驱动程序吗
  • 或者完全是别的什么

因为似乎不允许为BthLeEnum创建筛选器驱动程序,所以在Windows 10上仍然允许GATT配置文件驱动程序吗?

更新

我非常感谢阿兰花时间回答这个问题,因此我将他的回答标记为对这个问题的回答;然而,对我来说,这个问题还没有完全得到回答。鉴于这个问题已经获得了超过10票,我认为应该得到更广泛的回答。可以改进/增加的点有:

  • 建议背后的论证(例如,为什么使用UMDF迷你驱动程序而不是VHF驱动程序,为什么使用UWP蓝牙API需要使用cppwirt而不是简单地使用我在研究中发现的C++蓝牙功能,写一个GATT配置文件驱动程序怎么样,等等)。如果没有这些论证,我将无法从建议中学到很多东西
  • 我的子问题的答案
  • 从驱动程序中使用cppwirt代码的示例,以及是否可以在那里访问这些API。这有什么限制吗(因为代码不会从appx上运行)?Cppwinrt在这里被定位为一种新的东西,但我找不到任何关于在驱动程序上下文中使用cppwinnrt的文档
  • 对我自己研究的一些反思——目前的答案并没有涉及我发现哪些点是好的或不好的。这种反思会帮助我更好地理解这个话题

更新2

我想Alain推荐了一个UMDF HID迷你驱动程序,而不是VHF,因为VHF需要编写KMDF驱动程序。UMDF具有更容易调试(可以在本地pc上调试)、更少的安全(和签名)限制以及在驱动程序中存在错误时不存在错误检查机器的风险的优点。

更新3

为了能够创建一个注入RadialController事件的客户端应用程序(而不是必须编写一个驱动程序,这对私人开发人员来说是一个非常高的障碍),我在Feedback Hub上发布了一个请求。如果你认为这值得支持,请考虑投票支持。

最好的方法是创建一个UMDF HID驱动程序(https://learn.microsoft.com/en-us/windows-hardware/drivers/wdf/creating-umdf-hid-minidrivers)安装在为设备的自定义服务创建的bthlenum设备节点上,并使用新的蓝牙LE UWP API(https://learn.microsoft.com/en-us/uwp/api/windows.devices.bluetooth.genericattributeprofile)。

在非存储应用程序中使用UWP-Apis存在一些歧义,但这是不正确的。这些Api几乎在任何条件下都可用。如果你需要帮助来设置你的项目,这里有一个C++/UWP示例可以帮助你开始。

我希望这能有所帮助!阿兰

关于WDK 8.0中的BLE GATT Profile驱动程序示例,您可以按照以下步骤使用VS2017/WDK10进行编译

我能够编译WpdHealthHeartRateService。

我把它作为概念证明,但并不可靠。在我投入的时间里,开发Windows驱动程序的学习曲线太陡了。

此外,作为一个私人,我永远无法将其分发给其他人,因为司机需要经过签名和发布过程。

为了知识交流:

  • 对于我使用的驱动程序https://github.com/Microsoft/DMF与C++/WinRT相结合。我曾经https://github.com/microsoft/DMF/blob/master/Dmf/Modules.Library/Dmf_VirtualHidMini.md以及https://github.com/microsoft/DMF/tree/master/DmfSamples/VHidMini2Dmf样本作为基础,Sam Tertzakian得到了很多 s
  • 我建立了一个UWP应用程序
    • 发现我的BLE设备并通过HID命令将其唯一ID发送给驱动程序
    • 通过HID命令打开/关闭驱动程序功能
  • 驱动程序中的C++/WinRT部分可以使用WinRT-BLE API(使用所提供的唯一ID)连接到BLE设备,并将传入事件流式传输到驱动程序的HID部分
  • 驱动程序的HID部分将事件作为HID输入注入Windows