D~DIDI~DIDIDI!!!!

0%

蓝牙笔记

概述

蓝牙(Bluetooth)是一种短距离无线通信技术标准,工作在 2.4 GHz ISM 频段,广泛应用于个人设备互联。

蓝牙分类

通常有两种主要形式:

类型 全称 典型应用 特点
经典蓝牙 BR/EDR Basic Rate / Enhanced Data Rate 蓝牙耳机、音响、文件传输 高带宽、持续连接
低功耗蓝牙 BLE Bluetooth Low Energy 蓝牙手环、IoT 传感器 超低功耗、间歇通信

版本演进

版本 发布年份 关键特性
1.0 1999 初始版本,基础数据传输
2.0 + EDR 2004 增强数据速率(3 Mbps)
3.0 + HS 2009 高速通道(借助 Wi-Fi)
4.0 2010 引入 BLE(低功耗蓝牙)
4.2 2014 支持 IPv6/6LoWPAN
5.0 2016 更远距离、更高速率、广播扩展
5.1 2019 方向寻找(测向)
5.2 2020 LE Audio(LC3 编码)
5.3 2021 增强周期广播、连接子评级

BLE 协议栈架构

BLE 协议栈分为三层,数据发送时由高层逐层向下流动,接收时相反:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
┌────────────────────────────────────┐
│ Application │
├────────────────────────────────────┤
│ Host Stack │
│ ┌──────────────────────────────┐ │
│ │ GAP (通用访问配置文件) │ │
│ ├──────────────────────────────┤ │
│ │ GATT (通用属性配置文件) │ │
│ ├──────────────────────────────┤ │
│ │ ATT (属性协议) │ │
│ ├──────────────────────────────┤ │
│ │ SMP (安全管理协议) │ │
│ ├──────────────────────────────┤ │
│ │ L2CAP (逻辑链路控制) │ │
│ └──────────────────────────────┘ │
├────────────────────────────────────┤
│ HCI (主控接口) │
├────────────────────────────────────┤
│ Controller Stack │
│ ┌──────────────────────────────┐ │
│ │ LL (链路层/Logical Layer) │ │
│ ├──────────────────────────────┤ │
│ │ PHY (物理层) │ │
│ └──────────────────────────────┘ │
└────────────────────────────────────┘

L2CAP 层(逻辑链路控制与适配协议)

L2CAP 负责协议复用、分段与重组、服务质量管理:

  • 向上层提供面向连接和无连接的数据服务
  • 支持协议/通道复用
  • 处理数据分段与重组
  • 管理数据流控

Logical 层(链路层)

Logical 层主要完成 BLE 通信过程中的各种逻辑控制。在一次 BLE 通信过程中,存在 Master 和 Slave 两方:

  • Master:主动扫描并发起连接
  • Slave:不断广播等待连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
┌─────────────────────────────────────────────────┐
│ BLE 连接状态机 │
│ │
│ ┌──────────┐ 扫描到广播 ┌──────────────┐ │
│ │ Stand By │ ──────────────→ │ Scanner │ │
│ └──────────┘ └──────┬───────┘ │
│ │ │ │
│ │ 发起连接 │
│ │ │ │
│ │ ┌──────▼───────┐ │
│ │ │ Initiator │ │
│ │ └──────┬───────┘ │
│ │ │ │
│ │ 连接建立 │
│ │ │ │
│ │ ┌──────▼───────┐ │
│ │ │ Master │ │
│ │ │ (跳频通信) │ │
│ │ └──────────────┘ │
│ │ │
│ ┌────▼─────┐ 等待连接 ┌──────────────┐ │
│ │ Stand By │ ──────────────→│ Advertiser │ │
│ └──────────┘ │ (ADV_IND等) │ │
│ └──────┬───────┘ │
│ │ │
│ 连接建立 │
│ │ │
│ ┌──────▼───────┐ │
│ │ Slave │ │
│ │ (跳频通信) │ │
│ └──────────────┘ │
└─────────────────────────────────────────────────┘

广播类型:

  • ADV_IND:可连接、可扫描的非定向广播
  • ADV_DIRECT_IND:可连接的定向广播
  • ADV_SCAN_IND:可扫描的非定向广播
  • ADV_NONCONN_IND:不可连接的非定向广播

Physical 层(物理层)

Physical 层定义了 3 个广播信道37 个数据通信信道

信道类型 信道数 频率范围 用途
广播信道 3 (Ch37/38/39) 2402/2426/2480 MHz 设备发现、连接建立
数据信道 37 (Ch0-36) 2404-2478 MHz 数据传输(跳频)

在两个蓝牙设备进行连接的过程中,先随机挑选一个广播信道进行广播,待建立连接之后,会在 37 个通信信道上进行跳频通信(Frequency Hopping),以抵抗干扰和窃听。

