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类ÿ…...
车载通信架构 —— 新车载总线类型下(以太网)的通信架构
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...
2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...
