搞定蓝牙-第六篇(HID

news2024/11/22 11:17:22

搞定蓝牙-第六篇(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程序分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1147978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

这个故事有点长 - 舟山

这个故事有点长 - 舟山 👉故事的开始 这是一个很长的故事,到底有多长呢?大概也就有六七年那么长吧。刚来上海时就一直想去看海,后来终于如愿以偿了,具体记不清了,只记得当时坐了地铁,又坐了几个…

TensorRT量化实战课YOLOv7量化:YOLOv7-PTQ量化(一)

目录 前言1. YOLOv7-PTQ量化流程2. 准备工作3. 插入QDQ节点3.1 自动插入QDQ节点3.2 手动插入QDQ节点 前言 手写 AI 推出的全新 TensorRT 模型量化实战课程,链接。记录下个人学习笔记,仅供自己参考。 该实战课程主要基于手写 AI 的 Latte 老师所出的 Tens…

一年一度表白代码(自定义表白)

代码有什么不懂可以私信我 动态画下面的效果图,自定义名字和表白词 源代码 import turtle import time# 画心形圆弧 def hart_arc():for i in range(200):turtle.right(1

一年一度表白代码(发射爱心)

代码有什么不懂可以私信我 动态画下面的效果图,发射爱心,可改名字 源代码 import turtle import time# 画心形圆弧 def hart_arc():for i in range(200):turtle.righ

电源控制系统架构(PCSA)之系统控制处理器

安全之安全(security)博客目录导读 目录 一、系统控制处理器 1、服务 2、可信操作 一、系统控制处理器 SCP是一种基于处理器的能力,为提供电源管理功能和服务提供了一个灵活和可扩展的平台。 在移动系统中,SCP处理器一般是Cortex-M微控制器&#xff…

Visual Studio Code 中安装 DevChat 的体验与评测

Visual Studio Code 中安装 DevChat 的体验与评测 1.前言 在软件开发的过程中,我们常常需要与团队成员进行高效的沟通,而现有的开发工具并未将沟通工具与软件开发环境有效地结合起来。然而,DevChat却为像我们这样的开发者提供了非常便利的解…

nacos切换到mysql数据库(替换掉嵌入式数据库derby)

官网文档:https://nacos.io/zh-cn/docs/v2/guide/admin/deployment.html 1.数据库初始化文件:mysql-schema.sql 找到这个文件直接进行执行 2.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql&a…

powerjob基于springboot2.1.6.RELEASE版本的问题研究

项目背景:基于第三代框架的集成问题,如果对于powerjob不熟悉的朋友,可以参考官方文档PowerJob 简介 语雀 关于语雀 23 日故障的公告 (qq.com) 简单插一句,针对语雀文档故障的心得,数据恢复,完整性&#…

腾讯云2023年双11活动:云服务器2核2G首年88元,领券最高省9999元!

双11作为全球最大的购物狂欢节,云计算行业也将迎来一场盛大的活动。腾讯云作为云计算领域的领先者,2023年双11期间推出了一系列超值优惠活动,本文将为大家介绍腾讯云2023年11.11云上盛惠活动的亮点和优惠内容。 一、活动地址 活动入口&#…

C++之lambda匿名、using、typedef总结【全】(二百四十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

【图像分类】基于计算机视觉的坑洼道路检测和识别(ResNet网络,附代码和数据集)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 本篇博文,我们将使用PyTorch深度学习框架搭建ResNet实现钢轨缺陷识别,附完整的项目代码和数据集,可以说是全网…

BaiChuan-QWen

QWen Tokenizer 选择byte pair encoding (BPE)作为分词方法vacabulary在中文上做了增强,验证增加vocabulary的规模不会为下游任务带来负面影响 Model Positional embedding:选择RoPE,反向更新时选择FP32的精度而不是FP16或BP16&#xff0c…

木疙瘩学习-行为添加与控制

这里面都是一些代码逻辑,但是这个平台让用户0代码实现交互,但是难点是,用户需要有一定的业务逻辑转换程序逻辑思维能力! 注意,舞台上的任何素材都可以参与程序逻辑!前提是我们为素材手动指定名字&#xff…

【详细教程】关于如何使用GitGitHub的基本操作汇总GitHub的密钥配置 ->(个人学习记录笔记)

文章目录 1. Git使用篇1.1 下载安装Git1.2 使用Git 2. GitHub使用篇2.1 如何git与GitHub建立联系呢?2.2 配置公钥 1. Git使用篇 1.1 下载安装Git 点击 官网链接 后,进入Git官网,下载安装包 然后根据系统类型进行下载,一般为wind…

unity3d场景加载

需将场景拖到到file->buildsetting中

基于微信小程序的抢票系统vue+uniapp

1、开发实现微信小程序的抢票系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、票据类型管理、票据信息管理、抢票信息管理、系统管理等。 3、用户微信端:首页、票据信息、我的等相应操作; 4、基础数据管理&#…

k8s 集群部署

目录 1. 集群环境初始化 2. 所有节点安装kubeadm 3. 拉取集群所需镜像 4. 集群初始化 5. 安装flannel网络插件 6. 扩容节点 7. 设置kubectl命令补齐 官网: https://v1-23.docs.kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ …

SAP业务从ECC升级到SAP S/4HANA有哪些变化?有哪些功能得到增强?

SAP在2015年推出了新一代商务套件SAP S/4 HANA。 SAP S/4 HANA (全称SAP Business suite 4 SAP HANA),这款新产品完全构建于目前先进的内存平台SAP HANA 之上,同时采用现代设计理念,通过SAP Fiori 提供精彩的用户体验 (UX)。提供比ECC更强大的功能。S/4h…

Docker容器技术实战2

4、docker仓库 docker hub 注册账号:https://hub.docker.com/ 上传自己的镜像仓库 创建自己的仓库webserver 拉取镜像 Registry工作原理 配置镜像加速器 搭建私有仓库 上传镜像 在server1上 在server2(纯净)上 强制使用非加密私有仓库 5、…

NEFU数字图像处理(三)图像分割

一、图像分割的基本概念 1.1专有名词 前景和背景 在图像分割中,我们通常需要将图像分为前景和背景两个部分。前景是指图像中我们感兴趣、要分割出来的部分,背景是指和前景不相关的部分。例如,对于一张人物照片,人物就是前景&…