3、蓝牙技术基础:BLE 5.x核心特性、广播与扫描、连接建立、GATT协议、蓝牙定位原理(RSSI/AOA)
好,咱们进入蓝牙部分。说实话,做车钥匙方案,蓝牙是绕不开的坎。UWB负责精确定位,但蓝牙负责的是“粗定位”和“握手”。没有蓝牙,UWB连启动的机会都没有。
这一章,我带你把BLE 5.x的核心特性、广播扫描、连接建立、GATT协议,还有蓝牙定位原理(RSSI和AOA)捋一遍。这些都是实战中天天要打交道的。
3.1 BLE 5.x核心特性:不只是“更快”那么简单
BLE 5.0是2016年发布的,到现在5.4都出来了。但咱们做车钥匙,最常用的是5.0和5.1的特性。我个人习惯,新项目直接上5.2以上的芯片,因为有些坑在旧版本里绕不过去。
核心特性一览:
| 特性 | 说明 | 车钥匙场景价值 |
|---|---|---|
| 2Mbps PHY | 物理层速率翻倍,从1Mbps到2Mbps | 快速传输配对信息、固件升级包 |
| LE Coded PHY | 通过编码方式提升传输距离(约4倍) | 远距离解锁场景(比如你走近车库门) |
| 广播扩展 | 广播信道从3个扩展到37个,数据包更大 | 支持更丰富的广播数据,比如携带RSSI校准值 |
| AoA/AoD | 到达角/离开角定位 | 蓝牙辅助定位,与UWB互补 |
| LE Audio | 低功耗音频,支持LC3编码 | 未来可能用于车机语音交互 |
我的经验:别盲目追求2Mbps。在车钥匙场景下,通信距离比速率重要得多。我曾经在一个项目中,为了省电强制用2Mbps,结果车主走到车旁边了还没连上。后来改回1Mbps,问题解决。记住:车钥匙不是下载电影,稳定连接比快更重要。
3.2 广播与扫描:蓝牙的“打招呼”方式
蓝牙设备之间怎么发现对方?靠广播和扫描。说白了,就是一方在喊“我在这里”,另一方在听“谁在喊”。
广播(Advertising):
- 广播者(Peripheral)定期发送广播包
- 广播间隔:20ms到10.24s可调
- 广播信道:37(2402MHz)、38(2426MHz)、39(2480MHz)
- 广播数据:最多31字节(扩展广播可达255字节)
扫描(Scanning):
- 扫描者(Central)监听广播信道
- 被动扫描:只收不发
- 主动扫描:收到广播后发送扫描请求,获取更多数据
避坑指南:我曾经在停车场测试时发现,车钥匙广播间隔设得太短(20ms),结果多辆车同时扫描时,广播包冲突严重,导致连接失败。后来我把广播间隔调到100ms,并加入了随机延迟,问题解决。记住:广播间隔不是越短越好,要留出“呼吸空间”。
3.3 连接建立:从“打招呼”到“握手”
广播和扫描只是发现对方。要真正通信,得建立连接。这个过程我拆成三步:
- 发起连接请求:扫描者(比如手机)向广播者(车钥匙)发送CONNECT_IND包
- 连接参数协商:包括连接间隔、延迟、超时时间
- 数据通道建立:切换到数据信道,开始正式通信
关键参数:
| 参数 | 典型值 | 影响 |
|---|---|---|
| 连接间隔 | 30ms - 50ms | 越小延迟越低,但功耗越高 |
| 从机延迟 | 0 - 4 | 允许从机跳过几个连接事件来省电 |
| 超时时间 | 4s - 6s | 超过此时间无数据则断开连接 |
注意:连接间隔不要设得太小。我见过有人把连接间隔设成7.5ms,结果手机蓝牙芯片发热严重,电池掉电飞快。车钥匙场景下,30ms-50ms是比较合理的区间。既保证响应速度,又不至于太耗电。
3.4 GATT协议:蓝牙世界的“数据字典”
GATT(通用属性协议)是蓝牙通信的核心。它定义了数据怎么组织、怎么读写。说白了,就是蓝牙设备之间怎么“说话”。
GATT结构:
- Profile(配置文件):定义了一组服务和特性的集合
- Service(服务):比如“车锁服务”、“电池服务”
- Characteristic(特性):具体的数据点,比如“车门状态”、“电量百分比”
- Descriptor(描述符):对特性的补充说明,比如“客户端特性配置”(CCCD)
实际操作中,车钥匙的GATT服务大概长这样:
// 车钥匙GATT服务示例
Service: 0x1800 (Generic Access)
- Characteristic: 设备名称
- Characteristic: 外观
Service: 0x180A (Device Information)
- Characteristic: 制造商名称
- Characteristic: 型号
- Characteristic: 固件版本
Service: 自定义车锁服务 (UUID: 0xAAAA)
- Characteristic: 车门状态 (读/通知)
- Descriptor: CCCD (使能通知)
- Characteristic: 解锁指令 (写)
- Characteristic: 锁车指令 (写)
- Characteristic: 寻车指令 (写)
我的习惯:GATT服务设计时,一定要考虑兼容性。我曾在项目中把自定义服务的UUID设得太随意,结果和某款手机的蓝牙协议栈冲突,导致连接后无法发现服务。后来我改用标准的128位UUID,并注册到蓝牙SIG,问题解决。记住:UUID不是随便写的,要遵循规范。
3.5 蓝牙定位原理:RSSI与AOA
蓝牙定位有两种主流方式:RSSI和AOA。咱们做车钥匙,这两种都得懂。
3.5.1 RSSI定位:简单但粗糙
RSSI(接收信号强度指示)是最简单的定位方式。原理很简单:信号越强,距离越近。
RSSI测距公式:
距离 = 10 ^ ((TxPower - RSSI) / (10 * n))
其中:
- TxPower:发射功率(1米处的RSSI值)
- RSSI:实际接收到的信号强度
- n:环境衰减因子(通常2-4)
问题:RSSI太不稳定了。人体遮挡、金属反射、多径效应,都会让RSSI值跳来跳去。我在停车场测试时,同一个位置,RSSI值能差10dBm以上。所以RSSI只能做“粗定位”,比如判断车主是否在10米范围内。
避坑指南:我曾经用RSSI做“靠近解锁”,结果车主站在车旁边打电话,身体挡住了手机,RSSI骤降,车门反复解锁锁车。后来我加了滤波算法(卡尔曼滤波+滑动窗口),并且结合加速度计判断车主是否在移动,问题才解决。记住:RSSI不能单独用来做精确触发。
3.5.2 AOA定位:蓝牙的“方向感”
AOA(到达角)是BLE 5.1引入的新特性。它通过天线阵列来测量信号到达的角度,从而实现方向判断。
工作原理:
- 发射端发送带CTE(恒音扩展)的广播包
- 接收端通过天线阵列采样IQ数据
- 计算相位差,得出到达角
AOA vs RSSI:
| 特性 | RSSI | AOA |
|---|---|---|
| 精度 | 3-5米 | 0.5-1米(配合多天线) |
| 方向性 | 无 | 有(可判断角度) |
| 硬件要求 | 单天线即可 | 需要天线阵列(至少2根) |
| 抗干扰 | 差 | 较好 |
| 功耗 | 低 | 较高(需要持续采样) |
我的经验:在车钥匙方案中,我通常把RSSI和AOA结合起来用。RSSI做“粗筛”,判断车主是否在10米范围内。一旦进入范围,启动AOA做“精定位”,判断车主是从车头方向走来还是从车尾方向走来。这样既省电,又保证了精度。说白了,就是让蓝牙和UWB分工合作:蓝牙负责“谁来了”,UWB负责“在哪”。
3.6 实战要点总结
嗯,这一章内容不少。我最后给你总结几个实战中一定要记住的点:
- 广播间隔:100ms左右,加随机延迟,避免冲突
- 连接间隔:30-50ms,平衡延迟和功耗
- GATT设计:用标准UUID,做好版本兼容
- RSSI定位:必须加滤波,不能单独用
- AOA定位:需要天线阵列,适合做方向判断
- 融合策略:RSSI粗筛 + AOA精定位 + UWB最终确认
下一章,咱们会深入讲NFC在车钥匙中的应用。NFC这东西,看着简单,但坑也不少。到时候我跟你聊聊我在NFC天线设计上踩过的雷。