蓝牙协议栈

news2024/9/24 9:22:52

BLE协议栈整体架构

首先了解一下,BLE协议栈(protocol stack)整体架构。
在这里插入图片描述
如上图所述,要实现一个BLE应用,首先需要一个支持BLE射频的芯片,然后还需要提供一个与此芯片配套的BLE协议栈,最后在协议栈上开发自己的应用。可以看出BLE协议栈是连接芯片和应用的桥梁,是实现整个BLE应用的关键。那BLE协议栈具体包含哪些功能呢?简单来说,BLE协议栈主要用来对你的应用数据进行层层封包,以生成一个满足BLE协议的空中数据包,也就是说,把应用数据包裹在一系列的帧头(header)和帧尾(tail)中。具体来说,BLE协议栈主要由如下几部分组成:

  • PHY层(Physical layer物理层)。PHY层用来指定BLE所用的无线频段,调制解调方式和方法等。PHY层做得好不好,直接决定整个BLE芯片的功耗,灵敏度以及selectivity等射频指标。
  • LL层(Link Layer链路层)。LL层是整个BLE协议栈的核心,也是BLE协议栈的难点和重点。像Nordic的BLE协议栈能同时支持20个link(连接),就是LL层的功劳。LL层要做的事情非常多,比如具体选择哪个射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何进行重传,以及如何对链路进行管理和控制等等。LL层只负责把数据发出去或者收回来,对数据进行怎样的解析则交给上面的GAP或GATT。
  • HCI(Host controller interface)。HCI是可选的,HCI主要用于2颗芯片实现BLE协议栈的场合,用来规范两者之间的通信协议和通信命令等。
  • GAP层(Generic access profile)。GAP是对LL层payload(有效数据包)如何进行解析的两种方式中的一种,而且是最简单的那一种。GAP简单的对LL payload进行一些规范和定义,因此GAP能实现的功能极其有限。GAP目前主要用来进行广播,扫描和发起连接等。
  • L2CAP层(Logic link control and adaptation protocol)。L2CAP对LL进行了一次简单封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。
  • SMP(Secure manager protocol)。SMP用来管理BLE连接的加密和安全的,如何保证连接的安全性,同时不影响用户的体验,这些都是SMP要考虑的工作。
  • ATT(Attribute protocol)。简单来说,ATT层用来定义用户命令及命令操作的数据,比如读取某个数据或者写某个数据。 BLE协议栈中,开发者接触最多的就是ATT。BLE引入了attribute概念,用来描述一条一条的数据。 Attribute除了定义数据,同时定义该数据可以使用的ATT命令,因此这一层被称为ATT层。
  • GATT(Generic attribute profile )。GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。没有GATT,BLE协议栈也能跑,但互联互通就会出问题,也正是因为有了GATT和各种各样的应用profile,BLE摆脱了ZigBee等无线协议的兼容性困境,成了出货量最大的2.4G无线通信产品。

GATT简介

GATT主要包括唯一标识符(Universally Unique Identifiers ,缩写UUIDs)、角色(Roles)
、属性(Attributes)、数据结构(Data Organization)。
下图描述了一个GATT客户端读写有两个服务的GATT服务端数据的过程。
在这里插入图片描述

  • 唯一标识符(UUID):UUID是一个全球唯一的128位(16字节)数字,用于标识通用属性(GATT)配置文件中的配置文件、服务和数据类型。为了减轻存储和传输128位UUID值的负担,已预先分配了一系列UUID值,以分配给经常使用的已注册目的。 该预分配范围中的第一个UUID被称为Bluetooth Base UUID,其值从蓝牙分配的数字文档中为00000000-0000-1000-8000-00805F9B34FB。 预分配范围内的UUID值的别名表示为16位或32位值。 这些别名通常称为16位和32位UUID,但是要注意,每个别名实际上代表一个128位UUID值。16位UUID对应的完整UUID为0x0000[16位UUID]-0000-1000-8000-00805F9B34FB。
    Bluetooth SIG提供的标准的预定义UUIDS可以查看如下链接:
    SIG-Defined GATT Services
    SIG-Defined GATT Characteristics
    SIG-Defined GATT Descriptors
  • 角色(Roles):包含两种角色,服务端(Server)和客户端(Client)
    属性(Attributes):属性是服务端的能力,由客户端进行访问。

GATT-数据层次结构

  • GATT中最上层是Profile,Profile由一个或多个服务(Service)组成
  • 服务(Service)是由特性(Characteristics)组成,或是其他服务的引用(Reference)
  • 特性(Characteristics)包含多个属性(Attributes)。特征声明属性(Declaration)、特征值属性(Value)和特征描述符属性(Descriptor )(可选)

