3. 开发环境搭建:硬件选型与工具链准备
做 BLE 开发,第一步就是把家伙事儿备齐。我见过不少新手,芯片选错了,SDK 装不上,抓包工具不会用,折腾一星期还没跑通第一个例程。今天咱们就把这事一次性捋清楚。
说白了,开发环境搭建就三件事:选一块合适的板子、装对 SDK、备好调试工具。这三样搞定了,后面写代码、调 bug 才能顺风顺水。
本章核心目标:完成 nRF52840 DK 开发板的初始化配置,安装 nRF5 SDK 17.1.0,并验证 nRF Connect 与 Wireshark 抓包环境可用。
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 的版本,稳定且文档齐全。
- 下载 SDK:从 Nordic 官网下载 nRF5_SDK_17.1.0_ddde560.zip,解压到无中文路径的目录(比如
C:\nRF5_SDK)。 - 安装工具链:
- Windows:安装 SEGGER Embedded Studio(推荐)或 GCC ARM Embedded。
- macOS/Linux:用
brew或apt安装gcc-arm-none-eabi。
- 配置环境变量:将
GNU_INSTALL_ROOT指向 GCC 安装路径,例如C:\Program Files\GNU Arm Embedded Toolchain\10 2021.10。 - 编译第一个例程:进入
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 包的步骤:
- 购买或制作一个 BLE 嗅探器(nRF52840 Dongle 刷 Sniffer 固件)。
- 安装 nRF Sniffer for Wireshark 插件(Nordic 官网下载)。
- 将嗅探器插入电脑,Wireshark 会自动识别
Bluetooth接口。 - 开始抓包,过滤
btle或btatt协议。
避坑指南:Wireshark 抓 BLE 包时,嗅探器必须离设备足够近(1 米以内),否则容易丢包。我曾经在 3 米外抓包,抓了半小时没抓到任何数据,还以为是设备坏了……后来把嗅探器挪到设备旁边,瞬间抓到。
3.4 开发环境验证:跑通第一个 BLE 例程
环境搭好了,工具也备齐了,最后一步:验证整个链路是否通畅。我习惯用 ble_app_uart 例程做冒烟测试,因为它同时包含了 GATT Server 和 UART 透传功能,能快速验证硬件、SDK 和调试工具。
验证步骤:
- 烧录
ble_app_uart到 nRF52840 DK。 - 打开手机 nRF Connect,扫描并连接设备(设备名通常是
Nordic_UART)。 - 在 nRF Connect 中找到 UART Service(UUID: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E),向 TX Characteristic 写入数据。
- 打开 PC 串口助手(115200 波特率),查看开发板是否打印出收到的数据。
- 用 Wireshark 抓包,确认空中数据包格式正确。
如果以上步骤都成功了,恭喜你,开发环境正式搭建完成。后面就可以开始写真正的 GATT 服务了。
本章小结:我们完成了硬件选型(nRF52840)、SDK 安装(nRF5 SDK 17.1.0)和调试工具准备(nRF Connect + Wireshark)。这三样东西,将贯穿整个课程。下一章,我们将深入 GATT 协议的核心概念,看看 Service、Characteristic 和 Descriptor 到底是怎么工作的。