ESP32-BLE基础知识
一、存储模式
两种存储模式:
- 大端存储:低地址存高字节,如将0x1234存成[0x12,0x34]。
- 小端存储:低地址存低字节,如将0x1234存成[0x34,0x12]。
一般来说,我们看到的一些字符串形式的数字都是大端存储形式:
- UUID:4A98-xxxx-1CC4-E7C1-C757-F1267DD021E8,其中0x4A是高位
- 设备地址:aa:bb:bb:dd:ee:ff,其中0xaa是高位
但是以上的写法只是方便人们看,存到机器里面还得是字节的形式,怎么存也得根据芯片和软件的规定来看。
- 在ESP32的sdk里面,UUID都是以小端模式的16个字节去存储的。
- 对于设备地址,在ESP-IDF的Bluedriod协议栈下,是以大端存储的,即[0xaa,0xbb,0xcc,0xdd,0xee,0xff],
- 如果使用NimBLE协议栈,则得反过来,用小端存成[0xff,0xee,0xdd,0xcc,0xbb,0xaa]。
有关数据发送,ESP32的变量是小端存储的,假如要发送一个16位变量,即uint16_t data = 0x0001(就是订阅通知时要写到特征描述符里的数据),实际上等同于发送了[0x01,0x00]两个字节。
有关数据接收,假如收到了一个4个字节的数据,存在buf数组里,要将它合成为一个为整形,可以逐个取出来进行运算合成;如果明确知道buf的低地址存的是低字节,而机器又是小端模式存储变量的,就也可以直接 int data = *(int *)buf,就是将字节指针转换成int类型的指针,然后取值。
二、BLE设备地址
BLE 设备地址长度为 6 字节,外加 1 个比特表示地址类型。
BLE 规范定义了若干种地址类型:
- 公共地址(地址类型为 0):是从 IEEE 获得的全球唯一的48位地址,高24位与厂家有关,同一厂家的芯片设备地址的高24位是一样的。
- 随机地址(地址类型为 1):包括静态设备地址(最高 2 个比特为 0b11)、 可解析私有地址(最高 2 个比特为 0b01)、不可解析私有地址(最高 2 个比特为 0b00)三种。其中静态地址每次上电后重新随机生成,整个上电周期内不发生改变;而私有地址则是用在安全方面的,是可选的。
在另外一个角度来说,用于识别设备身份的只有公共地址和随机静态地址两种,设备必须设置这两种中的一种来对外表明自己的身份。
- 乐鑫是有在IEEE注册的,因而可以使用公共地址。当然也可以不使用公共地址,通过调用SDK中的相关的API设置,就可以对外显示随机静态地址。
- 随机静态地址其实更加常见,因为一些厂商会觉得IEEE注册费用过高,此时便只能使用静态设备地址了。这也是随机静态地址提出来的目的,就是为了替代公共地址。
三、DLE、MTU、PDU等与数据长度有关的名词



