Я столкнулся с проблемой, когда кодировал тестовое приложение (WPF, C #, .NET 4.7) для своей домашней клавиатуры.Клавиатура подключается через USB и отображается как HID-устройство типа клавиатуры.Теперь я хочу отправить некоторые данные (config, backlight info, ...) на клавиатуру.
На стороне клавиатуры находится микроконтроллер ARM, который инициализируется с помощью HID-Report-Descriptor для клавиатуры., содержащий дополнительный тег OUTPUT для некоторых данных конфигурации, которые будут отправлены на клавиатуру.(4 байта)
Вот текущий дескриптор отчета MCU:
__ALIGN_BEGIN static uint8_t
JKP_HID_ReportDesc_FS[USBD_JKP_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs) ; Modifier Byte (1 byte)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x03, // INPUT (Cnst,Var,Abs) ; Reserved Byte (1 byte)
0x95, 0x05, // REPORT_COUNT (5)
0x75, 0x01, // REPORT_SIZE (1)
0x05, 0x08, // USAGE_PAGE (LEDs)
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
0x29, 0x05, // USAGE_MAXIMUM (Kana)
0x91, 0x02, // OUTPUT (Data,Var,Abs) ; LED Report
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x03, // REPORT_SIZE (3)
0x91, 0x03, // OUTPUT (Cnst,Var,Abs) ; LED Report Padding (LEDs 1 byte)
0x95, USBD_JKP_HID_REPORT_KEY_ROLLOVER, // REPORT_COUNT (USBD_JKP_HID_REPORT_KEY_ROLLOVER)
0x75, 0x08, // REPORT_SIZE (8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x65, // LOGICAL_MAXIMUM (101)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, // INPUT (Data,Ary,Abs) ; Key Arrays (6 bytes)
0x06, 0x00, 0xff, // USAGE_PAGE(Vendor Defined Page 1)
0x09, 0x01, // USAGE(Venor Usage 1)
0x15, 0x00, // LOGICAL_MINIMUM(0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM(255)
0x75, 0x08, // REPORT_SIZE(8)
0x95, 0x04, // REPORT_COUNT(4)
0x91, 0x02, // OUTPUT(Data,Var,Abs) ; JKP Config Info (4 bytes)
0xc0 // END_COLLECTION
};
На стороне ПК у меня есть приложение WPF, написанное на C # и использующее Windows.Devices.HumanInterfaceDevice API.
Вот код приложения WPF:
Console.WriteLine("Init HID Device Write...");
byte[] data = new byte[] { 0x00, 0xaa, 0xaa, 0xaa, 0xaa};
string device_selector = HidDevice.GetDeviceSelector(0x01, 0x06, 1155, 1024);
var devices = await DeviceInformation.FindAllAsync(device_selector);
if (devices.Any())
{
Console.WriteLine("HID Devices Found: " + devices.Count);
DeviceInformation devinfo = devices[0];
Console.WriteLine($"HID Selected Device Info: ID: {devinfo.Id}, Name: {devinfo.Name}");
HidDevice device = await HidDevice.FromIdAsync(devinfo.Id, Windows.Storage.FileAccessMode.ReadWrite);
if (device != null)
{
Console.WriteLine("HID Device writing...");
HidOutputReport report = device.CreateOutputReport(2);
DataWriter dataWriter = new DataWriter();
dataWriter.WriteBytes(data);
report.Data = dataWriter.DetachBuffer();
await device.SendOutputReportAsync(report);
}
else
{
Console.WriteLine("Failed to open HID device.");
}
}
else
{
Console.WriteLine("No devices found.");
}
Несмотря на то, что устройство клавиатуры найдено, API Windows.Devices.HumanInterfaceDevice блокирует все подключения к типу клавиатурыHID устройства.
Есть ли альтернатива Windows API, которая будет поддерживать такие соединения?
Я уже пробовал HIDSharp и hidlibrary.Также я не хочу использовать USB-композитное устройство.
Заранее спасибо.