1、BLE基础概念:什么是低功耗蓝牙、BLE与经典蓝牙的区别、BLE协议栈架构概览
大家好,我是你们这趟BLE之旅的向导。做蓝牙开发有些年头了,踩过的坑比走过的路还多(笑)。今天咱们先不急着写代码,把地基打牢。说白了,搞懂这几个基础概念,后面你写广播包、调扫描参数的时候,心里才有底。
1.1 什么是低功耗蓝牙?
低功耗蓝牙,英文叫Bluetooth Low Energy,简称BLE。它是蓝牙技术联盟在2010年推出的一个分支。名字里就带着答案——它就是为了省电而生的。
我经常跟刚入行的朋友打个比方:经典蓝牙像一辆大排量SUV,动力猛、能拉货,但油耗也高;BLE就像一辆电动自行车,跑得不快,但充一次电能骑好几天。你想想看,一个温度传感器,用纽扣电池供电,得在墙上待一年半载,能用经典蓝牙吗?显然不行。
BLE的核心设计目标就三个:
- 极低功耗:一颗CR2032纽扣电池,能让设备工作数月甚至数年
- 低成本:芯片便宜,方案简单
- 短数据突发:每次传输的数据量很小,但连接建立快
关键指标:BLE的峰值电流通常在10-15mA左右,而经典蓝牙BR/EDR的峰值电流可以到40-50mA。待机时,BLE可以做到微安级别。这就是它能在物联网领域大杀四方的根本原因。
1.2 BLE与经典蓝牙的区别
很多新手会问:蓝牙不就是蓝牙吗?怎么还分这么细?
嗯,这里要注意。蓝牙技术联盟在4.0版本之后,实际上把蓝牙分成了两种模式:
| 对比维度 | 经典蓝牙 (BR/EDR) | 低功耗蓝牙 (BLE) |
|---|---|---|
| 诞生时间 | 1999年(1.0) | 2010年(4.0) |
| 功耗 | 高(~40mA) | 极低(~10mA) |
| 数据传输速率 | 最高 2-3 Mbps | 最高 1-2 Mbps(5.0后支持2M PHY) |
| 连接建立时间 | 约 100ms | 约 3-6ms |
| 应用场景 | 音频流(耳机、音箱)、文件传输 | 传感器、信标、健康设备、智能家居 |
| 网络拓扑 | 点对点(Piconet) | 点对点、广播、Mesh |
| 数据包结构 | 复杂,面向连接 | 简单,支持无连接广播 |
我个人习惯用一句话总结:经典蓝牙干重活,低功耗蓝牙干巧活。 你不可能用BLE去听歌,那音质和延迟会让你崩溃;你也不可能用经典蓝牙去做一个纽扣电池供电的温湿度计,电池撑不过一周。
避坑指南:我曾经在项目选型时犯过一个错误。客户说“要蓝牙”,我就直接选了经典蓝牙模块。结果做出来发现功耗根本压不下去,电池两天就没电了。后来才意识到,客户要的只是“用手机App连一下设备,读个数据”,这完全是BLE的活儿。所以,选型前一定要搞清楚:你到底需要传输什么?传输频率多高?功耗要求多严?
1.3 BLE协议栈架构概览
聊完了概念和区别,咱们来看看BLE的“骨架”——协议栈。很多初学者看到协议栈的图就头大,觉得太抽象。别急,我带你一层层剥开。
BLE协议栈,说白了就是一套通信规则。它规定了数据从你的应用程序,到天线发射出去,中间要经过哪些步骤。我把它分成三大部分:
- Controller(控制器):负责最底层的射频、链路控制。这部分通常是硬件实现的。
- Host(主机):负责逻辑链路、属性协议、安全管理等。这部分通常是软件协议栈。
- Application(应用层):你写的业务逻辑代码。
下面这张图,是我自己画的一个简化版协议栈架构,你看完就能明白数据是怎么“流”下去的。
咱们从下往上简单过一遍:
- PHY(物理层):负责把数据变成无线电波发出去。BLE工作在2.4GHz ISM频段,有40个信道。
- LL(链路层):这是BLE的核心。它负责广播、扫描、建立连接、数据重传、加密等。说白了,它决定了两个设备怎么“对上话”。
- HCI(主机控制器接口):这是Host和Controller之间的“翻译官”。如果Host和Controller是两颗不同的芯片,HCI就通过UART或USB通信。
- L2CAP:负责把上层的数据包拆分成适合下层传输的大小,或者把下层的包组装起来。
- ATT(属性协议):定义了如何读写“属性”。属性就是设备上的数据,比如温度值、电池电量。
- GATT(通用属性协议):基于ATT,定义了更高级的数据组织方式——Service(服务)和Characteristic(特征值)。你平时用手机App连设备,读到的数据就是通过GATT拿到的。
- GAP(通用访问协议):负责设备的广播、扫描、连接建立。它决定了设备如何被发现,以及如何建立连接。
我的经验:刚开始学的时候,你不需要把每一层的细节都背下来。你只需要记住:GAP管“发现和连接”,GATT管“数据读写”。这两个是你做应用开发打交道最多的层。至于LL和PHY,那是芯片厂商和协议栈工程师的事,你只要知道它们存在就行。
举个例子,你写一个温度传感器应用:
- 传感器上电后,通过GAP广播自己的存在(“我在这儿,我叫温度计”)。
- 手机扫描到广播,发起连接请求。
- 连接建立后,手机通过GATT去读温度这个Characteristic的值。
- 数据经过L2CAP、HCI、LL、PHY,最终变成无线电波发出去。
你看,整个流程是不是清晰多了?
注意:BLE协议栈有多个版本。4.0是初代,4.2引入了LE Secure Connections,5.0引入了2M PHY、长距离编码、广播扩展等。我建议你至少基于4.2或5.0开始学习,因为4.0的一些安全漏洞已经被修复了。我在一个项目中就吃过亏,用了老旧的4.0协议栈,结果手机端连接总是不稳定,后来升级到5.0才解决。