3、软件环境搭建(下):Python 环境与 Scapy 库安装。Sniffer 固件烧录(以 nRF52840 和 TI CC2531 为例)。虚拟化环境(Docker)下的抓包准备。

上一节我们把系统环境和硬件驱动搞定了。这一节,咱们来搭软件栈。

说白了,就是让电脑能听懂无线芯片在说什么,并且能控制它干活。

我个人习惯把这一步分成三层:Python 基础层 → Scapy 协议层 → 固件烧录层。最后再聊聊 Docker 这种“偷懒”玩法。

核心逻辑:抓包工具链 = 解释器(Python) + 协议工厂(Scapy) + 硬件驱动(固件)。缺一个,数据就出不来。

软件环境搭建三层架构图 软件环境搭建三层架构 Python 3.8+ 基础环境 pip / virtualenv / 依赖管理 Scapy 协议栈 BLE / Zigbee / 802.15.4 解析引擎 Sniffer 固件 + 硬件适配 nRF52840 (BLE) | TI CC2531 (Zigbee) 每一层都依赖下一层,不能跳级

3.1 Python 环境:别用系统自带的

我知道很多人图省事,直接用 python3 就开始装包。嗯,这里要注意——系统自带的 Python 通常被 macOS 或 Linux 的包管理器锁着,你乱装依赖,搞不好会把系统搞崩。

我建议用 pyenv 或者 conda 来管理版本。我自己在项目里踩过坑:有一次用系统 Python 装了 Scapy,结果升级 macOS 后整个环境炸了,重装了两天。

我的推荐方案:

  • Windows:直接装 Anaconda,省心。
  • macOS/Linux:用 pyenv + virtualenv,干净。

装好 Python 3.8+ 之后,记得验证一下:

python3 --version
pip3 --version

输出里看到版本号,就说明基础层通了。

3.2 Scapy 库安装:抓包的核心引擎

Scapy 是什么?说白了,它是一个能让你用 Python 直接构造、发送、解析网络数据包的库。对于无线抓包来说,它支持 BLE、Zigbee、802.15.4 这些协议。

安装很简单:

pip3 install scapy

但要注意——别只装 scapy 本体。如果你要抓 BLE,还需要装 scapy-radio 或者 bleak 这类扩展。我记得有一次帮客户调试,发现 Scapy 装好了但抓不到包,折腾半天才发现是缺了 pyserial 驱动。

常见依赖清单:

用途包名安装命令
基础抓包scapypip3 install scapy
串口通信pyserialpip3 install pyserial
BLE 支持bleakpip3 install bleak
Zigbee 支持zigpypip3 install zigpy

装完后,跑个简单测试:

from scapy.all import *
print("Scapy 安装成功!")

没报错,就说明协议层就绪了。

3.3 Sniffer 固件烧录:让硬件听懂你的话

固件烧录,说白了就是把一段“翻译程序”写进无线芯片里,让它能把空中的无线电波转成电脑能读的数据包。

我以两个最常见的硬件为例:nRF52840(主打 BLE)和 TI CC2531(主打 Zigbee)。

3.3.1 nRF52840 烧录 Sniffer 固件

nRF52840 是 Nordic 的明星芯片。烧录前,你需要先下载官方的 nRF Sniffer for BLE 固件包。

  1. 下载固件:从 Nordic 官网获取 nrf_sniffer_for_ble 包。
  2. 连接硬件:用 USB 线连上 nRF52840 Dongle 或开发板。
  3. 使用烧录工具:我推荐 nRF Connect for Desktop 里的 Programmer 工具。
  4. 选择固件:加载 sniffer_nrf52840_xx.hex 文件。
  5. 点击烧录:等进度条走完,拔掉重插。

避坑指南:我曾经烧录时忘记按住板子上的复位键,结果固件写一半卡死了。后来养成习惯——烧录前先按一下复位,再点烧录。

验证方法:插上电脑后,在设备管理器里看到 J-Link 或 COM 端口,就说明固件活了。

3.3.2 TI CC2531 烧录 Sniffer 固件

CC2531 是 TI 的老将,主要抓 Zigbee 和 802.15.4。烧录稍微麻烦点,因为它需要 CC Debugger 或者 SmartRF Flash Programmer。

  1. 下载固件:从 TI 官网获取 ZBOSS Sniffer 或 TI Packet Sniffer 固件。
  2. 连接调试器:CC Debugger 连 CC2531 的调试接口(注意引脚顺序)。
  3. 打开 SmartRF Flash Programmer:选择设备,加载 .hex 文件。
  4. 烧录:点击 Erase & Program。
  5. 断开调试器:拔掉 CC Debugger,用 USB 直连电脑。

注意:CC2531 默认固件是 Zigbee 协调器,烧录 Sniffer 固件会覆盖原功能。建议备份原固件。

验证方法:插上后,系统会识别为一个 USB 复合设备,用 lsusb 或设备管理器能看到 Texas Instruments 字样。

3.4 虚拟化环境(Docker)下的抓包准备

你可能会问:为什么要在 Docker 里抓包?

原因很简单——隔离依赖。我在不同项目里用过 Python 2.7、3.6、3.9,每次切换环境都头疼。Docker 可以把整个抓包环境打包成一个镜像,换台机器直接跑。

我的 Dockerfile 长这样:

FROM python:3.9-slim

RUN pip3 install scapy pyserial bleak

# 暴露 USB 设备
VOLUME /dev/bus/usb

CMD ["python3"]

构建和运行:

docker build -t sniffer-env .
docker run -it --privileged -v /dev/bus/usb:/dev/bus/usb sniffer-env

关键点:--privileged 参数让容器能访问宿主机的 USB 设备。不加这个,你插了硬件也认不出来。

进入容器后,验证一下:

python3 -c "from scapy.all import *; print('Docker 环境就绪')"

没报错,就说明虚拟化环境搭好了。

嗯,到这里,软件环境搭建就全部完成了。你的电脑现在应该能识别硬件、运行 Scapy、并且准备好抓包了。