3. 开发环境搭建:硬件选型与工具链准备

做 BLE 开发,第一步就是把家伙事儿备齐。我见过不少新手,芯片选错了,SDK 装不上,抓包工具不会用,折腾一星期还没跑通第一个例程。今天咱们就把这事一次性捋清楚。

说白了,开发环境搭建就三件事:选一块合适的板子、装对 SDK、备好调试工具。这三样搞定了,后面写代码、调 bug 才能顺风顺水。

本章核心目标:完成 nRF52840 DK 开发板的初始化配置,安装 nRF5 SDK 17.1.0,并验证 nRF Connect 与 Wireshark 抓包环境可用。

开发环境搭建知识体系 硬件选型 SDK 安装 调试工具 nRF52840 ESP32 STM32WB nRF5 SDK ESP-IDF STM32Cube nRF Connect Wireshark 逻辑分析仪 选型建议 • 本课程以 nRF52840 + nRF5 SDK 为主线 • ESP32 适合 Wi-Fi + BLE 混合场景 • STM32WB 适合已有 STM32 生态的团队

3.1 硬件选型:三款主流 BLE SoC 对比

市面上能做 BLE 的芯片不少,但真正适合做 GATT 数据采集的,我个人最常用的是这三款:nRF52840、ESP32 和 STM32WB。它们各有各的脾气,选对了能省一半的功夫。

先看一张对比表,心里有个底:

特性 nRF52840 ESP32 STM32WB55
BLE 版本 BLE 5.3 BLE 4.2 / 5.0 BLE 5.0
主频 64 MHz Cortex-M4F 240 MHz Xtensa LX6 64 MHz Cortex-M4
Flash / RAM 1 MB / 256 KB 4 MB / 520 KB 1 MB / 256 KB
特色外设 NFC、USB、QSPI Wi-Fi、以太网 USB、LCD 控制器
SDK 成熟度 极高(nRF5 SDK) 高(ESP-IDF) 中(STM32Cube)
功耗(TX 0 dBm) 4.8 mA ~130 mA(含 Wi-Fi) 5.2 mA
开发板价格 ~¥300 ~¥60 ~¥200

你可能会问:「那我到底该选哪个?」嗯,这里我直接给结论:

  • 选 nRF52840 —— 如果你专注 BLE 开发,追求低功耗和协议栈稳定性。Nordic 的 SoftDevice 是业界标杆,我做了这么多年项目,90% 的 BLE 产品用的都是它。
  • 选 ESP32 —— 如果你的产品需要 Wi-Fi + BLE 双模,或者预算有限。但要注意,ESP32 的 BLE 协议栈是 Espressif 自研的,有些细节行为跟标准有差异。
  • 选 STM32WB —— 如果你团队之前用 STM32,想复用 HAL 库和 CubeMX 生态。不过它的 BLE 协议栈更新比较慢,我去年踩过一个坑,某个 bug 等了半年才修。

我的建议:如果你是初学者,或者想深入理解 BLE GATT,直接上 nRF52840 DK。这块板子的文档最全,社区最活跃,遇到问题一搜就有答案。我自己带新人时,一律让他们用 nRF52840 起步。

3.2 SDK 安装:nRF5 SDK 与 ESP-IDF

板子到手了,接下来装 SDK。这里我以 nRF5 SDK 为主,ESP-IDF 为辅,STM32Cube 的安装方式跟 CubeMX 一样,就不展开了。

3.2.1 nRF5 SDK 安装步骤

nRF5 SDK 是 Nordic 官方提供的软件开发包,包含了 BLE 协议栈(SoftDevice)、外设驱动、例程和文档。我个人习惯用 nRF5 SDK 17.1.0,这是最后一个支持传统 Makefile 的版本,稳定且文档齐全。

  1. 下载 SDK:从 Nordic 官网下载 nRF5_SDK_17.1.0_ddde560.zip,解压到无中文路径的目录(比如 C:\nRF5_SDK)。
  2. 安装工具链:
    • Windows:安装 SEGGER Embedded Studio(推荐)或 GCC ARM Embedded。
    • macOS/Linux:用 brew 或 apt 安装 gcc-arm-none-eabi。
  3. 配置环境变量:将 GNU_INSTALL_ROOT 指向 GCC 安装路径,例如 C:\Program Files\GNU Arm Embedded Toolchain\10 2021.10。
  4. 编译第一个例程:进入 examples\ble_peripheral\ble_app_uart,执行 make。如果看到 Build complete,恭喜你,环境通了。

注意:nRF5 SDK 17.1.0 依赖 GCC 10.x 版本。我曾经用 GCC 12 编译,结果 SoftDevice 的链接脚本报了一堆错,折腾了两天才发现是编译器版本不兼容。所以,老老实实用官方推荐的版本。

3.2.2 ESP-IDF 安装要点

