DIY蓝牙键盘(1) - 理解 键盘报文(免费)

DIY蓝牙键盘(1) - 理解键盘报文

1. 键盘报文体验

一个键盘对于用户的体验是,用户按按键A他能看到字母A会在主机上显示出来。那这是如何实现的?

其实很简单,只要键盘发送下面的两个报文给主机,字母A就能在主机上显示出来。

(1)表1:字母A按下的报文

Byte 0 Byte 1 Byte 2 Byte 3 Byte 4
0x00 0x04 0x00 0x00 0x00

(2)表2:字母A松开的报文

Byte 0 Byte 1 Byte 2 Byte 3 Byte 4
0x00 0x00 0x00 0x00 0x00

报文的原则很简单,就是它把字母A所以对应的usage发给主机,主机就能显示出字母A. 以上表1按下报文Byte 1的值就是字母A的usage, 这个在USB官网的HID usage table(https://usb.org/sites/default/files/hut1_22.pdf)里面有定义。因为这个是USB标准所定义的,现在所有的操作系统都会认识这个usage, 于是主机会把0x04翻译成字母A.

有人要问了,那看起来只要发一个报文就可以输出A了,为什么还要再发一个松开的报文?

大家在用键盘的时候应该有这个体验,我们要输入一个字母A, 会按下A键然后松开。如果你一直按着字母A, 那么在主机上会看到一直会有字母A输出,下到你松开按键A.

当键盘只给主机发送一个A键盘按下的报文(表1),那么主机会一直输出字母A,这自然不是我们想到的。因此我们在发送完按下的报文后,还要发送松开的报文告诉主机说按键已经松开了。表2中把Byte 1的值改为0x00就是告诉主机按键已松开。

2. 按键实验

我们有了之上的知识后,那么比如我现在想要输入其他的字母要怎么做?

第一步我们要找到HID usage table(https://usb.org/sites/default/files/hut1_22.pdf),然后找到其他字母对应的usage并发出去。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UoLjMqi3-1631431089485)(C:\\Users\\86180\\AppData\\Roaming\\Typora\\typora-user-images\\image-20210912112932516.png)

上面我截取了一段键盘按键的usage, N的usage为0x11, i的usage为0x0C, c的usage为0x06, e的usage为0x08. 所以如果我要让主机输出单词Nice, 键盘必须要发出下面4组报文(report).

(1)发送N的报文

Byte 0 Byte 1 Byte 2 Byte 3 Byte 4
0x00 0x11 0x00 0x00 0x00
Byte 0 Byte 1 Byte 2 Byte 3 Byte 4
0x00 0x00 0x00 0x00 0x00

(2)发送i的报文

Byte 0 Byte 1 Byte 2 Byte 3 Byte 4
0x00 0x0C 0x00 0x00 0x00
Byte 0 Byte 1 Byte 2 Byte 3 Byte 4
0x00 0x00 0x00 0x00 0x00

(3)发送c的报文

Byte 0 Byte 1 Byte 2 Byte 3 Byte 4
0x00 0x06 0x00 0x00 0x00
Byte 0 Byte 1 Byte 2 Byte 3 Byte 4
0x00 0x00 0x00 0x00 0x00

(4)发送e的报文

Byte 0 Byte 1 Byte 2 Byte 3 Byte 4
0x00 0x08 0x00 0x00 0x00
Byte 0 Byte 1 Byte 2 Byte 3 Byte 4
0x00 0x00 0x00 0x00 0x00

以此类推,我们查找到26个字母对应的usage, 并让键盘发出去,就可以让主机输出26个字母出来。

3. 报文格式解析

细心的同学可能会有个疑问:我用一个字节就可以完成26个字母的发送,还要其他4个字节来做什么?

第一个字节Byte 0下面会讲到,这里先跳过。 第2到第5个字母的地位是等同的。也就是说发送按键A,下面的4种方式的效果是一样的。

Byte 0 Byte 1 Byte 2 Byte 3 Byte 4
0x00 0x04 0x00 0x00 0x00
Byte 0 Byte 1 Byte 2 Byte 3 Byte 4
0x00 0x00 0x04 0x00 0x00
Byte 0 Byte 1 Byte 2 Byte 3 Byte 4
0x00 0x00 0x00 0x04 0x00
Byte 0 Byte 1 Byte 2 Byte 3 Byte 4
0x00 0x00 0x00 0x00 0x04

可能大家还是蒙的,你说这么多还是没有解释原因呀。现在解释正式开始。

上面说的所有情况都是用户一个按键一个按键按住松开的情况,那如果我4个按键一起按住一起松开,那键盘该怎么发送报文?

还是以Nice这个单词为例,假如我同时按住Nice然后松开,键盘应该发送如下的报文。

(1) 4个按键按住的报文

Byte 0 Byte 1 Byte 2 Byte 3 Byte 4
0x00 0x11 0x0C 0x06 0x08

(2) 4个按键松开的报文

Byte 0 Byte 1 Byte 2 Byte 3 Byte 4
0x00 0x00 0x00 0x00 0x00

可能有人要说了,如果我有同时按键10个按键的情况,那这4个字节不够用看呀,怎么办呢?其实也很简单,你只要把报文扩展为11个字节就可以了,下面两个报文就是同时输出: ABCDEFGHIJ的例子.

Byte 0 Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6 Byte 7 Byte 8 Byte 9 Byte 10
0x00 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D
Byte 0 Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6 Byte 7 Byte 8 Byte 9 Byte 10
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

更多详细信息,请查看下面的文章。

相关推荐
静止了 所有的花开3 天前
BlueZ 学习之GATT Server开发
蓝牙·glib·gatt·bluez·gatt server·d‑bus
铉铉这波能秀3 天前
解决Mac电脑连接蓝牙鼠标的延迟问题
macos·计算机外设·鼠标
Geehy极海半导体17 天前
APM32芯得 EP.29 | 基于APM32F103的USB键盘与虚拟串口复合设备配置详解
计算机外设·usb·usb配置
驱动探索者21 天前
USB ADB 简介
linux·adb·驱动·usb
minichao_sz24 天前
Cherryusb UAC例程对接STM32内置ADC和PWM播放音乐和录音(下)=>UAC+STM32 ADC+PWM实现录音和播放
stm32·单片机·usb
猎板PCB 邹亮1 个月前
猎板PCB:专业键盘PCB板解决方案供应商
计算机外设·键盘·pcb工艺
笑稀了的野生俊1 个月前
ZED 2/2i 相机安装与调试完整指南 | Ubuntu 20.04 + CUDA 11.8
ubuntu·usb·sed相机
zzc9211 个月前
手机(电脑)与音响的蓝牙通信
智能手机·电脑·蓝牙·2.4g·ble·嗅探
你的强来了9981 个月前
RAWINPUT避坑指南(涉及GetRawInputData/GetRawInputBuffer)
hid·rawinput·键鼠监听
得单片机的运1 个月前
STM32的蓝牙通讯(HAL库)
stm32·单片机·嵌入式硬件·蓝牙