在这里插入图片描述

GATT-服务(Service)

完成特定功能的数据和相关行为的集合被称为服务(Service)(即特征(Characteristics)的集合)。主要服务(Primary services)由GATT客户端通过“GATT主要服务发现过程”发现。
服务分为公共服务和私有服务:

  • 公共服务 由蓝牙SIG定义 (16位UUID)
  • 私人服务 由供应商定义(128位UUID)

GATT-特征(Characteristics)

特征(Characteristics)本质上是用户数据的容器。它们至少包含两个属性:

  • 特征声明属性(Characteristic Declaration Attribute): 值属性的元数据
  • 特征值属性 (Characteristic Value Attribute):包含数据值本身
  • 特征描述符属性(Characteristic Descriptors Attribute):可选,用于进一步扩展声明属性中包含的数据的特殊属性。GATT定义的通用的特征描述符属性包括:
特征描述符属性说明
Extended PropertiesContains additional declaration property bits
Characteristic User DescriptionContains a user-readable description for the characteristic in which it is placed
Client Characteristic Configuration Descriptor (CCCD)A switch, enabling/disabling server-initiated updates

GATT-属性(Attributes)

属性的数据结构
在这里插入图片描述

  • 属性句柄(Attribute Handle):属性句柄是唯一的16位标识符。其犹如指向属性实体的指针,对端设备可通过属性句柄来访问该属性,它是一个2字节长度的十六进制码,起始于0x0001,在系统初始化时候,各个属性的句柄逐步加一,最大不超过0xFFFF。
  • 属性类型(Attribute Type):作用是用以区分当前属性是服务(Service)或是特征(Characteristics)等。属性类型常用的有:首要服务项(Primary Service)-0x2800、次要服务项(Secondary Service)-0x2801
    包含服务项(Include)-0x2802、特征值(Characteristic)-0x2803。这些属性类型的UUID蓝牙标准组织已经对其进行了分类,服务类通用唯一识别码(0x1800 – 0x26FF)、标识计量单位(0x2700 – 0x27FF )、区分属性类型(0x2800 – 0x28FF )、描述符类型(0x2900 – 0x29FF)、区分特征值类型(0x2A00 – 0x7FFF )。常见的属性类型如下表。
Attribute TypeUUIDDescription
Primary Service0x2800Primary Service Declaration
Secondary Service0x2801Secondary Service Declaration
Include0x2802Include Declaration
Characteristic0x2803Characteristic Declaration
Characteristic Extended Properties0x2900Characteristic Extended Properties
Characteristic User Description0x2901Characteristic User Description Descriptor
Client Characteristic Configuration0x2902Client Characteristic Configuration Descriptor
Server Characteristic Configuration0x2903Server Characteristic Configuration Descriptor
Characteristic Format0x2904Characteristic Format Descriptor
Characteristic Aggregate Format0x2905Characteristic Aggregate Format Descriptor
  • 属性权限(Attribute Permissions):权限主要有以下四种:
权限说明
访问权限(Access Permission)只读、只写、读写
加密权限(Encryption Permission)加密、不加密
认证权限(Authentication Permission)需要认证、无需认证。认证(Authentication)是指相互确认对方身份。完成认证流程的两个设备,双方建立信任关系,二者之间的通信通道即可以认为是安全的。BLE中,“认证”过程就是配对。
授权权限(Authorization Permission)需要授权、无需授权。授权(Authorization)是指对授信设备开放权利。
队列读取权限(prepare write permission)

认证和授权功能容易混淆,其英文拼写也很相似。从上面的概念上看,授权要求设备必须是可信任的,因此授权的管控等级要高于认证——认证的设备未必被授权,授权的设备一定是认证的。理解二者关系,需要引入一个概念:Trusted Device(可信任设备)一个没有经过认证的设备,被称为Unknown Device(未知设备);经过了认证该设备会在绑定信息中被标记为Untrusted,被称为Untrusted Device(不可信设备);经过了认证,并且在绑定信息中被标记为Trusted的设备被称为Trusted Device(可信设备)。
授权要求设备为Trusted Device(可信任设备)。在实际使用中,经过配对以后设备即为Untrusted Device——认证,在代码中调用API可以设置设备为Trusted Device——授权。

