BLE 蓝牙通信
本文系统梳理 BLE 低功耗蓝牙的核心知识,从协议栈分层到 GATT 通信机制,再到 NimBLE + ESP32-C3 的实战透传方案,帮你建立完整的 BLE 知识体系。
一、蓝牙是什么?
蓝牙是一种工作在 2.4~2.485GHz ISM 频段的短距离、低功率无线通信技术,广泛用于手机、耳机、电脑、传感器等设备之间的数据交换。
从 1998 年由爱立信、诺基亚等五家公司联合提出以来,蓝牙已经历了五代演进:
| 代际 | 技术 | 速率 | 关键特性 |
|---|---|---|---|
| 第一代 | BR | 721.2 Kbps | 基础传输 |
| 第二代 | EDR | 3 Mbps | 增强数据率 |
| 第三代 | AMP | 24 Mbps | 高速传输 |
| 第四代 | BLE | - | 低功耗,IoT 主流 |
| 第五代 | Bluetooth 5 | - | 更快更远,面向物联网 |
其中,BLE(Bluetooth Low Energy,低功耗蓝牙) 是当前物联网领域的绝对主力。
<aside> ⚠️
经典蓝牙(BR/EDR/AMP) 与 低功耗蓝牙(BLE) 架构完全独立,互不相通。选型时务必明确需求。
</aside>
二、BLE 协议栈:Host 与 Controller
BLE 协议栈分为两大部分,通过 HCI(Host Controller Interface) 连接:
Controller(底层硬件与射频)
- PHY:物理层,共 40 个信道(3 个广播信道 + 37 个数据信道)
- LL(Link Layer):链路层,负责广播、扫描和连接管理
Host(上层协议逻辑)
从下往上共 5 层,各司其职:
- L2CAP(Logical Link Control and Adaptation Protocol):数据拆包与重组,相当于"快递打包员"
- SMP(Security Manager Protocol):负责配对、绑定和加密,相当于"安保部门"
- ATT(Attribute Protocol):底层数据读写操作,相当于"仓库管理员"——按编号存取,不管含义
- GATT(Generic Attribute Profile):将数据组织为 Profile → Service → Characteristic 的结构,相当于"商品目录系统"
- GAP(Generic Access Profile):控制广播、扫描和连接,相当于"前台接待"
一句话概括:GAP 负责"找到人",GATT 负责"找到数据",ATT 负责"读写数据",SMP 负责"安全保障",L2CAP 负责"数据搬运"。
三、GATT 主从通信机制
BLE 通信的核心可以用一句话概括:
从机广播摆数据,主机扫描连着读。
角色划分
- 📱 主机(Central)= Client:主动扫描、发起连接、读写数据。典型设备:手机、网关。
- 📟 从机(Peripheral)= Server:持续广播、定义好数据格式,等待主机来访。典型设备:传感器、手环。
通信层级
Profile(协议规范 / 整份菜单)
├── Service(功能模块 / 菜系分类) ← 拥有唯一 UUID
│ ├── Characteristic(具体数据 / 每道菜) ← 拥有 UUID + 操作属性
│ └── Characteristic
└── Service
└── Characteristic
Characteristic 是通信的最小单元,支持以下操作属性:
- Read:主机主动读取
- Write:主机写入指令
- Notify:从机主动推送(无需确认)
- Indicate:从机主动推送(需要主机确认)
广播与连接
- 连接前:从机在 37/38/39 三个广播信道周期性发送广播包,主机扫描监听
- 连接后:广播停止,进入双向通信,主机掌控通信节奏
- 特殊情况:iBeacon 等设备使用"不可连接广播",数据直接塞在广播包中,主机无需连接即可获取
四、实战:NimBLE + ESP32-C3 BLE-UART 透传
为什么选 NimBLE?
ESP-IDF 提供了两个 BLE 协议栈:NimBLE 和 Bluedroid。
| 对比 | NimBLE | Bluedroid |
|---|---|---|
| RAM 占用 | ~50KB | ~100KB |
| 经典蓝牙 | ❌ | ✅ |
| API 风格 | 简洁 | 较复杂 |
ESP32-C3 仅支持 BLE,不需要经典蓝牙,因此 NimBLE 是最优解——资源省一半,API 更友好。
透传服务设计
ESP32-C3 充当 BLE ↔ UART 双向桥梁,连接手机与 STM32:
┌──────────┐ UART ┌───────────────┐ BLE ┌──────────┐
│ STM32 │◄───────────►│ ESP32-C3 │◄───────────►│ 手机 │
│ (传感器) │ │ (NimBLE) │ │ (APP) │
└──────────┘ └───────────────┘ └──────────┘
自定义 GATT Service 结构:
Service UUID: a647f0c2-...-550001
├── Write Char (...-550002) 手机 → ESP32 → UART → STM32
└── Notify Char (...-550003) STM32 → UART → ESP32 → 手机
数据流向
- 上行(传感器数据到手机):STM32 串口发送 → ESP32 的
uart_rx_task接收 →ble_gatts_notify_custom()推送给手机 - 下行(手机指令到传感器):手机写入 Write Char →
gatt_access_cb()回调触发 →uart_write_bytes()转发给 STM32
这种架构对应蓝牙的 SOC + MCU 模式,但相比 AT 指令方案更灵活、性能更好,也更适合作为项目经验写入简历。
总结
| 知识点 | 核心要点 |
|---|---|
| 蓝牙分类 | 经典蓝牙(高速高功耗) vs BLE(低功耗,IoT 首选) |
| 协议栈 | Host(GAP/GATT/ATT/SMP/L2CAP)+ Controller(LL/PHY) |
| 通信模型 | 从机广播 → 主机扫描连接 → 通过 GATT 读写 Characteristic |
| 实战方案 | ESP32-C3 + NimBLE 做 BLE-UART 透传桥梁 |
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)