PDU: 协议数据单元 (Protocol Data Unit)。由上图可见,数据包中的PDU在2-257字节之间,具体又分为LL Header、Payload和MIC三个部分。其中Payload最大为251字节,包含L2CAP Header、ATT Header 和 ATT Payload 三部分,而ATT Payload 才是我们真正发送的数据(ATT Data),最大为244字节。
DLE:数据长度扩展 (Data Length Extensions)。该功能在蓝牙核心规范 4.2 版本中引入,允许Payload容纳更多数据(最多 251 字节,默认为 27 字节)。即,在不开启DLE的情况下,一个数据帧的payload部分最多为27字节,除去两个Header共7个字节,有效数据仅有20个字节。而在开启DLE的情况下,单个数据包可以发送244个字节的有效数据。
MTU: 最大传输单元(Maximum Transmission Unit)。这是一个跟所使用协议栈有关的参数,描述的是一次 GATT 操作(例如,写、读等操作)中可以发送的数据量。由于MTU已经包含了ATT Header的3个字节,因而调用一次相关函数api时可以传入的有效数据量最大为(MTU-3)。当MTU的设置大于单个数据包最大长度时,协议栈就会分包发送。以下是几种情况。
- MTU默认为23,最多发送20字节有效数据,加上两个Header后为27字节,在不开启DLE情况下,刚好能够一个数据包就发送完。
- MTU设置大于23,加上Header后将大于27字节。如果不开启DLE,Payload最多为27字节,那么数据将被分割成27字节的块进行发送。
- MTU设置为247,最多发送244字节有效数据,加上两个Header后为251字节,如果开启DLE,刚好能够一次发完。247是开启DLE情况下单个数据包能够发送完整的最大MTU。
- MTU设置大于247,即便开启DLE也必然会分成多个数据包进行发送。
总的来说,MTU更多的是一个应用层编程时的概念,芯片厂商在根据自己芯片的性能和资源去订制协议栈时,一般会限定MTU的最大值,目前最大MTU一般在500到1000之间。至于单个数据包的最大长度则是由蓝牙规范严格规定的,开启DLE时最多为251字节,当需要发送的有效数据大于244(即MTU大于247)时,就会发生分包。因此,编程时需要合理选择MTU,以减少分包导致的资源浪费。
另外,由于主从机协议栈处理数据的能力不同,因而需要主从机对MTU进行协商。比如A协议栈的MTU设置为555,即调用一个write函数就可以最多发送552个字节的有效数据,然而接收端B协议栈的处理能力可能较弱,或者内存不足接收不了那么多数据,也就无法从接收到的多个数据包中提取出这552个字节。为此,刚连接时,主从机都必须使用23字节的默认MTU进行通信,之后双方进行协商,使用两者提出的MTU之中较小的MTU进行后续的通信。
以上部分图片来自Nordic。
相关文章:
ESP32-BLE基础知识
一、存储模式 两种存储模式: 大端存储:低地址存高字节,如将0x1234存成[0x12,0x34]。小端存储:低地址存低字节,如将0x1234存成[0x34,0x12]。 一般来说,我们看到的一些字符串形式的数字都是大端存储形式&a…...
vscode终端npm install报错
报错如下: npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion1, but package-lock.json was generated for lockfileVersion2. Ill try to do my best with it! npm ERR! code EPERM npm ERR! syscall open npm ERR! errno -4048…...
雪花算法的使用
雪花算法的使用(工具类utils) import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;// 雪花算法 Component public class SnowflakeUtils { // Generated ID: 1724603634882318341; // Generated ID: 1724603…...
flink源码分析之功能组件(一)-metrics
简介 本系列是flink源码分析的第二个系列,上一个《flink源码分析之集群与资源》分析集群与资源,本系列分析功能组件,kubeclient,rpc,心跳,高可用,slotpool,rest,metric,future。其中kubeclient上一个系列介绍过,本系列不在介绍。 本文介绍flink metrics组件,metric…...
Nginx反向代理和负载均衡
1.反向代理 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一…...
基于SSM的供电公司安全生产考试系统设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...
大数据-之LibrA数据库系统告警处理(ALM-12055 证书文件即将过期)
告警解释 系统每天二十三点检查一次当前系统中的证书文件,如果当前时间距离过期时间不足告警阈值天数,则证书文件即将过期,产生该告警。告警阈值天数的配置请参考《管理员指南》的“配置证书即将过期告警阈值”章节。 当重新导入一个正常证…...
应试教育导致学生迷信标准答案惯性导致思维僵化-移动机器人
移动机器人课程群实践创新的困境与突围 一、引言 随着科技的快速发展,工程教育变得越来越重要。然而,传统的应试教育模式往往侧重于理论知识的传授,忽视了学生的实践能力和创新精神的培养。这在移动机器人课程群的教学中表现得尤为明显。本文…...
【运维篇】5.4 Redis 并发延迟检测
文章目录 0.前言Redis工作原理可能引起并发延迟的常见操作和命令并发延迟检测分析和解读监控数据:优化并发延迟的策略 1. 检查CPU情况2. 检查网络情况3. 检查系统情况4. 检查连接数5. 检查持久化 :6. 检查命令执行情况 0.前言 Redis 6.0版本之前其使用单…...
碰到一个逆天表中表数据渲染
1. 逆天表中表数据问题 我有一个antd-table组件,他的编辑可以打开一个编辑弹窗打开弹窗里面还会有一个表格,如果这个表格的column是在外层js文件中保存的话,那么第一次打开会正常渲染数据,再次打开就不会渲染,即使是已…...
记录我常用的免费API接口
目录 1.随机中英文句子 2.随机中英文句子(带图片和音频) 3.随机一句诗 4.随机一句话 5.随机一句情话 6. 随机一句舔狗语录 7.历史上的今天 8.获取来访者ip地址 9:获取手机号信息 10. 垃圾分类查询 11.字典查询 12.QQ信息查询 1.随…...
编程的简单实例,编程零基础入门教程,中文编程开发语言工具下载
编程的简单实例,编程零基础入门教程,中文编程开发语言工具下载 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件,而且可以开发大型的软件&…...
创芯科技USB_CAN【库文件】
只用到【只收】【只发】功能 23.11.18 using help; //using Models; using System; using System.Collections.Generic; using System.Linq; using System.Net.NetworkInformation; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using Sys…...
React整理总结(四)
1.过渡动画react-transition-group Transition 与平台无关,不一定使用css实现CSSTransition组件,in属性控制展示隐藏,添加className;有三个状态appear | enter | exit 第一类,开始状态:对于的类是-appear、…...
ajax,axios,fetch
文章目录 ajax工作原理ajax发请求四个步骤创建xmlhttprequest对象设置请求方式设置回调函数发送请求 自封装ajax axiosaxios 特性如何用配置拦截器fetch 三者区别 ajax 工作原理 Ajax的工作原理相当于在用户和服务器之间加了—个中间层(AJAX引擎),使用户操作与服务…...
Java值传递和引用传递
在Java中,有值传递(Pass-by-Value)和引用传递(Pass-by-Reference)两种参数传递方式。 值传递(Pass-by-Value):当使用值传递方式时,方法将参数的副本传递给调用方法。这意…...
FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(1)
FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(1) 单字节写时序单字节读时序I2C 控制器设计模块框图scl_high 和 scl_low 产生的时序图状态转移图 Verilog代码 FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(1) FPG…...
LabVIEW编程开发NI-USRP
LabVIEW编程开发NI-USRP 可编程性是SDR的关键特性,它使人们能够将无线电外围设备转换为先进的无线系统。USRP是市场上最开放、最通用的SDR,可帮助工程师在主机和FPGA上使用各种软件开发工具构建系统。 有多种选项可用于对基于SDR的系统的主机进行编程。…...
ES6中实现继承
本篇文章主要说明在ES6中如何实现继承,学过java的小伙伴,对class这个关键字应该不陌生,ES6中也提供了class这个关键字作为实现类的语法糖,咱们一起实现下ES6中的继承。 实现思路 首先直接通过class来声明一个Teacther类ÿ…...
车载通信架构 —— 新车载总线类型下(以太网)的通信架构
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
