百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

一文读懂蓝牙BLE体系架构(蓝牙ble技术的原理)

nanshan 2024-11-14 16:38 39 浏览 0 评论

蓝牙BLE(Bluetooth Low Energy),又称 Bluetooth Smart,是由蓝牙 SIG 提供的一个低功耗无线标准,其工作频带为2.4GHz ISM。下图展示了BLE 协议栈架构。

BLE 协议栈可分为以下三部分:

? 控制器:它是一个物理器件,用于编码数据包,并把该数据包作为无线信号进行传输。作为接收端使用时,控制器对无线信号进行解码,并重新构建数据包。

? 主机:包括各种协议和配置文件(安全管理器、属性协议等),用于管理两个或多个器件间相互通信的方式。

? 应用:指的是一个使用场合,其通过使用软件协议栈和控制器执行特定功能。

下面各节是对 BLE 协议栈中各层的简介,并使用了标准的心率和电池服务作为示例。

1. 物理层(PHY)

蓝牙BLE物理层使用了高斯频移键控(GFSK)调制方式在2.4GHz ISM 频带上发送和接收数据,数据速率为 1 Mbps。BLE 物理层将 ISM 频带分为 40个 RF 通道(通道间隔为 2 MHz),其中有37个数据通道,剩下为3个广播通道。

2. 链路层(LL)

链路层通过执行关键流程来建立一个可靠的物理链路(通过使用确认和基于流控的架构),并用于增强BLE协议安全性和降低功耗。下面列出的是链路层的几项功能:

? 广播、扫描、创建和保持连接,用以建立物理链路。

? 24 位CRC和128位AES加密,用于执行稳定安全的数据交换。

? 为低功耗操作创建快速连接和低占空比广播。

? 自适应跳频(AFH),它改变了用于数据包传输的通信通道,从而降低了其他器件的干扰。

在链路层可定义两部分内容:

? 主设备:以智能手机为代表。

? 从设备:以心率监视设备为代表。

链路层从设备将它的存在信息广播给另一个链路层主设备,该信息中可带少量自定义负载数据。链路层主设备会接收广播数据包,然后根据具体应用的要求选择需要连接的从设备。在心率监示器的应用中,心率监示器作为从设备使用,它将数据发送给作为主设备的智能手机。这时,智能手机APP将显示其接收到的心率数据。

一般蓝牙BLE器件的硬件部分只执行链路层中对时间要求严格并且处理器密集型的任务,如广播、CRC以及AES加密,而链路层控制操作(如进入广播状态和启动加密)都是通过软件固件实现的。

下图展示的是蓝牙BLE链路层数据包的结构以及链路层数据包中各字段的大小。链路层数据包将所有上层数据保存在其负载域内。它具有一个 4 字节的访问地址,可用于识别物理链路上进行的通信,并会忽略正在同一个射频通道中运行的相邻蓝牙BLE器件的数据包。其中,24位CRC校验保证了数据的可靠无误。

3. 主机控制接口(HCI)

HCI是主机与控制器间的标准定义接口。通过它,主机和控制器能够以不同的物理传输方式(如USB或UART)交换命令、数据和事件等信息。该层仅在控制器和主机为不同的器件时才需要进行真正的物理传输。而对于SoC器件,单芯片集成主机和控制器,HCI仅作为一个固件协议层用于控制器和主机间信息和事件的传输。

4. 逻辑链路控制及适配协议(L2CAP)

L2CAP为上层协议提供了协议复用、分段和重组服务。分段功能会将接收到的来自上层的数据包分为链路层可传输的更小的数据包,而重组功能会将接收到的来自链路层的小数据包结合成一个有意义的上层数据包。L2CAP层为属性协议(ATT)、安全管理器(SM)和 L2CAP控制提供三个协议通道,如下图所示。蓝牙4.2通过这些协议通道下的L2CAP所提供的定向连接进行直接的数据通信。


5. 安全管理器(SM)

SM 层定义了用于配对、加密和秘钥分配的方法。

? 配对是激活安全校验的过程。在该过程中,会验证两个器件,对其链接进行加密,然后交换加密密钥。这样可以通过BLE接口安全交换数据而不会被射频通道上的无线监听器窃听。