/* GATT attribute permission bit field values */
typedef enum
{
    /** No operations supported, e.g. for notify-only */
    AIS_GATT_PERM_NONE = 0,
    /** Attribute read permission. */
    AIS_GATT_PERM_READ = ABIT(0),
    /** Attribute write permission. */
    AIS_GATT_PERM_WRITE = ABIT(1),
    /* Attribute read permission with encryption. */
    AIS_GATT_PERM_READ_ENCRYPT = ABIT(2),
    /* Attribute write permission with encryption. */
    AIS_GATT_PERM_WRITE_ENCRYPT = ABIT(3),
    /* Attribute read permission with authentication. */
    AIS_GATT_PERM_READ_AUTHEN = ABIT(4),
    /* Attribute write permission with authentication. */
    AIS_GATT_PERM_WRITE_AUTHEN = ABIT(5),
    /* Attribute prepare write permission. */
    /*属性队列读取权限*/
    AIS_GATT_PERM_PREPARE_WRITE = ABIT(6)
} ais_attr_perm_t;
  • 属性值(Attribute Value):保存实际的数据内容,可以通过客户端进行访问。它还可以保存关于属性的数据(这取决于属性类型)。如果该属性是服务项类型或者是特征值声明类型,那么它的属性值就是UUID等信息。如果是普通的特征值,则属性值是用户的数据。属性值需要预留空间以保存用户数据。

属性与服务、属性与特征的关系

一个应用所有的属性(Attributes)组成一个database,也称为Attribute Table,一个Attribute Table示例如下所示:
在这里插入图片描述

服务定义(Service Definition)

Attribute HandleAttribute TypeAttribute ValueAttribute Permission
0xNNNN0x2800 – UUID for Primary Service
0x2801 – UUID for Secondary Service
16-bit Bluetooth UUID
128-bit UUID for Service
Read Only,
No Authentication,
No Authorization

特性定义(Characteristic Definition)

Attribute HandleAttribute TypeAttribute ValueAttribute Permission
0xNNNN0x2803– UUID for Characteristic1.Characteristic Properties
2.Characteristic Value Attribute Handle
3.Characteristic UUID
Read Only,
No Authentication,
No Authorization
  • 1.Characteristic Properties
PropertiesValueDescription
Broadcast0x01If set, permits broadcasts of the Characteristic Value using Characteristic Configuration Descriptor
Read0x02如果设置,支持读取特征值
Write Without Response0x04如果设置,特征进行写入时,服务端可以不给客户端一个应答
Write0x08如果设置,特征进行写入时,服务端需要给客户端一个应答
Notify0x10如果设置,当特征发生变化时,它会主动将新的值告知客户端,而客户端收到这个信息更新时不需要回复
Indicate0x20如果设置,特征发生变化时,它会主动将新的值告知客户端,而客户端收到这个信息更新时需要给服务端一个简单的回复
Authenticated Signed Writes0x40If set, permits signed writes to the Characteristic Value.
Extended Properties0x80If set, additional characteristic properties are defined in the Characteristic Extended Properties Descriptor.

参考

深入浅出低功耗蓝牙(BLE)协议栈
低功耗蓝牙ATT/GATT/Profile/Service/Characteristic规格解读
Bluetooth GATT介绍
https://microchipdeveloper.com/wireless:ble-gatt-data-organization

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

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

相关文章

新版 Navicat Premium 17 安装教程 (亲测可用)

前几天安装了新版本Navicat Premium 17、Navicat是用于MySQL的管理工具,使用非常方便,下面就记录一下安装过程,也方便其他正在使用Navicat Premium工具的同学参考,谢谢。 MySQL的安装配置 | MySQL的基础知识 | 基于Node.js应用的…

【课程总结】Day17(上):NLP自然语言处理及RNN网络

前言 在机器学习章节【课程总结】Day6(上):机器学习项目实战–外卖点评情感分析预测中,我们曾借助sklearn进行了外卖点评的情感分析预测;接下来,我们将深入了解自然语言处理的基本概念、RNN模型以及借助RN…

深度学习环境完整安装(Python+Pycharm+Pytorch cpu版)

在这里,我们将引导您逐步完成深度学习环境的完整安装,助您踏上从Python到PyTorch的探索之旅。通过本博客,您将轻松掌握如何设置Python环境、使用Pycharm进行开发以及安装Pytorch,成为一名具备完整深度学习环境的实践者。让我们一起…

RGB图像的读取与保存

目录 1、安装imageio 2、读取照片 3、保存照片 4、resize 5、示例代码 1、安装imageio pip install imageio -i https://pypi.tuna.tsinghua.edu.cn/simple 2、读取照片 import imageio img imageio.imread(image_path) 3、保存照片 import imageio import numpy as…

【STC32G12K128开发板】第3-10讲:SG90舵机驱动

第3-10讲:SG90舵机驱动 学习目的了解SG90舵机的相关参数、控制方式。编程用PWM驱动SG90舵机,通过按键改变舵机旋转角度。 舵机简介 规格参数 “舵机”这个名号其实是一个俗称,是那些玩航模、船模的人起的名字,因为这种电机常被用…

