第10章:开发环境搭建——硬件平台选择与SDK安装

好,咱们直接进入正题。这一章我打算聊聊开发环境搭建的那些事。说实话,很多初学者在这个阶段就卡住了——不是板子选错了,就是SDK装不上,折腾一星期还没开始写代码。我当年也踩过这些坑,所以今天我把经验都抖出来。

10.1 硬件平台怎么选?NRF52840 vs ESP32

做蓝牙键盘鼠标,硬件平台是第一步。目前主流的选择就两个:NRF52840和ESP32。嗯,别急着买,先听我说说它们的区别。

对比项 NRF52840 ESP32
蓝牙协议栈 原生Nordic SoftDevice,稳定成熟 基于Bluedroid,功能完整
功耗 极低,适合电池供电 较高,适合插电使用
开发难度 中等,需要理解SDK架构 较低,Arduino生态友好
成本 稍贵(约50-80元) 便宜(约15-30元)
调试工具 J-Link + nRF Connect USB转串口 + ESP-IDF Monitor

我个人习惯用NRF52840做产品原型。为什么?因为它的蓝牙协议栈是经过大量验证的。我在项目中遇到过几次ESP32的蓝牙连接不稳定问题,排查起来特别头疼。但如果你只是做学习验证,ESP32完全够用,而且便宜嘛。

我的建议: 预算充足选NRF52840 DK开发板(约300元),学生党选ESP32-DevKitC(约30元)。两个都买也行,反正不贵。

10.2 SDK安装:Zephyr还是ESP-IDF?

选好硬件,接下来就是SDK。说白了,SDK就是芯片厂商给你的一套「积木」,你只需要搭积木就能做出产品。

10.2.1 Zephyr(用于NRF52840)

Zephyr是一个开源RTOS,Nordic官方推荐用它。安装步骤其实不复杂,但第一次搞容易懵。

# 1. 安装依赖(Ubuntu 20.04为例)
sudo apt install --no-install-recommends git cmake ninja-build gperf \
  ccache dfu-util device-tree-compiler wget \
  python3-dev python3-pip python3-setuptools python3-tk python3-wheel xz-utils file \
  make gcc gcc-multilib g++-multilib libsdl2-dev

# 2. 获取Zephyr源码
west init ~/zephyrproject
cd ~/zephyrproject
west update

# 3. 安装Python依赖
pip install -r ~/zephyrproject/zephyr/scripts/requirements.txt

# 4. 安装工具链
west sdk install

这里有个坑——west update这一步特别慢,因为要下载很多子模块。我曾经在公司网络下等了半小时没反应,后来换了手机热点才搞定。建议你找个网络好的时候操作。

注意: Zephyr的版本更新很快,不同版本之间API可能有变化。建议锁定一个稳定版本,比如v3.4.0,别追新。

10.2.2 ESP-IDF(用于ESP32)

ESP-IDF是乐鑫官方的IoT开发框架。安装相对简单,因为它有自动安装脚本。

# 1. 下载安装脚本
mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git

# 2. 运行安装脚本
cd ~/esp/esp-idf
./install.sh esp32

# 3. 设置环境变量
. ./export.sh

嗯,这里要注意:每次打开新终端都要执行. ./export.sh,不然找不到idf.py命令。我建议你把它加到~/.bashrc里,省得每次都敲。

核心区别: Zephyr的构建系统基于CMake + west,ESP-IDF基于CMake + idf.py。两者都是CMake,但命令不同。你只要记住:Zephyr用west build,ESP-IDF用idf.py build

10.3 调试工具链配置:Wireshark蓝牙抓包

做蓝牙开发,不会抓包就等于闭着眼睛开车。Wireshark是必备工具,但配置起来有点讲究。

10.3.1 硬件抓包器选择

Wireshark本身只是软件,它需要配合硬件才能抓到蓝牙包。常见方案有三种:

  • Nordic nRF Sniffer: 用一块NRF52840 DK板,刷成抓包固件。稳定,推荐。
  • TI CC2540 USB Dongle: 便宜(约50元),但只支持BLE 4.0。
  • Ellisys蓝牙分析仪: 专业设备,上万块。除非公司报销,否则别想。

我个人推荐nRF Sniffer方案。为什么?因为NRF52840 DK板你本来就要买,刷个固件就能当抓包器用,一板两用,划算。

10.3.2 配置步骤

以nRF Sniffer为例,配置其实就三步:

  1. 刷写抓包固件: 从Nordic官网下载nRF Sniffer for Bluetooth LE,用nRF Connect Programmer把固件烧到DK板上。
  2. 安装Wireshark插件: 把nRF Sniffer目录下的extcap文件夹复制到Wireshark的插件目录。
  3. 启动抓包: 在Wireshark中选择nRF Sniffer接口,点击开始。
避坑指南: 我曾经在Windows上配置时,Wireshark死活认不到nRF Sniffer。后来发现是USB驱动没装对。解决办法:用Zadig工具把nRF Sniffer的驱动换成WinUSB。

10.3.3 抓包实战技巧

抓包不是光看数据就完事了。你得学会过滤。下面是我常用的过滤表达式:

# 只显示某个设备的包(替换为你的设备MAC地址)
btle.advertising_address == 11:22:33:44:55:66

# 只显示HID相关的包
btatt.uuid == 0x1812

# 只显示连接请求和响应
btle.ll_control_opcode == 0x03 || btle.ll_control_opcode == 0x04

你想想看,如果没有这些过滤,Wireshark里全是乱七八糟的广播包,根本找不到你要的信息。我刚开始学的时候,对着满屏的十六进制数据发呆,后来才明白过滤的重要性。

核心要点: 抓包不是为了看数据,而是为了理解协议交互过程。重点关注:连接建立、配对绑定、数据收发这三个阶段。

10.4 开发环境验证

环境搭好了,总得跑个例子验证一下。我建议你编译并烧录一个最简单的蓝牙HID设备例程。

对于NRF52840 + Zephyr:

cd ~/zephyrproject/zephyr
west build -b nrf52840dk_nrf52840 samples/bluetooth/hids_keyboard
west flash

对于ESP32 + ESP-IDF:

cd ~/esp/esp-idf/examples/bluetooth/bluedroid/ble/ble_hid_device_demo
idf.py set-target esp32
idf.py build
idf.py -p /dev/ttyUSB0 flash

烧录成功后,用手机蓝牙搜索,应该能看到一个名为「Zephyr HIDS Keyboard」或「ESP32 BLE HID」的设备。连接它,然后在手机上打字——如果手机能收到键盘输入,恭喜你,环境搭建成功了!

常见问题: 如果手机搜不到设备,先检查板子供电是否正常,再确认蓝牙天线是否接好。NRF52840 DK板自带天线,但ESP32有些开发板需要外接天线。

好了,这一章的内容就这些。环境搭建是基础中的基础,但也是最容易出问题的地方。我建议你按照步骤一步步来,别跳步。下一章我们开始讲蓝牙HID协议的核心概念,到时候你会感谢今天把环境搭好的自己。