BLE GATT 服务模型

在每一个 BLE 设备中都会有一个对应的 Profile 用于对这个设备进行描述。GATT(Generic Attribute Profile)定义了 BLE 设备间数据交换的层次结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
┌──────────────────────────────────────┐
│ Profile │
│ ┌────────────────────────────────┐ │
│ │ Service 1 │ │
│ │ ┌──────────────────────────┐ │ │
│ │ │ Characteristic 1 │ │ │
│ │ │ ├── Value │ │ │
│ │ │ ├── Properties │ │ │
│ │ │ └── Descriptor(s) │ │ │
│ │ ├──────────────────────────┤ │ │
│ │ │ Characteristic 2 │ │ │
│ │ │ ├── Value │ │ │
│ │ │ ├── Properties │ │ │
│ │ │ └── Descriptor(s) │ │ │
│ │ └──────────────────────────┘ │ │
│ ├────────────────────────────────┤ │
│ │ Service 2 │ │
│ │ ┌──────────────────────────┐ │ │
│ │ │ Characteristic N │ │ │
│ │ └──────────────────────────┘ │ │
│ └────────────────────────────────┘ │
└──────────────────────────────────────┘
  • Profile:描述设备的完整功能集合
  • Service:设备提供的各种服务(如心率服务、电池服务)
  • Characteristic:服务中的具体数据点(如心率值、电池电量)
  • Descriptor:对 Characteristic 的补充描述

Android BLE 接口

在 TCP/IP 的 Socket 通信中,服务端程序运行于某一 IP 地址上并持续监听某个端口,客户端程序选择服务端的 IP 和端口发起 Socket 连接,经过三次 TCP 握手之后完成连接的建立并使用该 Socket 进行通信。

蓝牙 BLE 通信也类似:需要先扫描周围蓝牙设备,并选择某个 BLE 设备发起连接。

扫描相关 API

接口名称 所属类 接口描述
startScan() BluetoothLeScanner 开始扫描周围 BLE 设备
stopScan() BluetoothLeScanner 结束扫描

数据读写 API

接口名称 所属类 接口描述
writeCharacteristic() BluetoothGatt 向指定 Characteristic 写入数据
readCharacteristic() BluetoothGatt 从指定 Characteristic 读取数据
setCharacteristicNotification() BluetoothGatt 订阅 Characteristic 变化通知
discoverServices() BluetoothGatt 发现设备提供的 GATT 服务

典型 BLE 通信流程

1
2
3
4
5
6
7
8
9
10
1. 初始化 BluetoothAdapter
2. 获取 BluetoothLeScanner
3. startScan() → 扫描周围设备
4. 选择目标设备 → connectGatt()
5. onConnectionStateChange() → 连接成功
6. discoverServices() → 发现服务
7. onServicesDiscovered() → 获取 Service/Characteristic
8. readCharacteristic() / writeCharacteristic() → 数据交互
9. setCharacteristicNotification() → 订阅通知
10. disconnect() / close() → 断开连接

蓝牙安全研究视角

BLE 安全机制

安全层级 描述 安全性
Level 1 无安全(No Security) 无加密、无认证
Level 2 未认证配对(Unauthenticated Pairing) 加密但无 MITM 防护
Level 3 认证配对(Authenticated Pairing) 加密 + MITM 防护
Level 4 LE Secure Connections ECDH 密钥交换

常见攻击类型

攻击类型 方法 工具
嗅探(Sniffing) 捕获 BLE 广播和数据包 Ubertooth, nRF Sniffer
MITM 攻击 中间人拦截并篡改通信 BtleJuice, GATTacker
重放攻击 捕获并重放 BLE 命令 自定义脚本
模糊测试 发送畸形数据包测试协议栈 Scapy, btle-fuzz
MAC 追踪 通过 MAC 地址追踪设备 被动扫描工具

SDR 与蓝牙研究

使用 SDR(软件定义无线电)设备可以进行蓝牙信号的分析和研究:

  • Ubertooth One:专用蓝牙研究工具,支持经典蓝牙和 BLE 嗅探
  • HackRF:宽频 SDR 设备,可用于 2.4 GHz 信号分析
  • nRF52840 Dongle:Nordic 官方 BLE 嗅探工具

相关知识

蓝牙技术是无线个人局域网(WPAN)的核心标准之一。理解蓝牙协议栈的层次结构、BLE 的 GATT 服务模型以及安全机制,对于物联网安全研究和嵌入式设备分析至关重要。本文与 SDR、移动网络等文章共同构成无线通信安全研究的知识体系。

⚠️ 安全提示

  • 蓝牙嗅探和攻击测试应在合法授权的环境下进行
  • 未经授权的蓝牙设备攻击可能违反法律法规
  • 本文仅用于学术研究和安全评估目的