ESP32 BLE特征值示例

键盘特征值初始化示例

void BleKeyboard::begin(void)
{BLEDevice::init(deviceName);BLEServer* pServer = BLEDevice::createServer();pServer->setCallbacks(this);hid = new BLEHIDDevice(pServer);inputKeyboard = hid->inputReport(KEYBOARD_ID);  // <-- input REPORTID from report mapoutputKeyboard = hid->outputReport(KEYBOARD_ID);inputMediaKeys = hid->inputReport(MEDIA_KEYS_ID);outputKeyboard->setCallbacks(this);hid->manufacturer()->setValue(deviceManufacturer);hid->pnp(0x02, vid, pid, version);hid->hidInfo(0x00, 0x01);#if defined(USE_NIMBLE)BLEDevice::setSecurityAuth(true, true, true);#elseBLESecurity* pSecurity = new BLESecurity();pSecurity->setAuthenticationMode(ESP_LE_AUTH_REQ_SC_MITM_BOND);#endif // USE_NIMBLEhid->reportMap((uint8_t*)_hidReportDescriptor, sizeof(_hidReportDescriptor));hid->startServices();onStarted(pServer);advertising = pServer->getAdvertising();advertising->setAppearance(HID_KEYBOARD);advertising->addServiceUUID(hid->hidService()->getUUID());advertising->setScanResponse(false);advertising->start();hid->setBatteryLevel(batteryLevel);ESP_LOGD(LOG_TAG, "Advertising started!");
}

在这里插入图片描述
2901:用户描述,如上图:My Counter
2902:特征值配置(需要主动推送notify、indicate就需要增加)
在这里插入图片描述

在这里插入图片描述

Bluetooth Low Energy (BLE) 中的这两个服务具有基本而重要的功能,它们为 BLE 设备提供基础支持。下面是关于这两个服务的详细介绍:

  1. 0x1800 - Generic Access Service (通用访问服务):
    这个服务包含了许多跟 BLE 设备的连接和设备本身信息相关的属性。这些属性包括设备名称(Device Name,0x2A00)、外观(Appearance,0x2A01)、外设连接参数(Peripheral Preferred Connection Parameters,0x2A04)等。用户可以通过访问这些属性,获取和设置与 BLE 设备相关的信息,从而实现连接设置、设备信息展示等功能。

  2. 0x1801 - Generic Attribute Service (通用属性服务):
    这个服务是 BLE 中其他服务和特征数据交互的基础,它提供了一个框架以支持其他服务和特征值的查找、读取、写入等操作。这个服务通常包含了服务修改变更特征(Service Change, 0x2A05)。这个特征会在服务或特征发生变更时触发,通知其他相关的设备需要重新发现服务、特征等。

总之,这两个服务在 BLE 通信过程中起到了基础和桥接的作用,支持设备建立连接,获取属性信息,以及实现其他自定义服务的数据通信。

实际示例中,蓝牙鼠标、耳机等典型设备会设置这些值来描述设备的基本信息和配置:

  1. 蓝牙鼠标:
  • 通用访问服务(Generic Access Service,0x1800):

    • 设备名称(Device Name,0x2A00):例如 “WeTab Wireless Mouse”
    • 外观(Appearance,0x2A01):鼠标的类型和类别,例如设置为 “Mouse” 类型
    • 外设连接参数(Peripheral Preferred Connection Parameters,0x2A04):设置鼠标的连接参数,例如设置连接间隔为 15ms-30ms。
  • 通用属性服务(Generic Attribute Service,0x1801):

    • 服务修改变更特征(Service Change,0x2A05):当鼠标的其他服务或特征发生变更时,触发此特征来通知设备重新发现服务或特征。
  1. 蓝牙耳机:
  • 通用访问服务(Generic Access Service,0x1800):

    • 设备名称(Device Name,0x2A00):例如 “WeTab Bluetooth Headphones”
    • 外观(Appearance,0x2A01):耳机的类型和类别,例如设置为 “Headset” 类型
    • 外设连接参数(Peripheral Preferred Connection Parameters,0x2A04):设置耳机的连接参数,例如选择适合音频传输的低延迟连接间隔。
  • 通用属性服务(Generic Attribute Service,0x1801):

    • 服务修改变更特征(Service Change,0x2A05):当耳机的其他服务或特征发生变更时(如音频控制、电池状态等),触发此特征来通知设备重新发现服务或特征。

以上是两个典型蓝牙设备设置通用访问服务和通用属性服务的例子。设备制造商可以根据设备类型和使用场景自定义属性值,从而为用户提供正确、稳定的蓝牙连接和使用体验。

