蓝牙技术基础:版本演进与核心机制

做蓝牙网关选型,第一件事就是搞清楚蓝牙版本到底在说什么。我见过不少工程师,上来就问「支不支持蓝牙 5.0」,但你要问他 5.0 比 4.2 多了什么,他可能就含糊了。嗯,这章咱们就把这事彻底理清楚。

蓝牙版本演进:从 4.0 到 5.4

蓝牙 4.0 是个分水岭。它第一次引入了 BLE(低功耗蓝牙),跟传统蓝牙(BR/EDR)彻底分家。说白了,从 4.0 开始,蓝牙才有了「低功耗」这个标签。

版本 发布时间 核心变化 我的评价
4.0 2010 引入 BLE,双模架构 奠基之作,功耗大幅下降
4.2 2014 数据包扩展,LE Secure Connections 安全性提升,IoT 开始可用
5.0 2016 2Mbps 速率,长距离模式,广播扩展 真正让 BLE 走向工业级
5.1 2019 方向发现,AoA/AoD,GATT 缓存 室内定位的转折点
5.2 2020 LE Audio,LC3 编码,同步信道 音频场景的革新
5.3 2021 连接子速率更新,信道分类增强 稳定性优化,功耗再降
5.4 2023 广播加密,响应式广播,LE GATT 安全 企业级安全补全

选型核心判断:做网关,至少选 5.0 起步。如果涉及室内定位,必须 5.1+。音频场景直接上 5.2。5.3/5.4 目前更多是锦上添花,但新项目我建议直接上 5.4。

我记得 2017 年有个项目,客户坚持用 4.2 芯片做网关,结果广播数据包太小,设备信息塞不下。后来硬生生拆成两个广播包,兼容性问题搞了两个月。从那以后,我所有新项目起步就是 5.0。

BLE 协议栈架构:三层模型

BLE 协议栈分三层:Controller、Host、Application。你想想看,这其实跟 OSI 七层模型一个思路,只是简化了。

BLE 协议栈三层架构 Application Layer(应用层) Profiles / Services / Characteristics 用户自定义逻辑、数据解析、业务处理 Host Layer(主机层) GATT / GAP / SMP / L2CAP / ATT 协议封装、安全配对、属性协议、逻辑链路 通常由软件协议栈实现(如 Zephyr、BlueZ) Controller Layer(控制器层) PHY / LL(链路层) 射频收发、数据包处理、时序控制 用户空间 内核/协议栈 硬件/固件 HCI 接口连接 Host 与 Controller

Controller 层是硬件干的活。PHY 负责射频收发,LL(链路层)负责数据包组装、时序、重传。说白了,这一层你基本碰不到,芯片厂家已经封装好了。

Host 层才是我们做网关开发的主战场。GAP 管连接和广播,GATT 管数据读写,SMP 管配对加密。我习惯把 Host 层理解成「蓝牙的操作系统」——它定义了设备怎么被发现、怎么交换数据。

Application 层就是你的业务代码了。比如网关收到温度数据,怎么解析、怎么上报云端,都在这一层。

我的习惯:做网关选型时,我会先确认 Controller 和 Host 之间的 HCI 接口是否开放。有些模组把 Host 也封死在固件里,你就只能调 AT 指令,灵活性大打折扣。我个人偏好开放 HCI 的方案,这样可以用 BlueZ 或 Zephyr 做上层定制。

蓝牙广播与扫描机制

广播是 BLE 最核心的机制之一。设备不连接就能发数据,这对 IoT 场景太重要了。

广播类型

  • 可连接广播:标准广播,扫描设备可以发起连接。网关扫描到设备后,可以主动连上去。
  • 不可连接广播:只发不收,适合信标场景。比如 iBeacon、Eddystone。
  • 可扫描广播:广播设备允许扫描设备发送扫描请求,获取更多数据。
  • 定向广播:指定目标设备,其他设备忽略。用于快速重连。

我记得有个项目,客户用不可连接广播做温湿度采集,结果网关收不到数据。排查了半天,发现广播间隔设成了 100ms,但网关扫描窗口只有 50ms,刚好错过。后来我把扫描窗口调到 150ms,问题解决。你想想看,广播和扫描的参数匹配有多重要。

广播信道与避让

BLE 在 2.4GHz 频段工作,有 40 个信道。但广播只用 3 个:37、38、39。为什么?因为这三个信道避开了 Wi-Fi 的 1、6、11 信道,减少干扰。

我曾经踩过的坑:在 Wi-Fi 密集的办公环境做网关部署,广播信道 38 经常被 Wi-Fi 干扰。后来我强制网关在扫描时优先监听 37 和 39,丢包率从 15% 降到了 3%。如果你遇到广播不稳定,试试调整扫描信道优先级。

广播数据格式

广播包最大 31 字节,5.0 之后扩展广播可以到 255 字节。数据格式是 AD Structure(AD Type + AD Data)的拼接。

// 广播数据示例(十六进制)
02 01 06 03 03 AA FE 12 16 AA FE 10 00 01 02 03 04 05 06 07 08

// 解析:
// 02 01 06          → AD Type 0x01 (Flags), 长度 2, 数据 0x06
// 03 03 AA FE       → AD Type 0x03 (16-bit UUID), 长度 3, UUID 0xFEAA
// 12 16 AA FE ...   → AD Type 0x16 (Service Data), 长度 18, 数据内容

做网关开发时,我习惯把广播解析写成独立模块。因为不同厂家的设备,广播数据格式千奇百怪。统一解析入口,后期维护会轻松很多。

扫描参数调优

参数 说明 推荐值
扫描窗口 每次扫描的持续时间 100-200ms
扫描间隔 两次扫描开始的时间间隔 200-500ms
扫描模式 被动扫描 vs 主动扫描 主动扫描(获取更多数据)
过滤策略 是否只接收特定设备 按需开启

核心原则:扫描窗口 ≤ 扫描间隔,否则会漏包。扫描窗口越大,功耗越高,但发现概率也越高。做网关时,我一般把扫描窗口设为 150ms,间隔 300ms,兼顾功耗和实时性。

嗯,这章的内容差不多就这些。蓝牙版本、协议栈分层、广播扫描机制,这三块是后续所有选型和配置的基础。你把这些吃透了,后面讲网关硬件选型、固件开发的时候,就不会觉得吃力。