BLE蓝牙协议 — BLE连接建立过程梳理(一)

2023-11-15

文章出处:枫之星雨(转载文章,如有不妥,通知后我会立即删除)

连接建立

应付比广播更为复杂的数据传输,或者要在设备之间实现可靠的数据交付,这些都要依赖于连接。连接使用数据信道在两个设备之间可靠地发送信息。它采取了自适应跳频增强鲁棒性,同时使用了非常低的占空比,尽可能地降低功率消耗。

设备创建连接的过程如下图所示。简言之,设备首先广播可连接广播事件,其他设备收到之后即可发起连接。在此过程中,广播者发送的事件类型要么是通用广播事件,要么是直接广播事件。发起者收到正确的广播报文时,将向广播者发送一个连接请求,其中包括了连接开始时需要的所有信息。

下面来了解连接过程中涉及到的一些主要知识点:

1.连接中使用的接入地址

2.CRC初始值

3.发送窗口

4.连接事件和连接参数

5.自适应跳频信道图

6.睡眠时钟精度

一旦收到或发出连接请求报文,设备即建立了连接,数据交换随之开始。

连接中使用的接入地址

连接使用的接入地址总是由主设备来提供。地址通过随机生成,但是需要遵循一些规则。如果主设备有多个从设备,它会为每个从设备选择不同的随机接入地址。地址的随机性确保了在不同的主从设备之间发生的碰撞概率会很低。随机性也增强了隐私,扫描者无法得知是哪两个设备正在通信。

CRC初始值

CRC初始值是另一个由主设备提供的随机数。随机的意义在于,如果在同一个区域有两个主设备正在和不同从设备通信,那么使用相同的接入地址的概率将会很低。如果确实发生了这种情况,从设备会从错误的主设备收到干扰数据包。因此,为每个从设备设置随机的CRC初始值,主从设备既有相同的接入地址又有相同的CRC初始值的概率就会变得微乎其微。

发送窗口

从设备可以自行决定广播的时间,它们是最需要保存电量的设备,这样的设计并无不妥。但是,如果主设备已经在做其他事情,也许是一些更重要的事情,那么它必须让低功耗蓝牙错开当前的活动。在连接建立期间,有两个参数用来传递上述信息:窗口大小和窗口间隔。

当连接请求数据包发送完毕,存在一个1.25ms的强制时延,紧接着是发送窗口偏移和发送窗口。发送窗口偏移可以是0到连接间隔之间的任意值,但必须为1.25ms的整数倍。从发送窗口开始,从设备打开其接收器,并等待来自主设备的数据包。如果到发送窗口结束时仍未收到数据包,从设备终止侦听,并会在一个连接的间隔后再次尝试。

关于连接过程,最有趣的一个地方是,一旦发送了连接请求,主设备便认为自身有了连接;该连接已经创建(created),但还不能算是完全确立(established)。当从设备收到连接请求时,它也认为自己已经处在连接之中;连接已经创建,但不能证明完全确立。

出于效率的考虑,连接已经创建,主机就会立即收到通知。连接可能不会成功,从设备也许收不到连接请求,或者两个设备的距离很远。这些情况如果发生,连接失败的概率将变得很高。然而,由于主机收到了连接已创建的通知,它可以开始将数据发给控制器从而为首个无线数据包的传输做好准备,并且节约时间和能量。因为第一个数据包的发送至少会在1.25ms延迟之后,主机堆栈应该有足够的时间向控制器提供数据,以便在第一时间发送出去。这种强制性的延迟为设备提供了喘息的机会:在繁重的广播规程与连接正式确立之间,电池获得了宝贵的恢复时间。

只有收到了数据包确认,连接才能视为正式确立。确立不改变连接的工作方式,但它改变了链路监控超时的时间从之前的6个连接间隔,变为了在连接请求中设定的值。这样一来,如果连接不能迅速确立的话将会立即终止。

连接事件和连接参数