链接蓝牙耳机的数据
在这里插入图片描述
罗技蓝牙鼠标的特征值
![在这里插入图片描述](https://img-blog.csdnimg.cn/9722feb941bd41ccb289e9330ec27baf.png

按键按下与松开处理,按键值为k,经过处理通过sendReport修改inputKeyboard特征值。
this->inputKeyboard->setValue((uint8_t*)keys, sizeof(KeyReport));

//按下按键处理
size_t BleKeyboard::press(uint8_t k)
{uint8_t i;if (k >= 136) {			// it's a non-printing key (not a modifier)k = k - 136;} else if (k >= 128) {	// it's a modifier key_keyReport.modifiers |= (1<<(k-128));k = 0;} else {				// it's a printing keyk = pgm_read_byte(_asciimap + k);if (!k) {setWriteError();return 0;}if (k & 0x80) {						// it's a capital letter or other character reached with shift_keyReport.modifiers |= 0x02;	// the left shift modifierk &= 0x7F;}}// Add k to the key report only if it's not already present// and if there is an empty slot.if (_keyReport.keys[0] != k && _keyReport.keys[1] != k &&_keyReport.keys[2] != k && _keyReport.keys[3] != k &&_keyReport.keys[4] != k && _keyReport.keys[5] != k) {for (i=0; i<6; i++) {if (_keyReport.keys[i] == 0x00) {_keyReport.keys[i] = k;break;}}if (i == 6) {setWriteError();return 0;}}sendReport(&_keyReport);return 1;
}
//松开按键处理
size_t BleKeyboard::release(uint8_t k)
{uint8_t i;if (k >= 136) {			// it's a non-printing key (not a modifier)k = k - 136;} else if (k >= 128) {	// it's a modifier key_keyReport.modifiers &= ~(1<<(k-128));k = 0;} else {				// it's a printing keyk = pgm_read_byte(_asciimap + k);if (!k) {return 0;}if (k & 0x80) {							// it's a capital letter or other character reached with shift_keyReport.modifiers &= ~(0x02);	// the left shift modifierk &= 0x7F;}}// Test the key report to see if k is present.  Clear it if it exists.// Check all positions in case the key is present more than once (which it shouldn't be)for (i=0; i<6; i++) {if (0 != k && _keyReport.keys[i] == k) {_keyReport.keys[i] = 0x00;}}sendReport(&_keyReport);return 1;
}
//发送
void BleKeyboard::sendReport(KeyReport* keys)
{if (this->isConnected()){this->inputKeyboard->setValue((uint8_t*)keys, sizeof(KeyReport));this->inputKeyboard->notify();
#if defined(USE_NIMBLE)        // vTaskDelay(delayTicks);this->delay_ms(_delay_ms);
#endif // USE_NIMBLE}	
}

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

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

相关文章

大洋钻探系列之二IODP 342航次是干什么的?(上)

本文简单介绍一下大洋钻探IODP 342航次&#xff0c;从中&#xff0c;我们一窥大洋钻探航次的风采。 IODP342的航次报告在网络上可以下载&#xff0c;英文名字叫《Integrated Ocean Drilling ProgramExpedition 342 Preliminary Report》&#xff0c;航次研究的主要内容是纽芬兰…

【Linux】第十五站:环境变量

文章目录 一、进程相关的一些概念1.一些常见的概念2.对于并发3.**进程切换** 二、环境变量1.PATH环境变量2.HOME环境变量3.SHELL环境变量4.env5.系统调用接口与环境变量6.什么是环境变量&#xff1f;7.命令行参数8.main函数的第三个命令行参数9.如何验证环境变量是可以被继承的…

前端面试之事件循环

什么是事件循环 首先&#xff0c; JavaScript是一门单线程的语言&#xff0c;意味着同一时间内只能做一件事&#xff0c;这并不意味着单线程就是阻塞&#xff0c;而是实现单线程非阻塞的方法就是事件循环 在JavaScript中&#xff0c;所欲任务都可以分为&#xff1a; 同步任务…

【RPC】前传

前传 本地程序用的go语言&#xff0c;想把main.go程序当中一些计算工作放到服务器上进行&#xff0c;而只需要把结果给我即可。由于平台上暂时不能运行Go代码&#xff0c;所以写的是python文件。 1、主要是使用ssh依赖进行连接&#xff0c;但是大概率是需要手动添加的&#xf…

带头+双向+循环链表

前言&#xff1a; 前面我们已经学习了单链表的结构及其功能特点&#xff0c;也了解了单链表在实现一些功能时出现的一些缺点&#xff0c;比如在删除某个节点前面一个节点时就需要再开一个变量来存放前面一个节点的信息&#xff0c;这样就显得不灵活&#xff0c;为了使链表实现功…

网络编程学习笔记

参考&#xff1a; 套接字通信部分 《TCP/IP 网络编程》以及《TCP/IP网络编程》学习笔记 socket 编程 1. 字节序 字节序&#xff0c;顾名思义字节的顺序&#xff0c;就是大于一个字节类型的数据在内存中的存放顺序&#xff0c;也就是说对于单字符来说是没有字节序问题的&…

蓝桥杯国一,非ACMer选手保姆级经验分享

目录 一、前言二、蓝桥杯简介三、0基础计算机新手小白&#xff0c;赛前如何准备提高自己的获奖率&#xff1f;3.1 每两周参加一次【蓝桥算法双周赛】3.2 多练真题3.3 参加每一场官方校内模拟赛 四、结语 一、前言 hello&#xff0c;大家好&#xff0c;我是大赛哥(弟)&#xff…

1000道精心打磨的计算机考研题,408小伙伴不可错过

提示&#xff1a;408考研人看过来&#xff0c;超精选计算机考研1000题&#xff01; 文章目录 前言1. 为什么是1000题&#xff1f;2. 有什么优势&#xff1f;【练学结合&#xff0c;助力强化】【难度适中&#xff0c;但不刁钻】【题目新颖&#xff0c;独具匠心】【考题预测&…

Minio

Minio学习 MinioMinio介绍安装window安装1.下载服务端和客户端文件[地址](https://min.io/download#/windows)2.创建minio相关目录3.启动minio服务方式一方式二4.查看minio版本5.访问minio控制台 linux安装docker安装 Minio Minio介绍 MinIO 是在 Apache License v2.0 下发布…

云课五分钟的一些想法

起源 自中学起&#xff0c;就积极学习和掌握互联网相关知识&#xff0c;到如今已经快30年了。 个人也全程经历了从信息时代的互联网&#xff08;硬&#xff09;到智能时代的大模型&#xff08;软&#xff09;。 整体信息到智能的基础设施&#xff0c;由硬到软&#xff0c;机…

安装表面应变计的方法及注意事项

安装表面应变计的方法及注意事项 表面应变计被广泛用于水利工程和混凝土结构中&#xff0c;用于测量埋设点的线性变形&#xff08;应变&#xff09;和应力&#xff0c;同时也可以测量温度。它们可以分为表面安装式和埋入式两种。 一、埋入式表面应变计 1、混凝土应变计的安装…

蓝桥杯每日一题2023.11.13

题目描述 蓝桥杯大赛历届真题 - C 语言 B 组 - 蓝桥云课 (lanqiao.cn) 题目分析 由于每次吹灭的蜡烛与年龄相同故我们想到使用前缀和可以让我们求出各个区间的和&#xff0c;我们将每个区间都枚举一遍&#xff0c;如果符合要求就输出区间开始的位置&#xff08;答案&#xff…

C语言—i++、++i、条件运算符、goto语句、注释

i和i #include <stdio.h> int main() {int i5,j;j i;printf("i%d,j%d\n", i, j);i 5;j i;printf("i%d,j%d\n", i, j);system("pause");return 0;}i6,j6 i6,j5 请按任意键继续. . .条件运算符 goto语句 #include <stdio.h> int …

SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对这篇博客也感兴趣o (ˉ▽ˉ&#xff1b;) &#x1f4dc;SpringIOC和DI的代码实现&#xff0c;Spring如何存取对象&#xff1f;Controller、Service、Repository、Component、Configuration、Bean DI详…

若依框架下载文件

若依下载的逻辑是指定文件存储的路径&#xff0c;在ruoyi-admin模块下的application.yml中配置路径结尾必须要加/或者\结尾。 他使用的是虚拟路径映射&#xff0c;所以文件名必须是配置路径下真实的文件名。 若依采用的是流的方式&#xff0c;前端必须要用bolb的方式去接收&am…

四入进博会,优衣库围绕科技可持续演绎“服装进化论”

11月5日&#xff0c;第六届中国国际进口博览会在上海拉开帷幕。这些年来&#xff0c;进博巨大的平台效应&#xff0c;使其成为各个行业头部品牌的秀场&#xff0c;也持续为消费者、产业链带来惊喜。 今年&#xff0c;也是全球服装界科技知名品牌——优衣库的第四次进博之旅。从…

Node-RED系列教程-28修改UI默认背景图片

主要使用到如下节点: 实现过程如下: 步骤1:编写背景图片请求服务. http in节点配置: 读文件节点配置: http out节点配置: 到此,背景图片请求服务搭建完成。

vue3 自动导入composition-apiI和组件

1.api的自动导入 常规写法&#xff1a; <script setup>import { ref, reactive, onMounted, computed ,watch } from vue;import { useRouter } from "vue-router";const router useRouter();const person reactive ({name&#xff1a;张三&#xff0c;age…

Ubuntu取消sudo的输入密码

Ubuntu最近要安装软件&#xff0c;每次sudo都要输入一次密码&#xff0c;感觉很麻烦&#xff0c;于是想能不能设置为不输入密码&#xff0c;在网上找了一下解决办法。 主要参考这篇文章&#xff1a; Ubuntu取消sudo时输入密码 上面这篇文章使用的是vim&#xff0c;但是按照博…

会员题-力扣408-有效单词缩写

有效单词缩写 字符串可以用 缩写 进行表示&#xff0c;缩写 的方法是将任意数量的 不相邻 的子字符串替换为相应子串的长度。例如&#xff0c;字符串 “substitution” 可以缩写为&#xff08;不止这几种方法&#xff09;&#xff1a; “s10n” (“s ubstitutio n”) “sub4…