? 绑定是一个过程,其中密钥和识别信息在配对过程中被交换和保存。器件绑定完毕后,重新连接这些器件时不需要再次进行配对过程。

蓝牙BLE使用了128位AES对数据进行加解密。

6. 安全管理器(SM)

SM 层定义了用于配对、加密和秘钥分配的方法。

? 配对是激活安全校验的过程。在该过程中,会验证两个器件,对其链接进行加密,然后交换加密密钥。这样可以通过BLE接口安全交换数据而不会被射频通道上的无线监听器窃听。

? 绑定是一个过程,其中密钥和识别信息在配对过程中被交换和保存。器件绑定完毕后,重新连接这些器件时不需要再次进行配对过程。

蓝牙BLE使用了128位AES对数据进行加解密。

7. 属性协议(ATT)/通用属性配置文件(GATT)

为了了解ATT和GATT层,首先应该了解蓝牙BLE中GATT的两种使用场景:

? GATT服务器:指包含数据或信息的设备。它接收GATT客户端设备的请求,并提供数据进行响应。例如,心率监示器的GATT服务器包含心率信息,BLE HID 键盘的GATT服务器包含用户按键信息。

? GATT客户端:指向GATT服务器发送请求和/或接收数据的设备。例如,智能手机是接收心率服务器心率信息的GATT客户端,手提电脑是接收BLE键盘按键信息的GATT客户端。

ATT构成了BLE通信的基础,其规定了在BLE中的最小数据存储单位,而 GATT规范则定义了如何用特性值和描述符表示一个数据,如何把相似的数据聚合成服务 (Service),以及如何发现对端设备拥有哪些服务和数据。该协议使得GATT客户端能够在GATT服务器中找到数据和属性并访问它。

这里,属性包含的是ATT/GATT内的基本数据,它包含了以下内容:

? 属性句柄:一个16位的地址,用于寻址和访问某项属性。正如我们可以使?内存地址查找内存中的内容一样,ATT属性的句柄也可以协助我们找到相应的属性,例如第一个属性的句柄是0x0001,第二个属性的句柄是0x0002,以此类推,最大可以到 0xFFFF。

? 属性类型:用于指定在某项属性中储存的数据类型,该类型是应用层面的类型,而不是存储长度层面(比如整形、字符型或者浮点型)的类型。每个数据有自己需要代表的意思,例如表示温度、发射功率、电池等等各种各样的信息。蓝牙组织 (Bluetooth SIG)对常用的一些数据类型进行了归类,赋予不同的数据类型不同的标识码 (UUID)。例如0x2A09表示电池信息,0x2A6E表示温度信息。UUID可以是16比特的(16-bit UUID),也可以是128比特的(128-bit UUID)。

? 属性值:属性值是每个属性真正要承载的信息,其他3个元素都是为了让对方能够更好地获取属性值。有些属性的长度是固定的,例如电池属性(Battery Level)的长度只有1个字节,因为需要表示的数据仅有0~100%,而1个字节足以表示1~100的范围;而有些属性的长度是可变的,例如基于 BLE 实现的透传模块。

? 属性许可:每个属性对各自的属性值有相应的访问限制,比如有些属性是可读的、有些是可写的、有些是可读又可写的等等。拥有数据的一方可以通过属性许可,控制本地数据的可读写属性。

下图展示的是一个器件名称属性结构示例。

(1) 属性层次结构

由于在某些时候一个数据可能并不只是单纯的数值,还会带有一些额外的信息:比如这个数据的单位是什么?是重量单位千克kg、温度单位摄氏度℃,还是其他单位;比如希望具体告知对方这个数值的名称,例如同为温度属性UUID下,希望告知对方该数据表示“主卧温度”,另一个数据表示“客厅温度”;比如在表示230000、460000等大数据时,可以增加指数信息,告知对方该数据的指数是10^4,这样仅需在空中传递23、46 即可。