这部分是重点内容,所以下一篇博文来详细阐述。

博文地址:点击打开链接

自适应跳频信道图

自适应跳频信道图是数据信道的位掩码,用来标记信道的好坏。由于共有37个数据信道,信道图的长度于是设为37位。如果某一位被设置为1,表明该信道良好,可用于数据通信;如果该位为0,表明该信道很糟,不可用于数据通信。

跳频算法的跳数值是在5 ~ 16之间的一个随机数。跳数值被用在自适应重映射之前的跳频算法中。显然,跳数值不能为0,否则频率永远不会改变。

非常低的跳数也是不可取的,因为大多数的干扰一般会占据好几兆带宽,使用非常小的跳数值将不会快速地将传输带离干扰源,可能造成持续干扰。同样的逻辑也适用于17或更高的值。试想,如果增量为17,由于跳频算法中要对37个信道取模,每两个频率之间的差距将紧紧只有3个信道。

睡眠时钟精度

最后,主设备发往从设备的信息中还包括睡眠时间精度值。该值定义了时钟能够保证的精度范围。如果时钟由晶振提供,晶振有一个根据温度变化的精度范围,比如在室温下为 20ppm,在 0℃ 或 85℃ 时为 50ppm 。如此一来,设备可以声明其时钟精度达到 50ppm 。

时钟精度可以帮助从设备消除连接事件的不稳定性。如果从设备与主设备的不同步时间达到 1s,而这两个设备的定时精度均为 500ppm,那么,将合并的不确定性 1000ppm 乘以上述时间,就得到一个 1ms 的不确定窗口。也就是说,从设备必须提早 1ms醒来,并在这额外的 1ms 内保持侦听,以仿主设备和从设备的时钟在不同的方向发生了最大漂移。

