一、协议栈结构

如上图所示,蓝牙协议分为Controller和Host两个部分,Controller为蓝牙底层,为蓝牙物理芯片,Host是真正意义上的蓝牙协议。Profiles(配置文件)总是基于GATT和GAP上。

二、Controller层

2.1 PHY(Physical layer)

定义Ble所使用的2.4G频段,实现调制、解调以及跳频(Hopping)等,PHY层直接影响到蓝牙的功耗及射频性能。

  • 工作频段:2.4 GHz ISM频段(2402 MHz - 2480 MHz)。

  • 调制方式:GFSK(高斯频移键控)。

  • 信道划分:BLE使用40个信道,其中3个为广播信道(37、38、39),其余37个为数据信道。选择37、38、39作为广播信道的原因是为了避免WIFI频段的干扰。

2.2 LL(Link Layer)

为整个蓝牙协议栈的核心,主要用于RF射频控制,LL层定义了协议栈中最为基础的状态机、数据包格式、广播、连接流程等。

LL层做的事非常多,比如选择那个信道进行传输吗,识别空口数据包、选择时间点发送数据、保证数据完整性等

LL层负责把数据发送和接收回来。而数据的解析则由上面的GAP和GAPP完成。

2.3 HCI(Host Controll Interface)

主机控制接口,为Host和Controll层提供一个标准化接口,可以是软件API,也可以是USRT、SPI等硬件控制。

主要用于双核实现蓝牙协议栈的场合,用于规范两核之间的通信协议和命令等。

三、Host层

3.1 L2CAP (Logic Link Control and Adaption Protocol)

为LL层提供数据封装,将数据打包,让客户实现点对点的通信。

L2CAP对LL数据进行了一次简单的封装,LL只关心传输数据本身,而L2CAP就是要区分是加密通道还是普通通道,如通过CID(Channel Identifier)标识不同的逻辑信道(如ATT、SMP)。同时还要对连接间隔进行管理。

L2CAP对数据进行分割和重组,使得较长的数据包可以在底层无线电中传输,L2CAP决定了MTU(Maximum Transmission Unit,最大传输单元),一般的蓝牙的MTU <248 Byte。

3.2 SMP(Security Manager Protocol)

只要负责Paring(配对)、Bonding(绑定)过程的配对密钥LTK(Long Term Key)生成,从而实现连接的加密传输,但是这种加密对于用户是无感、透明的。

3.3 ATT(Attribute Protocol 属性协议层)

定义客户端-服务器模型的数据交互规则。ATT环境中,允许设备向另外一个设备展示一块特定的数据,称之为属性。

  • 属性(Attribute):数据的基本单元(如温度值、设备名称)。

  • 操作指令:支持ReadWriteNotifyIndicate等操作。

  • UUID:唯一标识属性的类型(如0x2A19表示电池电量)。

  • 数据结构:每个属性包含句柄(Handle)、UUID、权限和值。

3.4 GAP(Generic Access Profile)

直接与APP、Profile配置文件通信的接口,主要用来控制LL层的五种状态切换,管理设备角色、广播、扫描、连接流程和设备可见性。

五种状态:Standby、Advertising、Scanning、Initiating、Connected,状态切换流程图:

GAP的上层是GAP Role,这是一个单独的任务,主要实现GAP参数的配置,例如广播内容、连接参数、连接角色等。

GAP层的角色包含如下:

  1. Broadcaster:广播者,发射不可连接广播信号。

  2. Observer:观察者,进行广播扫描,但不发起连接。

  3. Peripheral:发射可连接广播信号,且能够被主机连接,(也即是蓝牙从机)

  4. Central:扫描广播信号,并发起连接(也就是蓝牙主机)

当设备处于广播状态时,会在37、38、39三个信道上发送广播事件,相邻的两个广播事件间隔成为广播间隔。广播间隔单位为0.625ms,时间范围为20ms~10.24s。广播间隔越长功耗越低。

发起Advertising的作为从机,Scanning一方连接后作为主机。在连接过程中主机会与从机进行请求连接参数交换。参数由以下组成:

  1. 连接间隔(Connect Interview)

所有的数据传输均发生在连接事件期间,相邻的两个连接事件的间隔称为连接间隔,每个连接事件期间可以传输多个包,比如8个(nordic),连接事件间隔单位为1.25ms,事件范围为7.5ms~4.0s。

