c++ - 在 Windows 10 上为 BLE GATT 设备开发 HID 输入设备驱动程序

标签 c++ windows-10 bluetooth-lowenergy driver hid

(这是一个 crosspost from the MSDN forums,因为已经有一段时间没有任何回应了,我想我会在这里得到更好的答案。)

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

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

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

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

在 Windows 10 上是否仍然允许 GATT 配置文件驱动程序,因为它似乎是 not allowed to create filter drivers for BthLeEnum ?

更新

我非常感谢 Alain 花时间回答问题,因此我将他的回答标记为对问题的回答;但是对我来说,这个问题还没有完全回答。看到这个问题已经获得了 10 多票,我认为它应该得到一个更广泛的答案。可以改进/添加的要点是:

  • 建议背后的论据(例如,为什么使用 UMDF 微型驱动程序而不是 VHF 驱动程序,为什么要使用需要使用 cppwinrt 而不是简单地使用我在研究中发现的 C++ 蓝牙功能的 UWP 蓝牙 API,编写 GATT 配置文件驱动程序怎么样? , ETC。)。如果没有这种争论,我不会从建议中学到很多东西。
  • 回答我的子问题
  • 使用驱动程序中的 cppwinrt 代码的示例以及是否可以在那里访问这些 API。是否有任何限制( since the code will not be running from an appx )? Cppwinrt 在这里被宣传为新事物,但我找不到在驱动程序上下文中使用 cppwinrt 的任何文档。
  • 对我自己的研究的一些反射(reflection) - 目前的答案并未涉及我发现哪些点是好的或不好的。这种反射(reflection)将帮助我更好地理解这个主题。

更新 2

我想 Alain 建议使用 UMDF HID 微型驱动程序而不是 VHF,因为 VHF 需要编写 KMDF 驱动程序。 UMDF 的优点是更容易调试(可以在本地 pc 上调试),更少的安全(和签名)限制,并且在驱动程序中存在错误时没有错误检查机器的风险。

更新 3

为了能够创建一个注入(inject) RadialController 事件的客户端应用程序(而不是编写一个对私有(private)开发人员来说是一个非常高的障碍的驱动程序),我发布了一个 request for it on Feedback Hub .如果您认为值得支持,请考虑投票。

最佳答案

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

在非商店应用程序中使用 UWP API 存在一些歧义,但这是不正确的。这些 API 在几乎所有条件下都可用。如果您在设置项目时需要帮助,这里有一个可以帮助您入门的 C++/UWP 示例。

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

关于c++ - 在 Windows 10 上为 BLE GATT 设备开发 HID 输入设备驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45773666/

相关文章:

c# - 找不到名称/键 X 的资源

android - Android 6 (Marshmallow) 中的不稳定 BLE 连接

安卓蓝牙 LE : get Gatt of already connected Device

security - 低功耗蓝牙和 BR/EDR 安全性之间的区别

c++ - 在 C++ 代码中按字母顺序自动排序函数

c++ - 必须在 C++ 中删除动态分配的内存?

wpf - 适用于经典 WPF 桌面应用程序的 Windows 10/8 开始菜单磁贴图标大小

bash - 让 Windows 10 的 bash 与 console2 一起工作

c++ - 将 const 引用传递到构造函数链中

c++ - 模板相互依赖