当前位置: 首页 > news >正文

搞定蓝牙-第六篇(HID

搞定蓝牙-第六篇(HID)

  • ble与HID
    • HOGP
    • GAPP与HID
  • ESP32程序分析

ble与HID

HOGP

我们发现,电脑连接了蓝牙键盘就可以直接使用了,不需要配置任何东西,那么,这两者是怎么通讯的呢。我们使用的电脑windows系统内置一段程序来自动识别鼠标、键盘的数据, windows系统的这个程序和鼠标、键盘内部的程序的需要使用同一套规则,两者才能正常通讯。除了鼠标、键盘还有游戏手柄、多媒体控制器等等都可以使用这套规则,这类设备叫做HID(Human Interface Device)。在ble中,我们称这套规则为HOGP(HID Over GATT Profile)。

GAPP与HID

HOGP的层次比GAP、GATT协议要高一层,也就是HOGP是基于这两个协议的,也就是说,要实现HOGP首先需要实现GAP和GATT。
之前的内容说到,ble设备的通讯是基于GATT的,通讯的内容最小单元是Attribute,所以HOGP也不例外,而GATT的核心是属性表,程序中要做的就是维护属性表。我们来看看HOGP的属性表是怎么样的。
在这里插入图片描述
我们用电脑连接有些键盘、鼠标会看到能显示电池电量,这个也是通过GATT实现的,也就是一个普通的键盘中的ble的GATT实现了HID服务和电池服务。从上图也能看出来确实如此。
首先了解电池服务,这个比较简单,就三个属性:特征值、客户端特性配置(CCC)和特征展示格式。前两个在GATT那一章说过了,特征值就是实际要传输的电池电量数据,而这里的特征展示格式就是表示这个电池电量数据以什么样的方式来传输(是百分百还是其他、是毫安还是安、是带小数点还是放大了十倍)。
HID服务就比较复杂了,包含了五个属性。HID信息,用于显示这个HID的一些基础信息,它的值就是由这些部分组成,版本号、硬件本地化(一个本地ID,如果有多个HID服务,需要设置不同ID)和是否支持远程唤醒。
在这里插入图片描述
协议模式,我们发现,windows在启动的时候可以输入键盘的键值来进入bios模式,但是在进入bios模式的时候还没初始化HID的程序呢,那么键盘是怎么和他正常通讯的呢。所以HID设备需要支持两种模式,一种用于在系统HID程序初始化之前,使用更加底层的协议来通讯,另外一种在系统初始化了HID程序之后,也就是配置启动模式或报告模式。
在这里插入图片描述

控制点,一般蓝牙键盘是需要低功耗设计的,HID的保持连接是需要一直传输数据的,而射频是很耗电的,所以,在系统注销、长时间未检测到用户使用这个设备的时候,键盘应该能自动休眠,这个时候可以通过控制点这个属性通知键盘进入低功耗模式了(主动关闭HID连接等)。
在这里插入图片描述

报告地图,这个东西在USB HID那边叫做报告描述符。我们使用的键盘可能是87键、104键、108键,还有一些宏键盘是几个按键的,那么HOGP是怎么支持这些所有这些不同类型的键盘的呢?所以,键盘需要告诉系统,我有多少个键、我有多少个LED、我的键值从哪些到哪些等等。这些内容通过报告地图固定在键盘的芯片里面了。举个栗子。

//表示用途页为通用桌面设备 0x05, 0x01,                    // USAGE_PAGE (Generic Desktop) //表示用途为键盘 0x09, 0x06,                    // USAGE (Keyboard) //表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION 0xa1, 0x01,                    // COLLECTION (Application) //表示用途页为按键 0x05, 0x07,                    //   USAGE_PAGE (Keyboard) //用途最小值,这里为左ctrl键 0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl) //用途最大值,这里为右GUI键,即window键 0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI) //逻辑最小值为0 0x15, 0x00,                    //   LOGICAL_MINIMUM (0) //逻辑最大值为1 0x25, 0x01,                    //   LOGICAL_MAXIMUM (1) //报告大小(即这个字段的宽度)为1bit,所以前面的逻辑最小值为0,逻辑最大值为1 0x75, 0x01,                    //   REPORT_SIZE (1) //报告的个数为8,即总共有8个bits 0x95, 0x08,                    //   REPORT_COUNT (8) //输入用,变量,值,绝对值。像键盘这类一般报告绝对值, //而鼠标移动这样的则报告相对值,表示鼠标移动多少 0x81, 0x02,                    //   INPUT (Data,Var,Abs) //上面这这几项描述了一个输入用的字段,总共为8个bits,每个bit表示一个按键 //分别从左ctrl键到右GUI键。这8个bits刚好构成一个字节,它位于报告的第一个字节。 //它的最低位,即bit-0对应着左ctrl键,如果返回的数据该位为1,则表示左ctrl键被按下, //否则,左ctrl键没有按下。最高位,即bit-7表示右GUI键的按下情况。中间的几个位, //需要根据HID协议中规定的用途页表(HID Usage Tables)来确定。这里通常用来表示 //特殊键,例如ctrl,shift,del键等 //这样的数据段个数为1 0x95, 0x01,                    //   REPORT_COUNT (1) //每个段长度为8bits 0x75, 0x08,                    //   REPORT_SIZE (8) //输入用,常量,值,绝对值 0x81, 0x03,                    //   INPUT (Cnst,Var,Abs) //上面这8个bit是常量,设备必须返回0 //这样的数据段个数为5 0x95, 0x05,                    //   REPORT_COUNT (5) //每个段大小为1bit 0x75, 0x01,                    //   REPORT_SIZE (1) //用途是LED,即用来控制键盘上的LED用的,因此下面会说明它是输出用 0x05, 0x08,                    //   USAGE_PAGE (LEDs) //用途最小值是Num Lock,即数字键锁定灯 0x19, 0x01,                    //   USAGE_MINIMUM (Num Lock) //用途最大值是Kana,这个是什么灯我也不清楚^_^ 0x29, 0x05,                    //   USAGE_MAXIMUM (Kana) //如前面所说,这个字段是输出用的,用来控制LED。变量,值,绝对值。 //1表示灯亮,0表示灯灭 0x91, 0x02,                    //   OUTPUT (Data,Var,Abs) //这样的数据段个数为1 0x95, 0x01,                    //   REPORT_COUNT (1) //每个段大小为3bits 0x75, 0x03,                    //   REPORT_SIZE (3) //输出用,常量,值,绝对 0x91, 0x03,                    //   OUTPUT (Cnst,Var,Abs)     //由于要按字节对齐,而前面控制LED的只用了5个bit, //所以后面需要附加3个不用bit,设置为常量。 //报告个数为6 0x95, 0x06,                    //   REPORT_COUNT (6) //每个段大小为8bits 0x75, 0x08,                    //   REPORT_SIZE (8) //逻辑最小值0 0x15, 0x00,                    //   LOGICAL_MINIMUM (0) //逻辑最大值255 0x25, 0xFF,                    //   LOGICAL_MAXIMUM (255) //用途页为按键 0x05, 0x07,                    //   USAGE_PAGE (Keyboard) //使用最小值为0 0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated)) //使用最大值为0x65 0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application) //输入用,变量,数组,绝对值 0x81, 0x00,                    //   INPUT (Data,Ary,Abs) //以上定义了6个8bit宽的数组,每个8bit(即一个字节)用来表示一个按键,所以可以同时 //有6个按键按下。没有按键按下时,全部返回0。如果按下的键太多,导致键盘扫描系统 //无法区分按键时,则全部返回0x01,即6个0x01。如果有一个键按下,则这6个字节中的第一 //个字节为相应的键值(具体的值参看HID Usage Tables),如果两个键按下,则第1、2两个 //字节分别为相应的键值,以次类推。 //关集合,跟上面的对应 0xc0                           // END_COLLECTION

这个报告总共有8字节输入(一个字节ctrl~win键、一个字节led、六个字节普通按键,使用普通键可以一次发送六个),1字节输出。如果只有左ctrl键按下,则返回01 00 00 00 00 00 00 00(十六进制),如果只有数字键1 按下,则返回00 00 59 00 00 00 00 00,如果数字键1 和2 同时按下,则返回00 00 59 5A 00 00 00 00,如果再按下左shift 键,则返回02 00 59 5A 00 00 00 00,然后再释放1 键,则返回02 00 5A 00 00 00 00 00,然后全部按键释放,则返回00 00 00 00 00 00 00 00。这些数据(即报告)都是通过中断端点返回的。当按下Num Lock键时,PC会发送输出报告,从报告描述符中我们知道,Num Lock的LED对应着输出报告的最低位,当数字小键盘打开时,输出xxxxxxx1(二进制,打x的由其它的LED状态决定);当数字小键盘关闭时,输出xxxxxxx0(同前)。取出最低位就可以控制数字键锁定LED了。

报告特征,有些键盘带有一个旋钮调节音量,所以这个键盘既是多媒体类型的HID又是键盘类型HID,但是只需要连接一个HID就能实现这个功能,这是因为报告地图实现了多种HID的配置,为了区分是那种HID以及这种HID的类型,使用报告特征来表示。
基础理论已经到此,下面是ESP32的程序分析。

ESP32程序分析

相关文章:

搞定蓝牙-第六篇(HID

搞定蓝牙-第六篇(HID) ble与HIDHOGPGAPP与HID ESP32程序分析 ble与HID HOGP 我们发现,电脑连接了蓝牙键盘就可以直接使用了,不需要配置任何东西,那么,这两者是怎么通讯的呢。我们使用的电脑windows系统内…...

Open3D(C++) 最小二乘拟合平面(直接求解法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。 一、算法原理 平面方程的一般表达式为: A x + B y + C...

lua移植及使用

编译环境:Ubuntu16.04 64位 交叉编译工具:arm-hisiv500-linux-gcc 文章目录 1. 项目背景2. lua开源版本选择3. 封装代码3.1 源码简介3.2 封装类3.2.1 头文件3.2.2 类的实现3.3.3 sample代码 1. 项目背景 使用lua脚本,读取key对应的值&#x…...

【鸿蒙软件开发】ArkTS基础组件之Select(下拉菜单)、Slider(滑动条)

文章目录 前言一、Select下拉菜单1.1 子组件1.2 接口参数 1.3 属性1.4 事件1.5 示例代码 二、Slider2.1 子组件2.2 接口参数:SliderStyle枚举说明 2.3 属性2.4 事件SliderChangeMode枚举说明 2.5 示例代码 总结 前言 Select组件:提供下拉选择菜单&#…...

linux ssh 免密登录

概述 在大数据测试环境搭建时,经常会用到 ssh 免密登录 ,方便机器之间分发文件,从一个机器上登录至其它机器也方便 如何配置 linux 的 ssh 免密登录? 非免密登录 端口是22 [rootKS8P-Test-K8S06 ~]# ssh KS8P-Test-K8S06端口非22 [roo…...

秒级启动的集成测试框架

本文介绍了一种秒级启动的集成测试框架,使用该框架可以方便的修改和完善测试用例,使得测试用例成为测试过程的产物。 背景 传统的单元测试,测试的范围往往非常有限,常常覆盖的是一些工具类、静态方法或者较为底层纯粹的类实现&…...

Redux 数据仓库

Redux 数据仓库 解决React 数据管理(状态管理) ,用于中大型,数据比较庞大,组件之间数据交互多的情况下使用。 作者:如果你不知道是否需要使用Redux,那么你就不需要它! 解决组件的数据通信。 …...

[毕设记录]@开题调研:一些产品

我感觉产品能代表落地的一些实际应用,会和研究的角度有些差别,但是需求和兴趣往往是从现实中来的,在上一篇blog里面看外国blog的时候顺着搜搜到了很多国外的智慧校园chatbot解决方案 文章目录 Comm100streebomodern campusUniBuddy Comm100 …...

CSS3中的字体和文本样式

CSS3优化了CSS 2.1的字体和文本属性,同时新增了各种文字特效,使网页文字更具表现力和感染力,丰富了网页设计效果,如自定义字体类型、更多的色彩模式、文本阴影、生态生成内容、各种特殊值、函数等。 1、字体样式 字体样式包括类…...

LVS集群-DR模式【部署高可用LVS-DR集群】

文章目录 2.2 实战:配置LVS-DR集群2.2.1 配置IP(Director Server的部署配置)2.2.2 生成ens33:1配置文件 (Director Server的部署配置)2.2.3 配置LVS-DR规则(Director Server的部署配置)2.2.4 两…...

银河麒麟服务器版v4安装程序缺少依赖包,改为利用手机联网在线安装

1 将安卓手机连接使用usb转typec线连接到服务器的usb口。(linux桌面版)也可以类似的方法手机联网。 2 在手机热点中打开usb共享 3 使用ifconfig命令找到手机被服务器识别成的网卡名 4 使用dhclient “手机网卡名”命令,使服务器能上网。 5 变…...

Maven第一章:Maven安装、验证、使用

Maven第一章:Maven安装、验证、使用 前言 谁适合阅读本教程? Java开发人员:Maven是Java项目管理和构建工具,因此对Java开发人员来说是一个重要的工具。阅读Maven知识可以帮助他们更好地理解如何使用Maven来管理Java项目,包括依赖管理、构建自动化、项目构建和部署等。项目…...

ios 代码上下文截屏之后导致的图片异常问题

业务场景,之前是直接将当前的collectionview截长屏操作,第一次截图会出现黑色部分原因是视图未完全布局,原因是第一次使用了Masonry约束然后再截图的时候进行了frame赋值,可以查看下Masonry约束和frame的冲突,全部修改…...

《嵌入式软\硬件开发难点-2023-10-29》

一、《嵌入式软件开发难点》 内存有限、螺蛳壳里做道肠;处理能力有限,必须做好规划,榨取系统每一份处理能力;现代开发工具和实际工具难实施,资源问题:C/Python/Java;调试跟踪问题较困难&#x…...

基于5G工业CPE打造智慧煤矿无人巡检监测应用

煤炭是我国重要的能源资源,对于煤炭的开采和利用也是我国重要的工业产业部分。得益于5G物联网技术的发展普及,煤矿场景也迎来智能化升级,实现了包括智能采掘、智能调度、无人运输、无人巡检等新型应用,极大提升了煤矿采运产业的效…...

考点之数据结构

概论 时间复杂度和空间复杂度是计算机科学中用来评估算法性能的重要指标。 时间复杂度: 时间复杂度衡量的是算法运行所需的时间。它表示算法执行所需的基本操作数量随着输入大小的增长而变化的趋势。 求法: 通常通过分析算法中基本操作执行的次数来…...

07、SpringCloud -- jmeter 压测

目录 jmeter 入门jmeter 安装测试步骤测试数据模拟多用户操作1、创建http请求2、添加http cookie 管理器3、并发获取当前登录用户数据的效果4、添加多个用户模拟并发请求5、访问方法6、jmeter添加 CSV Data Set Config7、高并发执行访问的效果8、总结流程高并发秒杀压测jmeter …...

省市区三级联动查询redis(通过python脚本导入数据)

最近工作有一个工作需求是实现省市区联动,点击省下拉框,选中一个省,然后再选市,最后选区,当然最重要的首先自然是数据了,没数据怎么测试接口,我数据是在 https://hxkj.vip/demo/echartsMap/ 这里…...

Linux命令(108)之dirname

linux命令之dirname 1.dirname介绍 linux命令dirname是用来获取文件的指定路径 2.dirname用法 dirname [参数] NAME dirname参数 参数说明-z使用NUL而不是换行符分隔输出--help查看帮助信息--version查看版本信息 3.实例 3.1.获取文件的指定路径 命令: dirn…...

SDL事件处理以及线程使用(2)

事件使用 #include <stdio.h> #include <SDL.h>#define FF_QUIT_EVENT (SDL_USEREVENT 1) // 定义自定义事件#undef main int main() {SDL_Window* pWindow NULL;SDL_Init(SDL_INIT_VIDEO);// 创建窗口pWindow SDL_CreateWindow("Event Test Title&…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...