Разработка драйвера устройства ввода HID для устройства BLE GATT в Windows 10

(Это crosspost с форумов MSDN, так как там не было никакого ответа там в течение некоторого времени, и я думал, что буду получите лучшие ответы здесь.)

У меня есть устройство BLE, содержащее пользовательскую службу GATT, из которой я не могу изменить прошивку. Я хочу прослушать характерные события GATT из этой службы и заставить Windows использовать их как отчеты HID, чтобы Windows распознала это как другое устройство. Как я могу это сделать?

Я провел некоторое исследование и нашел следующую информацию:

Мой вопрос: какой подход нужен здесь для создания этого драйвера?

  • Нужно ли мне создавать два драйвера (виртуальный HID-драйвер и драйвер профиля GATT), а затем каким-то образом подключать их друг к другу?
  • Нужно ли мне делать вызовы Bluetooth LE API от виртуального HID-драйвера?
  • Нужно ли мне создавать драйвер профиля GATT, который делает вызовы HID?
  • Или что-то еще?

В Windows 10 все еще разрешены драйверы профиля GATT, так как кажется, что не разрешено создавать драйверы фильтров для BthLeEnum?

Update

Я очень признателен, что Ален нашел время, чтобы ответить на вопрос, и поэтому я отметил его ответ в качестве ответа на вопрос; однако для меня вопрос еще не полностью ответил. Увидев, что вопрос уже получил более 10 голосов, я думаю, что он заслуживает более широкого ответа. Точками, которые могут быть улучшены/добавлены, являются:

  • аргументация за советом (например, почему мини-драйвер UMDF вместо VHF-драйвера, зачем использовать API-интерфейсы UWP bluetooth, требующие использовать cppwinrt вместо простого использования функций Bluetooth С++, которые я нашел в своих исследованиях, как насчет написания драйвера профиля GATT, и т.д.). Без этой аргументации я не буду многому научиться из совета.
  • отвечает на мои подзапросы
  • примеры использования кода cppwinrt из драйвера и есть ли доступ к этим API там. Существуют ли какие-либо ограничения для этого (поскольку код не будет запущен из приложения)? Cppwinrt здесь называется чем-то новым, но я не могу найти документацию об использовании cppwinrt в контексте драйвера.
  • некоторые размышления о моих собственных исследованиях - текущий ответ не затрагивает, какие моменты я нашел, хорошие или нет. Это отражение поможет мне лучше понять эту тему.

Ответы

Ответ 1

Лучшим подходом к этому было бы создание драйвера HID UMDF (https://docs.microsoft.com/en-us/windows-hardware/drivers/wdf/creating-umdf-hid-minidrivers), который устанавливается на устройстве bthleenum node который создается для пользовательского сервиса устройства и использует новый интерфейс LE LE UWP (https://docs.microsoft.com/en-us/uwp/api/windows.devices.bluetooth.genericattributeprofile).

Существует некоторая двусмысленность в отношении использования UWP Apis из приложения non store, но это неверно. Эти Apis можно использовать практически во всех условиях. Если вам нужна помощь в настройке вашего проекта, вот пример С++/UWP, который поможет вам начать работу.

Надеюсь, это поможет! Ален