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

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

相关推荐
jiang_bluetooth5 小时前
GFPS扩展技术原理(七)-音频切换消息流
蓝牙·gfps·fast pair·谷歌快速连接
斐夷所非14 天前
计算机键盘的演变 | 键盘键名称及其功能 | 键盘指法
键盘
jiang_bluetooth16 天前
Bluetooth LE AUDIO架构概述
架构·蓝牙·ble audio·le audio
WPG大大通18 天前
芯驰X9SP与汽车麦克风-打造无缝驾驶体验
车载系统·汽车·硬件工程·蓝牙·开发板·麦克风
byte轻骑兵19 天前
【0x0019】HCI_Remote_Name_Request详解
蓝牙·通信协议·hci
byte轻骑兵21 天前
【0x0001】HCI_Set_Event_Mask详解
蓝牙·通信协议·hci
宋者为王23 天前
【朝花夕拾】蓝牙&WiFi常识篇
蓝牙·p2p·热点·ap·wifi直连
AscendKing25 天前
uniapp对接蓝牙
uni-app·蓝牙
亿牛云爬虫专家1 个月前
深入探讨 Puppeteer 如何使用 X 和 Y 坐标实现鼠标移动
爬虫代理·puppeteer·鼠标·代理ip·小红书·16yun·用户行为
ShiinaKaze1 个月前
【STM32】USB 简要驱动软件架构图
stm32·单片机·mcu·usb