第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完全够用,而且便宜嘛。
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这一步特别慢,因为要下载很多子模块。我曾经在公司网络下等了半小时没反应,后来换了手机热点才搞定。建议你找个网络好的时候操作。
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里,省得每次都敲。
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为例,配置其实就三步:
- 刷写抓包固件: 从Nordic官网下载nRF Sniffer for Bluetooth LE,用nRF Connect Programmer把固件烧到DK板上。
- 安装Wireshark插件: 把nRF Sniffer目录下的
extcap文件夹复制到Wireshark的插件目录。 - 启动抓包: 在Wireshark中选择nRF Sniffer接口,点击开始。
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」的设备。连接它,然后在手机上打字——如果手机能收到键盘输入,恭喜你,环境搭建成功了!
好了,这一章的内容就这些。环境搭建是基础中的基础,但也是最容易出问题的地方。我建议你按照步骤一步步来,别跳步。下一章我们开始讲蓝牙HID协议的核心概念,到时候你会感谢今天把环境搭好的自己。