ESP-IDF 的安装相对简单,Espressif 提供了 ESP-IDF 工具安装器,一键搞定。不过有几个坑我得提醒你:

  • Python 版本:ESP-IDF 要求 Python 3.6+,但 Python 3.11 在某些旧版 IDF 上会报 distutils 缺失。我建议用 Python 3.8 或 3.9。
  • 子模块下载:git clone --recursive 时,国内网络经常超时。可以用 git clone --depth=1 再手动拉子模块,或者用 Espressif 的镜像源。
  • 环境变量:安装完成后,运行 export.ps1(Windows)或 export.sh(Linux/macOS)来激活 IDF 环境。每次打开新终端都要执行一次,挺烦的,我一般把它加到 .bashrc 里。
# ESP-IDF 环境激活示例(Linux/macOS)
source ~/esp/esp-idf/export.sh

# 编译并烧录例程
cd ~/esp/esp-idf/examples/bluetooth/bluedroid/ble
idf.py set-target esp32
idf.py menuconfig
idf.py build
idf.py -p /dev/ttyUSB0 flash monitor

3.3 调试工具准备:nRF Connect 与 Wireshark 抓包

代码写完了,怎么知道它跑得对不对?这时候调试工具就派上用场了。我常说,没有抓包工具的 BLE 开发,就像闭着眼睛开车。

3.3.1 nRF Connect:你的 BLE 瑞士军刀

nRF Connect 是 Nordic 出品的 BLE 调试工具,有桌面版(Windows/macOS/Linux)和手机版(Android/iOS)。它能扫描设备、查看广播包、连接并读写 GATT 属性,还能记录日志。

我一般这么用:

  • 扫描模式:查看周围所有 BLE 设备的广播数据,确认你的设备在正常广播。
  • 连接模式:连接设备后,浏览 GATT 服务列表,手动读写特征值,验证数据通路。
  • 日志模式:开启 HCI 日志,记录所有 BLE 事件,方便回放分析。

小技巧:手机版 nRF Connect 支持 iBeacon 和 Eddystone 解析。我在现场调试时,经常用手机版快速确认广播包格式对不对,比开电脑快多了。

3.3.2 Wireshark 抓包:深入协议细节

Wireshark 是网络协议分析的瑞士军刀,配合 BLE 嗅探器(比如 Nordic 的 nRF Sniffer),可以抓到空中的 BLE 数据包。为什么需要它?因为有时候 nRF Connect 看到的数据是经过协议栈抽象过的,而 Wireshark 能看到最原始的链路层数据。

举个例子,我之前遇到一个 bug:设备连接后,手机收不到通知。nRF Connect 显示一切正常,但 Wireshark 抓包发现,设备根本没发送 ATT Handle Value Notification 包。最后定位到是 CCCD(客户端特征配置描述符)没有正确写入。这种问题,不看原始包根本找不到。

配置 Wireshark 抓 BLE 包的步骤:

  1. 购买或制作一个 BLE 嗅探器(nRF52840 Dongle 刷 Sniffer 固件)。
  2. 安装 nRF Sniffer for Wireshark 插件(Nordic 官网下载)。
  3. 将嗅探器插入电脑,Wireshark 会自动识别 Bluetooth 接口。
  4. 开始抓包,过滤 btle 或 btatt 协议。

避坑指南:Wireshark 抓 BLE 包时,嗅探器必须离设备足够近(1 米以内),否则容易丢包。我曾经在 3 米外抓包,抓了半小时没抓到任何数据,还以为是设备坏了……后来把嗅探器挪到设备旁边,瞬间抓到。

3.4 开发环境验证:跑通第一个 BLE 例程

环境搭好了,工具也备齐了,最后一步:验证整个链路是否通畅。我习惯用 ble_app_uart 例程做冒烟测试,因为它同时包含了 GATT Server 和 UART 透传功能,能快速验证硬件、SDK 和调试工具。

验证步骤:

  1. 烧录 ble_app_uart 到 nRF52840 DK。
  2. 打开手机 nRF Connect,扫描并连接设备(设备名通常是 Nordic_UART)。
  3. 在 nRF Connect 中找到 UART Service(UUID: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E),向 TX Characteristic 写入数据。
  4. 打开 PC 串口助手(115200 波特率),查看开发板是否打印出收到的数据。
  5. 用 Wireshark 抓包,确认空中数据包格式正确。

如果以上步骤都成功了,恭喜你,开发环境正式搭建完成。后面就可以开始写真正的 GATT 服务了。

本章小结:我们完成了硬件选型(nRF52840)、SDK 安装(nRF5 SDK 17.1.0)和调试工具准备(nRF Connect + Wireshark)。这三样东西,将贯穿整个课程。下一章,我们将深入 GATT 协议的核心概念,看看 Service、Characteristic 和 Descriptor 到底是怎么工作的。