上述内容仅为清楚描述一个数据众多需求中的几个例子,实际应用中还可能出现其他以各种方式表达数据的需求。在此背景下,GATT规范引进了描述符的概念,每种描述符可以表达一种意思,用户可使用描述符,描述数据的额外信息。必须说明的是,每个数据和描述符并非一一对应,即一个复杂的数据可以拥有多个描述符,而一个简单的数据可以没有任何描述符。数据本身的属性值及其可能携带的描述符,构成了特性的概念。

? 特性(Characteristic):显示系统信息或有意义的数据的属性集。一个特性包括以下各属性:

特性声明:其定义了一个特性的开始。

特性值:其保存了实际数据。

特性描述符:其是可选属性,提供了特性值的其他信息。

“电池电量”是电池服务(BAS)中的一个特性示例,它以百分比的形式显示电池电量。

下图展示的是一个特性结构,并以电池电量特性进行说明展示。


特性的第一部分是特性声明(它表示特性的开始),例如上图中的电池电量指示特性声明。

后面是实际的特性值或实际数据,在电池电量特性示例中表示当前电池的电量。电池电量按全量程的百分比形式显示,如“65”、“90”等。

特性描述符提供了额外信息,用于描述特性值的意义。例如,电池电量的特性描述符指明电池电量被表示为一个百分比值。因此,读取“90”时,客户端会将其理解为90%,而不是90 mV或90 mAh。同样,有效范围特性描述符(未在上图中显示)表示电池电量的范围为0至100%。

通常,一个客户端特性配置描述符(CCCD)也可作为特性描述符使用,这样通过GATT客户端可以配置GATT服务器的特性行为。当GATT客户端将0x01值写入到某个特性的CCCD内时,便能够使GATT服务器发送异步通知(将在下一部分进行描述)。在电池电量特性中,将0x01值写入到电池电量CCCD内会使电池服务定期通知它的电池电量或电池电量值发生的所有变化。

蓝牙BLE协议中会把一些常用的功能定义成一个个的服务(Service),例如把电池相关的特性和行为定义成电池服务(Battery Service),把心率测试相关的特性和行为定义成心跳服务(Heart Rate Service),把体重测试相关的特性和行为定义成体重服务(Weight Scale Service)。

? 服务(Service):其定义了由GATT服务器所执行的功能,是一个特性集。其也可能包含其他服务。服务用于建立相关数据组并提供数据的层次结构。下面将以心率服务(HRS)为例进行说明。

服务可分为两种类型:主要服务或辅助服务。主要服务显示了器件的主要功能,而辅助服务则提供了额外功能。例如,在心率监示器中,心率服务是主要服务,电池服务是辅助服务。

一个服务还可以包含 GATT 服务器上存在的其他服务。所包含的全部服务组成新服务的一部分。

蓝牙BLE中的“配置文件”(Profile)指的是一个服务集和这些服务共同执行某个特定终端应用时的行为。心率配置文件(HRP)是BLE配置文件的一个示例,该BLE配置文件定义了创建心率监示器所需要的所有服务。

下图展示的是属性数据的层次结构,该数据层次结构使用了这里所定义的属性、特性、服务和配置文件。


(2) 属性操作

通过以下五种基本方法,能够访问前面所定义的属性:

? 读取请求:GATT客户端将该请求发送给GATT服务器以读取属性值。对于所有请求,GATT服务器会向GATT客户端回复一个响应。例如智能手机读取心率监示器的电池电量。

? 写入请求(Write Request):GATT客户端向GATT服务器发送该请求以写入一个属性值。GATT服务器会向GATT客户端回复响应,以表示是否成功写入了该值。例如智能手机会将数值0x01写入到表示电池电量特性的CCCD内,以使能通电量通知。

? 写入命令(Write Command):GATT客户端向GATT服务器发送该命令以写入一个属性值。对于该命令,GATT服务器不会回复任何响应。例如,BLE即时警报服务(IAS)中的IAS定位器(例如智能手机)使用写命令触发目标器件(例如密钥卡)上的警报(打开 LED、使蜂鸣器报鸣、驱动振动电机等)。