yolov8pose 部署rknn(rk3588)、部署地平线Horizon、部署TensorRT,部署工程难度小、模型推理速度快,DFL放后处理中

特别说明:参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。 模型和完整仿真测试代码,放在github上参考链接 模型和代码。 之前写了yolov8、yolov8seg、yolov8obb 的 DFL 放在模型中和放在后处理…

界面控件DevExpress WinForms,支持HTML CSS提升用户体验(一)

DevExpress WinForms现在可以利用HTML/CSS强大的功能,帮助受DevExpress驱动的WinForms应用程序引入现代的UI元素和用户体验! P.S:DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。Dev…

E25.【C语言】练习:修改二进制序列的指定位

十进制13-->二进制01101 现要求二进制序列的第5位修改为1,再改成0 复习:逻辑运算 非(NOT)(C语言:~) x0,NOT x-->1;x1,NOT x-->0 与(…

Animate软件基础:将对象分层以应用补间动画

在Animate进行内容制作时,有时会需要把元件或对象分散到多个图层中,可以使用软件的分散图层功能。 将补间动画应用于对象时,Animate 会自动将该对象移动到其补间图层。 但是,也可以自己将对象分散到其各自的图层。例如&#xff0c…

【最长重复子数组】python刷题记录

R3-滑动窗口专题 . - 力扣(LeetCode)

拉盖尔高斯光束表达式及Python代码

1. 拉盖尔-高斯光束的电场分布通常可以用以下表达式来表示: 2. Python代码表示 import numpy as np import matplotlib.pyplot as plt from scipy.special import genlaguerre import mathdef laguerre_gaussian_beam(r, phi, z, l, p, w0, wavelength):k 2 * np.…

Centos linux服务器解决EMQX界面显示不全问题

最近要在centos服务器配置EMQX。 而centos自带的火狐浏览器不兼容EMQX的界面显示,F12看浏览器后台,出现了一些JavaScript代码语法错误。 SyntaxError: invalid identity escape in regular expression 但是Microsoft edge浏览器不支持linux系统&#x…

使用 1panel面板 部署 php网站

代码仓库:https://github.com/talmudmaster/RedCorpus 目录 网站介绍安装步骤1. 准备云服务器2. 准备域名(可跳过)3. 安装1panel面板4. 服务器开放端口5. 进入1panel面板6. 安装并启动软件(服务器和面板开放端口)7. 创…

Python设计模式 - 抽象工厂模式

定义 抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 产品等级结构与产品族 为了更好地理解抽象工厂模式,先引入两个概念: 产品等级结构:就是产品的…

u盘数据丢失怎么办?以下这四招教你轻松找回!

重要的文件资料要是不小心手滑删除了,轻则遭受领导的责骂,重则就是直接受到老板的警告了,所以打工人应该要人手必备数据找回的技巧,尤其是在针对已经拷贝好了数据在u盘当中时,更是需要快速去找到数据恢复的技巧&#x…

S02. 内核的实现(未完)

一、虚拟内存管理 1、内存分页 二级页表线性地址转换物理地址过程如下: 用虚拟地址的高10位乘以4,作为页目录表内的偏移地址,加上页目录表的物理地址,所得的和便是页目录项的物理地址。读取该页目录项,从中获取到页…

隐藏采购订单类型

文章目录 1 Introduction2 code 1 Introduction The passage is that how to hiden purchase type . 2 code DATA: ls_shlp_selopt TYPE ddshselopt. IF ( sy-tcode ME21N OR sy-tcode ME22N OR sy-tcode ME23N or sy-tcode ME51N OR sy-tcode ME52N OR sy-tcode ME5…

CTFSHOW 萌新 web10 解题思路和方法(passthru执行命令)

点击题目链接,分析页面代码。发现代码中过滤了system、exec 函数,这意味着我们不能通过system(cmd命令)、exec(cmd命令)的方式运行命令。 在命令执行中,常用的命令执行函数有: system(cmd_code);exec(cmd_…

Xilinx管脚验证流程及常见问题

1 流程 1.1 新建I/O Planning Project I/O Planning Project中可以不需要RTL的top层.v代码,仅图形化界面即可配置管脚约束XDC文件的生成: Create I/O Ports: 导出XDC文件和自动生成的top_interface.v文件: 1.2 新建test Project …

HarmonyOS开发:生命周期详解

目录 前言 生命周期的概念HarmonyOS生命周期最后 前言 随着移动端操作系统的多样化发展,HarmonyOS作为华为推出的一款面向全场景的分布式操作系统,受到了业内外的广泛关注。其实HarmonyOS的设计和开发模式,与传统的移动端操作系统有着显著…