从这里就可以计算出某款Ble芯片的理论最大传输带宽:1000/7.5ms *MTU(248B)*8 = 2Mbps

  1. 从机潜伏(Slave Latency)

当Slave没有数据发送时,允许从机跳过当前的连接事件,从机潜伏值(Slave Latency)代表允许从机跳过的最大数量的连接事件。在某次连接事件中,如果Slave没有对Master的包做出回应,那么Master会在后面的连接事件中重复发送,直到Slave回应。下图为Latency = 0,和Latency = 3时的对比图。

  1. 监督超时 (Supervision Timeout)

在每个连接事件中,Mater发送信号,Slave进行回应,当长时间不回应,蓝牙连接将断开,超时断开的时间称之为监督超时时间。监督超时时间单位为10ms,时间范围为100ms~32s间。

3.5 GATT (Generic Attribute Protocol)

在ATT基础上定义服务(Service)、特征(Characteristic)等高级数据结构。Ble的GATT层用于实现两个设备间应用层的设备通信。GATT采用Client/Server架构,Client通过访问Server的服务(Service)、特征(Characteristic)来实现数据交互。

关于服务(Service)、特征(Characteristic)的描述如下:

  1. 用户的应用由一个或多个服务(Service)组成,一组相关功能的集合(如心率服务、电池服务)。

  2. 每个服务(Service)包含一个或者多个特征(Characteristic),如服务中的具体数据项(如心率值、电量百分比)。

  3. 每个特征(Characteristic)包含一个或多个属性(Attribute ),每个特征包含 三个核心属性(Attribute)

td {white-space:nowrap;border:0.5pt solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}

属性类型 说明
特征声明(Characteristic Declaration) 描述特征的元数据(如权限、UUID),固定格式为:
[属性类型: 0x2803(特征声明UUID)] + [权限] + [特征值属性句柄] + [特征值UUID]
特征值(Characteristic Value) 实际存储或传输的数据(如心率数值),由开发者定义数据格式。
描述符(Descriptor) 可选附加属性,用于描述特征的配置(如启用通知/指示)。

属性是蓝牙数据传输的最小单元,所有服务和特征均由属性构成。每个属性包含以下字段:

td {white-space:nowrap;border:0.5pt solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}

字段名 说明
句柄(Handle) 系统自动分配的唯一标识符(16位),客户端通过句柄访问属性(如读/写)。
UUID 标识属性类型(如特征声明、特征值或描述符)。
权限 定义客户端对属性的操作权限(如读、写、加密)。
实际数据内容(最大长度由MTU决定,默认23字节,可通过协商扩展)

