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

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

相关推荐
嵌入式×边缘AI:打怪升级日志2 天前
USB描述符
学习笔记·嵌入式·usb
Ankie Wan2 天前
outlook:增加键盘快捷键 alt-3 在任务 或者 其他文件夹 查找相关邮件
outlook·键盘·快捷键·右键·邮件
嵌入式×边缘AI:打怪升级日志2 天前
USB协议详解:从物理连接到数据传输的完整解析
网络·学习·usb
Just_Paranoid4 天前
【Settings】Android 常见外设检测机制
android·sd·usb·camera·keyboard·sim
我的golang之路果然有问题5 天前
win键盘设置改为类似mac 配置
windows·笔记·macos·计算机外设·键盘
北冥有渔jy10 天前
BT6.0常见的BUG
网络·安全·bug·蓝牙
纸带11 天前
F460 配置描述符、接口描述符和端点描述符
usb
硬汉嵌入式12 天前
瑞萨推出M33内核WiFi6双频(2.4G+5G) + BLE蓝牙芯片RA6W2/W1,同时还将推出现成模组
蓝牙·瑞萨·wifi6·ra6w1·ra6w2
wotaifuzao13 天前
Nordic-nRF54L 系列架构全景:从蓝牙 6.0 到超低功耗设计详解
单片机·物联网·硬件架构·蓝牙·nordic
Garfield200515 天前
查找Docker 容器占用的磁盘空间
docker·容器·键盘