更精确的时钟可以降低功耗。还是以使用晶振的设备为例,如果两个设备的时钟精度分别为 50ppm 和 150ppm ,二者合并后的精度只有 200ppm 。一秒钟之后,从设备只需要提前 200μs 醒来并保持侦听。如果设备被唤醒的频率不高,他们的可用工作时间将 5 倍于两个使用 500ppm 晶振的设备。因此,如果对降低功耗有特别的要求,建议在设备中使用高精度的晶振。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BLE蓝牙协议 — BLE连接建立过程梳理(一) 的相关文章

  • 汇承4.0蓝牙BLE串口助手HC-COM的使用方法及出错的原因和改正方法

    本文主要介绍在使用汇承4 0蓝牙BLE串口助手HC COM xff0c 通过手机向蓝牙模块发送数据 或者通过手机向与蓝牙模块连接的单片机发送指令时 xff0c 串口中断函数的编写方法及出错的原因和改正方法 我们怎么把指令发送出去 xff0c
  • 蓝牙5.1的ble那些事儿

    到这里 对于非连接状态应该有一些新的认识了 接下来 顺其自然当然就是连接了 你谈对象 忙活半天 当然是想干点什么事情了 当然也有老司机翻车 连接上后 一端要主动向另一端发起问候 否则长时间不联系 那么就断开好了 主动问候的一端我们称之为ma
  • BLE中的Service(服务)和characteristic(特征值)

    Service 服务 和characteristic 特征值 之间的关系 Service 服务 服务是用来完成特定功能或特性的数据和相关行为的集合 在GATT中 服务由其服务定义来定义 服务定义可能包含所包含的服务 强制性特征和可选特征 可
  • ESP32-C3 学习测试 蓝牙 篇(四、GATT Server 示例解析)

    了解了蓝牙 GATT 相关概念 趁热打铁 分析一下官方示例 GATT Server 的应用程序架构 目录 前言 一 GATT Server 示例分析 1 1 初始化 1 2 回调函数 gatts event handler gap even
  • 【BLE】蓝牙抓包器 Ellisys 使用说明

    BLE 蓝牙抓包器 Ellisys 使用说明 常用功能 设备过滤 抓包的类型 添加观察的项目 协议解析 连接过程 Connection Indication LLCP Feature Request Response LLCP Length
  • BLE低功耗蓝牙协议栈

    目录 一 BLE低功耗蓝牙协议栈 1 蓝牙核心协议 Bluetooth Core 2 蓝牙应用层协议 Bluetooth Application 3 BLE低功耗蓝牙核心协议层详解 Bluetooth Core 物理层 PHY 链路层 LL
  • App 和设备通过蓝牙连接收发数据

    一 Android 中进行蓝牙开发需要用到的类和执行过程 1 使用BluetoothAdapter startLeScance来扫描设备 2 在扫描到设备的回调函数中的得到BluetoothDevice 对象 并使用Bluetooth st
  • 基于富芮坤fr8016 蓝牙5.0 芯片设计的BLE HID Joystick 游戏摇杆设备

    文章目录 ble hid 学习笔记 HID报告描述符与BLE HID profile之间关系 1 HID报告描述符 富芮坤fr8016 设计Joystick例子 1 描述X轴Y轴Z轴 2 描述按钮 3 Joystick 报告描述符 4 程序
  • 2021/9/29 TX POWER 蓝牙发射功率

    1 觉得挺奇葩 如果不是扩展包的话 就是TX power 设定 没法通过hci 下发 就是 在controller 设定好 也没法中途去变化 扩展包 有这个选项 能够改变 可以通过HCI 下发指令来更改 2 AD9361 设置发射功率 要注
  • Android(Java)开发之获取BLE广播包(扫描后获取:广播数据+扫描应答数据+RSSI)

    一 安卓BLE的广播包数据从哪获取 通常 安卓APP读写BLE设备的数据都是建立连接后通过GATT获取或修改 但是 BLE设备向外广播时本身会携带一部分有用信息 如将传感数据存放到广播包的自定义数据段 最近接触的一个iBeacon Eddy
  • CC2642 数据长度扩展(LE Data Length Extension)

    概要 数据长度扩展 LE Data Length Extension 功能允许LE控制器在连接状态下发送具有高达251字节的PDU 在连接期间的任何时刻 主从设备可以协商该PDU大小 这个和MTU不同 MTU是应用层的数据传输长度 这个是链
  • 蓝牙PHY6222添加OTA升级功能

    主要步骤 1 代码添加 ota app service 2 keil软件添加ota app代码 3 烧录软件添加ota设置 4 手机ota app升级 准备 奉加微电子官网下载6222的代码SDK V3 0以上 下载官网的PhyPlusKi
  • BLE蓝牙笔记----数据包解析

    本文是参考一些博文和书籍做的笔记 如有不适联系删除 参考 https www cnblogs com iini p 8977806 html BLE4 0 低功耗蓝牙 协议 总结 目录 1 广播包 1 1 PDU Type 1 2 MAC地
  • ESP32-C3 应用 篇(实例二、通过蓝牙将传感器数据发送给手机,手机端控制 SK6812 LED)

    ESP32 C3 蓝牙部分我们学习了GATT 本文尝试使用蓝牙做一个简单的小应用 目录 前言 一 整体框架 二 数据传输部分 2 1 添加温湿度驱动组件 2 2 传感器数据传输程序 再次说明 ESP GATTS READ EVT 事件 2
  • NRF52832学习笔记(2)—— 添加DFU功能(基于SDK15.3)

    前言 SDK版本15 3 评估板 pca10040 在 uart 的例程中添加 DFU 功能 使用 s132 的协议栈 因为官方的 BootLoader 工程用的是s132的协议栈 一 准备工作 在开始实验之前必须先准备以下软件 gcc a
  • BLE蓝牙协议 — BLE连接建立过程梳理(一)

    文章出处 枫之星雨 转载文章 如有不妥 通知后我会立即删除 连接建立 应付比广播更为复杂的数据传输 或者要在设备之间实现可靠的数据交付 这些都要依赖于连接 连接使用数据信道在两个设备之间可靠地发送信息 它采取了自适应跳频增强鲁棒性 同时使用
  • BLE学习(4):蓝牙地址类型和设备的隐私

    蓝牙地址也被称为蓝牙MAC地址 它能唯一标识一个蓝牙设备的48位的值 在蓝牙规范中 它被称为BD ADDR 蓝牙的地址类型可以分为两种 public addresses和random addresses 其中random addresses
  • NRF52832学习笔记(1)—— 添加自有service(基于SDK15.3)

    前言 SDK版本15 3 评估板 pca10040 在uart的例程中添加battery service 添加之前 手机连上设备之后扫描到的service如下 一 分配ram空间 softdevice的flash code是确定 但ram是
  • 使用Arduino开发ESP32(22):蓝牙作为客户端使用

    文章目录 目的 基础准备 搜索蓝牙设备 搜索设备 信息查询 连接与交互 总结 目的 ESP32的蓝牙除了作为服务器 从设备 使用还可以作为客户端 主机 使用 这篇文章将对相关内容做个简单说明 基础准备 这篇文章中测试需要先准备一个蓝牙服务器
  • 解密蓝牙mesh系列

    转载自 蓝牙技术联盟 蓝牙mesh网络 友谊篇 低功耗蓝牙 Bluetooth Low Energy 是全球最具节能性的短距离无线通信技术之一 其低功耗的特性广受开发者和消费者赞誉 随着蓝牙mesh网络的推出 开发者可能想知道蓝牙mesh网

随机推荐

  • MATLAB——矩阵与阵列

    变量及操作 变量命名规则 赋值语句 运算符和表达式 矩阵产生与表示 直接输入法创建矩阵 向量法创建矩阵 函数法创建矩阵 特殊矩阵 矩阵元素的引用 矩阵单个元素与行列提取 向量标识方式 矩阵基本操作 矩阵提取子块 合并短阵 转置与展开 提取子
  • Lion闭源大语言模型的对抗蒸馏框架实践

    Lion闭源大语言模型的对抗蒸馏框架实践 概述 对抗蒸馏框架概述 我们基于高级闭源LLM的基础上提炼一个学生LLM 该LLM具有三个角色 教师 裁判和生成器 有三个迭代阶段 模仿阶段 对于一组指令 将学生的响应与老师的响应对齐 区分阶段 识
  • ESP8266-NodeMCU(一)

    ESP8266 NodeMCU开发板的驱动有CH340和CP210等等 本文使用ESP8266 NodeMCU CH340驱动版本 一 开发板详解 NodeMCU是一个开源的IoT物联网硬件开发板 由于它支持WIFI功能且使用方法十分类似A
  • RAM处理器的8种寻址方式

    什么是寻址 寻址是指找到存储数据或指令的地址 然后读取其中的内容 寻址方式就是处理器根据指令中给出的地址信息来寻找有效地址的方式 是确定本条指令的数据地址以及下一条要执行的指令地址的方法 ARM处理器采用的RISC架构 CPU本身是不能直接
  • MyBatis resultMap collection标签 返回基本类型集合 如:List<Long> List<String> List<Integer>等

    class xxDTO private Long id private Set
  • vc 判断某个盘符是否为移动硬盘盘符

    在使用GetDriveType获取磁盘类型时 一般小容量的U盘直接返回DRIVE REMOVABLE 倒是不用再进行下一步的判断 而大容量U盘和移动硬盘的盘符返回值和本地硬盘盘符返回值都是DRIVE FIXED 需要再进行判断 如果是IDE
  • 【paddlepaddle】一键人物抠图

    效果 环境准备 win11 python3 8 pip install paddlepaddle i https pypi tuna tsinghua edu cn simple pip install paddlehub i https
  • animation 动画的定义和使用

    keyframes 定义动画 keyframes myname 0 50 100 调用动画 div animation name myfirst animation duration 5s animation timing function
  • Unity 开发人员转CGE(castle Game engine)城堡游戏引擎指导手册

    Unity 开发人员的城堡游戏引擎概述 一 简介 2 Unity相当于什么GameObject 3 如何设计一个由多种资产 生物等组成的关卡 4 在哪里放置特定角色的代码 例如生物 物品 Unity 中 向 GameObject 添加 Mo
  • U盘启动盘制作(步骤详细)

    U盘启动盘制作 在制作启动盘之前我们需要先准备一个8G以上的U盘 和一台能上网的电脑 一 下载系统镜像 根据自己需要的系统版本去下载官方的镜像文件 记得要下载纯净的镜像 否则在后续安装好系统后会出现捆绑的现象 可以直接去下面这个网站下载 下
  • rsync实现文件服务器间文件同步

    rsync介绍 rsync命令工具可以实现服务器间的文件同步 全量或者增量 比如使用 size only来检查源端文件和目标端文件大小是否一致决定是否需要同步 由此同步的功能扩展 可以实现本机不同目录文件拷贝 快速删除海量文件等功能 但要注
  • MySQL隔离级别

    表结构和表数据如下 id 自增主键 uid 唯一索引 name price 普通索引 pictures 33 a Apple 12 NULL 34 b banana 5 NULL 35 c cherry 51 NULL 36 d date
  • Python语言 :关于使用装饰器的技巧介绍

    转自 微点阅读 https www weidianyuedu com 导语 装饰器 Decorator 是 Python 里的一种特殊工具 它为我们提供了一种在函数外部修改函数的灵活能力 它有点像一顶画着独一无二 符号的神奇帽子 只要将它戴
  • 抽象,内部类,接口,多态

    final 最终的 不能改变的 单独应用几率低 修饰变量 变量不能被改变 修饰方法 方法不能被重写 修饰类 类不能被继承 static final常量 应用率高 必须声明同时初始化 常常通过类名点来访问 不能被改变 建议 常量名所有字母都大
  • android — NDK生成so文件

    我们在安装环境的时候安装了NDK 可以在eclipse下直接生成so文件 NDK的压缩包里面自带了一些sample工程 NDK的文件直接解压到某个目录下即可 第一次生成so文件的时候 我们先使用NDK的sample下的hello jni的例
  • 【栈】逆波兰计算器

    文章目录 前言 一 基本概念 1 1 介绍 1 2 入栈和出栈示意图 1 3 栈的应用场景 二 使用数组模拟栈 2 1 思路分析 2 2 代码实现 2 3 测试 三 使用栈模拟中缀表达式计算器 3 1 整体思路 3 2 验证3 2 6 2
  • Qt基本窗口

    窗口类 1 Qt中最经常被使用的窗口类是QWidget QDialog 其中QDialog是继承于QWidget 它是一个顶级窗口 不能附着在其他QDialog上面 一般情况下QDialog基本都是用 在弹出窗口需求中被使用 而QWidge
  • OpenGL中光源的三种移动区别

    1 光源不动 需要在设置完视图模型变换之后 然后再设置光源的位置并且开启 伪代码如下 glmatrixmode gl projection glloadidentity xxxxxxxxxx glmatrixmode gl modelvie
  • Vue 移动端、PC 端适配

    Vue 移动端 PC 端适配可以使用 lib flexible amfe flexible postcss pxtorem postcss px2rem 和 postcss px to viewport 这几个插件 lib flexible
  • BLE蓝牙协议 — BLE连接建立过程梳理(一)

    文章出处 枫之星雨 转载文章 如有不妥 通知后我会立即删除 连接建立 应付比广播更为复杂的数据传输 或者要在设备之间实现可靠的数据交付 这些都要依赖于连接 连接使用数据信道在两个设备之间可靠地发送信息 它采取了自适应跳频增强鲁棒性 同时使用