? 通知(Notification):GATT服务器将其发送给GATT客户端,从而通知属性新值。GATT客户端不会对一个通知回复任何响应。例如,将数值0x01写入到心率监示器的 CCCD 内时,该心率监示器会向智能手机发送心率测量通知。

? 指示(Indication):GATT服务器负责发送该类型的信息。GATT客户端始终会确认该信息。例如,BLE健康温度计服务(HTS)使用各种指示可靠地向健康温度计收集器(如智能手机)发送所测量的温度值。

在了解了属性的层次架构和操作方法后,下面以心率监测设备为例展示GATT层上的客户端-服务器架构。该心率监示器提供了多项服务(HRS、BAS和器件信息服务)。每项服务都包含一个或多个带有特性值和描述符的特性,如下图所示。

在链路层级别建立BLE连接后,GATT客户端(最初并不了解已连接的BLE器件)会启动一个被称为“服务发现”的过程。作为服务发现过程的一部分,GATT 客户端会向GATT服务器发送多个请求,从而获取GATT服务器中包含了所有可用服务、特性以及属性的列表。服务发现过程完成后,GATT客户端将具有所需信息,从而通过使用前面章节所介绍的属性操作来修改或读取GATT服务器所具有的信息。

8. 通用访问配置文件(GAP)

GAP层提供了设备特定的信息,如设备地址、设备名称以及发现、连接、绑定的各种方法。配置文件(Profile)定义了一个设备的发现和连接方法、可用服务的列表,以及服务的使用方式。

GAP可以按照下面四种方式之一进行操作:

? 广播员(Advertiser/Broadcaster):其作为一个发送器,用于发送数据。该功能不能实现BLE连接和进行数据交换(无请求/响应操作),它的工作原理类似于一个广播电台:它会不断发送数据,却无需关心是否有人收听,它进行的是单向数据通信。信标(Beacon)是GAP广播员的典型示例,它会不断播放信息而无需任何响应。

? 观察员(Observer):作为一个“听众”,它会扫描广播,但不会被连接到广播的设备。观察员角色与广播员角色完全相反,它的工作原理类似于一个无线收音机,可以一直收听信息而不会向信息源发送任何响应。智能手机中可连续监听各种信标的应用便是一个GAP观察器的典型示例。

? 外设(Peripheral):其起着广播作用,使设备能够连接至GAP中心。当广播者接受了观察者发来的连接请求后就会进入这种角色。当设备进入了这种角色之后,将会作为从设备 (Slave) 在链路中进行通信。例如,心率传感器会将所测量的心率报告给远程设备,使之作为一个GAP外设进行操作。

? 中心(Central):当观察者主动进行初始化,并建立一个物理链路时就会进入这种角色。其作为GAP使用,用于扫描广播和启动同外设间的连接。建立与外设的连接后,该GAP作为主设备(Master)运行。例如,智能手机作为GAP中心接收心率传感器外设的心率测量数据。

上图展示的是一个通用蓝牙BLE系统,其中,开发套件作为外设,智能手机作为中心设备。该图还说明了各BLE协议层间的交互以及它们在中心设备和外设中所起的作用。

上图展示了另一个示例,带有心率APP的智能手机作为中心设备,心率传感器作为外设。监示心率的设备将执行心率传感器的配置文件,而接收数据的智能手机会执行心率收集器的配置文件。

在上述示例中,心率传感器配置文件实现了两项标准的服务。第一项是心率服务,它包含三项功能,分别为心率测量功能、身体感应位置功能和心率控制点功能。第二项是设备信息服务。在链路层上,心率测量器件作为从设备,智能手机作为主设备。

点关注,不迷路,关注公众号: eeemaker小王子 获取更多

相关推荐

使用nginx配置域名及禁止直接通过IP访问网站

前段时间刚搭建好这个网站,一直没有关注一个问题,那就是IP地址也可以访问我的网站,今天就专门研究了一下nginx配置问题,争取把这个问题研究透彻。1.nginx配置域名及禁止直接通过IP访问先来看n...

如何在 Linux 中使用 PID 号查找进程名称?

