【问题标题】:Unable to send keyboard events to Bluetooth HID connected device无法将键盘事件发送到蓝牙 HID 连接的设备
【发布时间】:2021-05-31 06:25:17
【问题描述】:

我能够成功连接到蓝牙 HID 设备并能够控制配对设备的主页按钮和导航按钮。 但无法将键盘按键事件正确发送到 HID 设备。当我在主机设备中输入内容时,HID 设备会随机响应。

我有以下代码用于与描述符数组的连接,

override fun onServiceConnected(profile: Int, proxy: BluetoothProfile?) {
            if (profile == BluetoothProfile.HID_DEVICE) {
                mBtHidDevice = proxy as BluetoothHidDevice

                val sdp = BluetoothHidDeviceAppSdpSettings(
                    "HidControl",
                    "Android HID Joystick",
                    "Android",
                    0xC0.toByte(),
                    descriptor
                )
           }
       }

描述符数组如下,

private val descriptor = byteArrayOf( // HID descriptor
    0x09,  // bLength
    0x21,  // bDescriptorType - HID
    0x11, 0x01,  // bcdHID (little endian - 1.11)
    0x00,  // bCountryCode
    0x01,  // bNumDescriptors (min 1)
    0x22,  // bDescriptorType - Report
    0x30, 0x00,  // wDescriptorLength (48)
    // Report descriptor
    0x05, 0x01,  // USAGE_PAGE (Generic Desktop)
    0x09, 0x06,  // USAGE (Key board)
    0xa1.toByte(), 0x01,  // COLLECTION (Application)
    0xa1.toByte(), 0x00,  //   COLLECTION (Physical)
    0x05, 0x09,  //     USAGE_PAGE (Button)
    0x19, 0x01,  //     USAGE_MINIMUM (Button 1)
    0x29, 0x04,  //     USAGE_MAXIMUM (Button 4)
    0x15, 0x00,  //     LOGICAL_MINIMUM (0)
    0x25, 0x01,  //     LOGICAL_MAXIMUM (1)
    0x75, 0x01,  //     REPORT_SIZE (1)
    0x95.toByte(), 0x04,  //     REPORT_COUNT (4)
    0x81.toByte(), 0x02,  //     INPUT (Data,Var,Abs)
    0x75, 0x04,  //     REPORT_SIZE (4)
    0x95.toByte(), 0x01,  //     REPORT_COUNT (1)
    0x81.toByte(), 0x03,  //     INPUT (Cnst,Var,Abs)
    0x05, 0x01,  //     USAGE_PAGE (Generic Desktop)
    0x09, 0x30,  //     USAGE (X)
    0x09, 0x31,  //     USAGE (Y)
    0x15, 0x81.toByte(),  //     LOGICAL_MINIMUM (-127)
    0x25, 0x7f,  //     LOGICAL_MAXIMUM (127)
    0x75, 0x08,  //     REPORT_SIZE (8)
    0x95.toByte(), 0x02,  //     REPORT_COUNT (2)
    0x81.toByte(), 0x02,  //     INPUT (Data,Var,Abs)
    0xc0.toByte(),  //   END_COLLECTION
    0xc0.toByte() // END_COLLECTION
)

向目标设备发送键盘事件的代码如下

override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
    Log.d("Key Codes ", "$keyCode + event: $event")
    for (btDev in mBtHidDevice!!.connectedDevices) {

        mBtHidDevice!!.sendReport(
            btDev, 0, byteArrayOf(event!!.keyCode.toByte())
        )
        mBtHidDevice!!.sendReport(
            btDev, 0, byteArrayOf(
                0
            )
        )
    }
    return super.onKeyUp(keyCode, event)

}

如果我在这里遗漏了什么,请提出建议。感谢您的帮助!

【问题讨论】:

  • 我不是 Kotlin 或蓝牙专家,因此无法提供实际答案,但我认为有几点需要注意: 1. BluetoothHidDeviceAppSdpSettings 设备子类应为 0x00(而不是 0xc0. toByte()), 2. 我将删除 .toByte() 的所有实例,因为它们不执行任何操作(将字节转换为字节),3. HID 报告描述符似乎用于带有 4 个按钮的操纵杆 - 所以我会用键盘的报告描述符替换它。在usb.org/sites/default/files/hid1_11.pdf(官方USB设备类规范)的附录E中给出了一个例子。

标签: android android-bluetooth hid


【解决方案1】:

您需要使用键盘使用页面。

我看到的逻辑最小值和逻辑最大值只有 1 到 4。你只想要这些 USAGE 吗?

参考HID使用表https://www.usb.org/document-library/hid-usage-tables-122

附录中有一个键盘用例。你可以参考一下。

【讨论】:

    猜你喜欢
    • 2013-02-13
    • 2014-12-08
    • 2013-01-23
    • 2016-07-08
    • 1970-01-01
    • 2018-07-07
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多