一、蓝牙技术概览:从1.0到5.4,我们走过的路

各位同学好,我是老张。今天咱们开始聊蓝牙,这个看似简单、实则门道极多的无线通信技术。

先问大家一个问题:你手上这台手机,蓝牙芯片里跑的是什么协议栈?是经典蓝牙还是低功耗蓝牙?嗯,大概率是双模的。但很多人做了几年开发,对这两者的区别还是模模糊糊。今天我们就把它彻底理清楚。

1.1 蓝牙发展史:从1.0到5.4

蓝牙技术从1999年诞生到现在,已经走过了二十多年。我个人把它分成三个阶段:

版本 发布时间 核心变化 我的评价
1.0/1.1 1999-2001 基础规范,速率1Mbps 基本没法用,兼容性极差
2.0/2.1 2004-2007 EDR增强速率,3Mbps 终于能传音频了
3.0 HS 2009 高速模式,借用WiFi 昙花一现,没人用
4.0 2010 BLE诞生,低功耗 里程碑!物联网的起点
4.2 2014 LE Secure Connections 安全性大幅提升
5.0 2016 2Mbps、长距离、广播扩展 BLE真正成熟
5.2 2020 LE Audio、LC3编码 音频革命
5.4 2023 PAwR、加密广播 电子货架标签专用

这里我想特别说一句:4.0是分水岭。4.0之前叫经典蓝牙(BR/EDR),4.0之后BLE正式登场。现在市面上99%的新设备都是双模芯片,但协议栈是两套独立的代码。

核心观点:蓝牙5.4不是5.0的简单升级,而是针对特定场景(如电子货架标签、大规模设备网络)做了深度优化。如果你还在用4.2做项目,建议尽快升级。

1.2 经典蓝牙 vs 低功耗蓝牙:到底差在哪?

很多初学者会问:BLE是不是就是省电版的经典蓝牙?不是的,它俩是两套完全不同的协议。

我拿一个实际项目举例。之前做智能手环,产品经理说「蓝牙连手机传数据就行」。结果一测试,经典蓝牙连接后手环电池撑不过8小时。换成BLE,同样的数据量,续航直接飙到7天。为什么?

  • 经典蓝牙(BR/EDR):面向连续数据流,比如音频、文件传输。连接后持续占用信道,功耗高。
  • 低功耗蓝牙(BLE):面向小数据包、间歇性传输。大部分时间在睡觉,醒了发完数据继续睡。
对比项 经典蓝牙 BLE
信道数 79个,1MHz间隔 40个,2MHz间隔
调制方式 GFSK GFSK
最大速率 3Mbps (EDR) 2Mbps (5.0)
连接延迟 ~100ms ~3ms
功耗 ~30mA ~5mA
典型应用 耳机、音箱、文件传输 手环、传感器、信标

避坑指南:我曾经在一个项目中,用BLE做音频传输,结果延迟大到没法用。后来换成经典蓝牙的A2DP才解决。记住:BLE不适合实时音频,那是LE Audio(5.2)才解决的问题。

1.3 Android蓝牙架构简介:从App到芯片

Android的蓝牙架构,说白了就是一层套一层的「俄罗斯套娃」。从上到下依次是:

  1. Application层:你写的App,调用Android SDK的Bluetooth API。
  2. Framework层:系统服务,比如BluetoothManagerService、BluetoothAdapter。
  3. Bluetooth进程:com.android.bluetooth,跑在独立的系统进程里。
  4. HAL层:硬件抽象层,厂商实现。
  5. 芯片固件:跑在蓝牙芯片上的代码。

我画了一张图,帮你理解这个分层结构:

Android蓝牙架构分层图 Application 层 BluetoothAdapter, BluetoothDevice, BluetoothGatt Framework 层 BluetoothManagerService, BluetoothDeviceService Bluetooth 系统进程 com.android.bluetooth (Binder IPC) HAL 层 libbt-vendor.so, hciattach 蓝牙芯片固件 UART/USB 接口, 链路层, 物理层 你的App Android系统服务 核心协议栈 厂商适配层 硬件实现

嗯,这里要注意:App不能直接访问HAL或芯片。所有操作都要通过Framework的Binder IPC转到蓝牙进程。这也是为什么有时候蓝牙卡顿,你杀App没用,得重启蓝牙服务。

1.4 实际开发中,你该关注什么?

我个人习惯把蓝牙开发分成三个层次:

  • 应用开发者:只关心BluetoothAdapter和BluetoothGatt的API调用。不需要懂底层。
  • 系统工程师:需要理解Framework层和蓝牙进程的交互,比如Profile注册、Service绑定。
  • 协议栈开发者:要啃Spec,懂HCI命令、L2CAP、ATT等协议细节。

举个例子,你写一个BLE扫描的App:

// 应用层代码,就这么几行
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
adapter.getBluetoothLeScanner().startScan(callback);

但底层发生了什么?

  1. App通过Binder调用到蓝牙进程的BluetoothLeScanner
  2. 蓝牙进程下发HCI命令到芯片:LE Set Scan Parameters
  3. 芯片收到广播包,上报HCI事件
  4. 蓝牙进程解析后,回调到App

你看,一个简单的扫描,跨了四层。如果哪一层出了问题,表现就是「扫描不到设备」。排查起来很头疼。

重要提醒:Android从8.0开始,蓝牙扫描有后台限制。从12开始,扫描权限更严格。如果你发现App在后台扫不到设备,先检查是不是权限问题,别一上来就怀疑协议栈。

1.5 小结

今天的内容就到这里。我们讲了蓝牙从1.0到5.4的演进,理清了经典蓝牙和BLE的本质区别,也看了Android蓝牙的完整架构。这些东西是后面所有章节的基础。

下一章,我们会深入BLE的GATT协议,讲清楚Service、Characteristic、Descriptor到底怎么用。到时候我会拿一个真实的心率监测项目来拆解。


公众号:蓝海资料掘金营,微信deep3321