01-Ble 协议栈分层的更多相关文章

  1. 深入浅出低功耗蓝牙(BLE)协议栈

    深入浅出低功耗蓝牙(BLE)协议栈 BLE协议栈为什么要分层?怎么理解蓝牙"连接"?如果蓝牙协议只有ATT没有GATT会发生什么? 协议栈框架 一般而言,我们把某个协议的实现代码称 ...

  2. TI BLE协议栈软件框架分析

    看源代码的时候,一般都是从整个代码的入口处开始,TI  BLE 协议栈源码也不例外.它的入口main()函数就是整个程序的入口,由系统上电时自动调用. 它主要做了以下几件事情: (一)底层硬件初始化配 ...

  3. BLE协议栈及传统蓝牙协议栈对比图

    1. BLE协议栈的层次图如下: 主机控制接口层: 为主机和控制器之间提供标准通信接口 逻辑链路控制及自适应协议层: 为上层提供数据封装服务 安全管理层: 定义配对和密钥分配方式,为协议栈其他层与另一 ...

  4. 深入浅出讲解低功耗蓝牙(BLE)协议栈

    详解BLE连接建立过程https://www.cnblogs.com/iini/p/8972635.html 详解BLE 空中包格式—兼BLE Link layer协议解析https://www.cn ...

  5. 蓝牙BLE: 蓝牙(BLE)协议栈

    蓝牙协议是通信协议的一种,一般而言,我们把某个协议的实现代码称为协议栈(protocol stack),BLE协议栈就是实现低功耗蓝牙协议的代码,理解和掌握BLE协议是实现BLE协议栈的前提.当前的蓝 ...

  6. NORDIC 烧录BLE协议栈后不能用JLINK仿真bootloader问题及修改方案

    问题原因: bootloader的程序区域是0X78000~0X7E000 但是在bootloader程序中定义了0X0FF8与0XFFC位置处的数据,此数据与BLE协议栈冲突,BLE协议栈的flas ...

  7. 【转】TI蓝牙BLE 协议栈代码学习

    BLE就是低功率蓝牙.要着重了解两种设备: dual-mode双模设备:简单说就是向下兼容. single-mode单模设备:仅仅支持BLE.   关于开发主要讲的是单模设备,它可以只靠纽扣电池即可持 ...

  8. 【无线通信篇01 | Zstack协议栈】CC2530 Zigbee Zstack协议栈组网项目及详细讲解篇

    演示视频:https://www.bilibili.com/video/BV1Ew411o7Fp 物联网无线通信技术,ZigBee无线传感网络 CC2530最大的特点就是一个拥有无线收发器(RF)的单 ...

  9. TI CC2541 BLE协议栈蓝牙MAC 地址

    在Flash中有一块只读区域,从地址0x780E开始,蓝牙的MAC以小端方式存放在里面. 在TI的Peripheral例程里面,添加一个特征值,只读属性,6字节长度(蓝牙MAC长度为48-bit,6字 ...

  10. BLE 5协议栈-主机控制接口(HCI)

    文章参考自:http://www.sunyouqun.com/2017/04/page/3/ .https://www.cnblogs.com/yuqilihualuo/p/9790164.html ...

随机推荐

  1. Web前端入门第 42 问:聊聊 CSS 元素上下左右(水平+垂直)同时居中有几种方法

    影响元素位置的 CSS 属性基本介绍完毕(参考前几篇文章),现思考一个最常见的需求: 一个子元素,要摆放在盒子的正中央,使用 CSS 布局手段,究竟有多少种实现方式? 上下左右(水平方向.垂直方向)要 ...

  2. Apache Flink(CVE-2020-17519)路径遍历漏洞复现_附POC和批量检测脚本

    声明 本文仅用于技术交流,请勿用于非法用途 由于传播.利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任. 文章作者拥有对此文章的修改和解释权.如 ...

  3. 代码随想录第十三天 | Leecode 144. 二叉树的前序遍历、 94. 二叉树的中序遍历、 145. 二叉树的后序遍历

    Leecode 144. 二叉树的前序遍历 题目链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/ 题目描述 给你二叉树的根 ...

  4. jsonp跨站请求

    本地端 url: url(r'req/',a2.req), commons.js alert(123); views.py from django.shortcuts import renderimp ...

  5. K8s进阶之一文搞懂PV,PVC及SC

    前言 想了解Pod的基本存储,可以参考这篇文章:K8s新手系列之Pod的基本存储 概述 官方文档: 配置Pod使用PV进行存储:https://kubernetes.io/zh-cn/docs/tas ...

  6. C#开发的Panel滚动分页控件 - 开源研究系列文章

    前些时候因为想拥有一个自己的软件快捷打开软件,于是参考Windows 11的开始菜单,进行了编写这个应用软件,里面有一个功能就是对显示的Panel里的应用对象的分页功能,于是就想写一个对Panel的自 ...

  7. [转发] Go pprof内存指标含义备忘录

    原文链接 Go pprof内存指标含义备忘录 最近组内一些Go服务碰到内存相关的问题,所以今天抽时间看了下Go pprof内存指标的含义,为后续查问题做准备. 内容主要来自于Go代码中对这些字段的注释 ...

  8. OpenPPL的执行流程与类间关系UML表达

    上一讲,对OpenPPL进行了介绍,以及通过官方文档,学习了它的python与C++的操作流程,以及如添加新的引擎与Op算子. 本节,将通过阅读代码通过UML梳理操作流程以及类之间的相互关系 src地 ...

  9. 高性能NoSQL

    极客时间:<从 0 开始学架构>:高性能NoSQL 1.引言 关系型数据库凭借着SQL功能和ACID的属性,活跃于各种各样的系统中,但它并不是完美的,其存在以下缺点: 关系数据库存储的是行 ...

  10. 抽象类&&接口做形参(其实同理)

    抽象类:传入该抽象类的子类对象 eg: package javaBasic; public class TestAbstract { public static void main(String[] ...