一、蓝牙技术概览:从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的蓝牙架构,说白了就是一层套一层的「俄罗斯套娃」。从上到下依次是:
- Application层:你写的App,调用Android SDK的Bluetooth API。
- Framework层:系统服务,比如BluetoothManagerService、BluetoothAdapter。
- Bluetooth进程:com.android.bluetooth,跑在独立的系统进程里。
- HAL层:硬件抽象层,厂商实现。
- 芯片固件:跑在蓝牙芯片上的代码。
我画了一张图,帮你理解这个分层结构:
嗯,这里要注意: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);
但底层发生了什么?
- App通过Binder调用到蓝牙进程的BluetoothLeScanner
- 蓝牙进程下发HCI命令到芯片:LE Set Scan Parameters
- 芯片收到广播包,上报HCI事件
- 蓝牙进程解析后,回调到App
你看,一个简单的扫描,跨了四层。如果哪一层出了问题,表现就是「扫描不到设备」。排查起来很头疼。
重要提醒:Android从8.0开始,蓝牙扫描有后台限制。从12开始,扫描权限更严格。如果你发现App在后台扫不到设备,先检查是不是权限问题,别一上来就怀疑协议栈。
1.5 小结
今天的内容就到这里。我们讲了蓝牙从1.0到5.4的演进,理清了经典蓝牙和BLE的本质区别,也看了Android蓝牙的完整架构。这些东西是后面所有章节的基础。
下一章,我们会深入BLE的GATT协议,讲清楚Service、Characteristic、Descriptor到底怎么用。到时候我会拿一个真实的心率监测项目来拆解。
公众号:蓝海资料掘金营,微信deep3321