在Linux的复杂世界中,进程是系统运行的核心,每个进程都由一个唯一的「进程ID」(PID)标识。无论是系统管理员在排查失控进程,还是开发者在调试应用程序,知道如何将PID映射到对应的进程名称都是一项...

Linux服务器硬件信息查询与日常运维命令总结

1.服务器硬件信息查询1.1CPU信息查询命令功能描述示例lscpu显示CPU架构、核心数、线程数等lscpucat/proc/cpuinfo详细CPU信息(型号、缓存、频率)cat/proc/c...

Ubuntu 操作系统常用命令详解(ubuntu常用的50个命令)

UbuntuLinux是一款流行的开源操作系统,广泛应用于服务器、开发、学习等场景。命令行是Ubuntu的灵魂,也是高效、稳定管理系统的利器。本文按照各大常用领域,详细总结Ubuntu必学...

从 0 到 1:打造基于 Linux 的私有 API 网关平台

在当今微服务架构盛行的时代,API网关作为服务入口和安全屏障,其重要性日益凸显。你是否想过,不依赖商业方案,完全基于开源组件,在Linux上构建一个属于自己的私有API网关平台?今天就带你...

Nginx搭建简单直播服务器(nginx 直播服务器搭建)

前言使用Nginx+Nginx-rtmp-module在Ubuntu中搭建简单的rtmp推流直播服务器。服务器环境Ubuntu16.04相关概念RTMP:RTMP协议是RealTi...

Linux连不上网?远程卡?这篇网络管理指南你不能错过!

大家好!今天咱们聊个所有Linux用户都躲不开的“老大难”——网络管理。我猜你肯定遇到过这些崩溃时刻:新装的Linux系统连不上Wi-Fi,急得直拍桌子;远程服务器SSH连不上,提示“Connecti...

7天从0到上线!手把手教你用Python Flask打造爆款Web服务

一、为什么全网开发者都在疯学Flask?在当今Web开发的战场,Flask就像一把“瑞士军刀”——轻量级架构让新手3天速成,灵活扩展能力又能支撑百万级用户项目!对比Django的“重型装甲”,Flas...

nginx配置文件详解(nginx反向代理配置详解)

Nginx是一个强大的免费开源的HTTP服务器和反向代理服务器。在Web开发项目中,nginx常用作为静态文件服务器处理静态文件,并负责将动态请求转发至应用服务器(如Django,Flask,et...

30 分钟搞定 Docker 安装与 Nginx 部署,轻松搭建高效 Web 服务

在云计算时代,利用容器技术快速部署应用已成为开发者必备技能。本文将手把手教你在阿里云轻量应用服务器上,通过Docker高效部署Nginx并发布静态网站,全程可视化操作,新手也能轻松上手!一、准...

Nginx 配置实战:从摸鱼到部署,手把手教你搞定生产级配置

各位摸鱼搭子们!今天咱不聊代码里的NullPointerException,改聊点「摸鱼必备生存技能」——Nginx配置!先灵魂拷问一下:写了一堆接口却不会部署?服务器被恶意请求打崩过?静态资源加载...

如何使用 Daphne + Nginx + supervisor部署 Django

前言:从Django3.0开始支持ASGI应用程序运行,使Django完全具有异步功能。Django目前已经更新到5.0,对异步支持也越来越好。但是,异步功能将仅对在ASGI下运行的应用程序可用...

Docker命令最全详解(39个最常用命令)

Docker是云原生的核心,也是大厂的必备技能,下面我就全面来详解Docker核心命令@mikechen本文作者:陈睿|mikechen文章来源:mikechen.cc一、Docker基本命令doc...

ubuntu中如何查看是否已经安装了nginx

在Ubuntu系统中,可以通过以下几种方法检查是否已安装Nginx:方法1:使用dpkg命令(适用于Debian/Ubuntu)bashdpkg-l|grepnginx输出...

OVN 概念与实践(德育概念的泛化在理论和实践中有什么弊端?)

今天我们来讲解OVN的概念和基础实践,要理解本篇博客的内容,需要前置学习:Linux网络设备-Bridge&VethPairLinux网络设备-Bridge详解OVS+Fa...

取消回复欢迎 发表评论: