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 天前
《安富莱嵌入式周报》第343期:雷电USB4开源示波器正式发布,卓越的模拟前端低噪便携示波器,自带100W电源的便携智能烙铁,NASA航空航天锂电池设计
开源·usb
韩zj3 天前
android 蓝牙语音转换成pcm文件,进行播放暂停停止操作
android·蓝牙·pcm
Lenzetech5 天前
Find My汽车钥匙|苹果Find My技术与钥匙结合,智能防丢,全球定位
科技·物联网·蓝牙·find my
秋月的私语5 天前
如何隐藏Windows10「安全删除硬件」里的USB无线网卡
usb·电脑知识
Lenzetech9 天前
蓝牙技术|蓝牙6.0技术或将实现厘米级精确查找定位功能
科技·物联网·蓝牙·find my
方永锐11 天前
切换笔记本键盘的启用与禁用状态
windows·笔记本电脑·键盘·批处理
风翼靓崽12 天前
记一次键盘f2和f5键被自动触发情况
计算机外设·键盘
萨达大18 天前
C# USB通信技术(通过LibUsbDotNet库)
c#·usb·libusb
Android技术栈1 个月前
鸿蒙NEXT(API 12)【蓝牙设置】 网络开发
网络·php·蓝牙·harmonyos·鸿蒙·鸿蒙系统·openharmony
前端开发菜鸟的自我修养1 个月前
【java入门】关键字、标识符与变量初识
java·开发语言·后端·键盘·合成复用原则