本文系统梳理 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 协议栈:NimBLEBluedroid

对比 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 透传桥梁

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