用Wireshark抓包实战:手把手教你拆解BLE广播数据包(附ESP32实例)

发布时间:2026/5/19 10:25:21

用Wireshark抓包实战:手把手教你拆解BLE广播数据包(附ESP32实例) 用Wireshark拆解BLE广播数据从抓包到实战解析的完整指南当你第一次在Wireshark中看到BLE广播数据包时那一串看似随机的十六进制数字可能会让你感到无从下手。但别担心这些看似杂乱的数据其实遵循着严格的协议规范就像一本用特定密码写成的日记。本文将带你化身数据侦探用ESP32作为实验设备一步步拆解广播包的每个字节还原BLE设备通信的完整故事。1. 环境准备与抓包基础1.1 硬件与软件配置要开始我们的BLE抓包之旅你需要准备以下装备ESP32开发板任何支持BLE的ESP32型号都可以比如ESP32-WROOM-32蓝牙嗅探器推荐使用Nordic的nRF Sniffer或TI的CC2540 USB DongleWireshark确保安装最新版本(3.6.0)并加载BLE插件ESP-IDF开发环境用于编译和运行示例代码提示如果你使用nRF Sniffer需要先在Wireshark中安装对应的插件具体步骤可以参考Nordic官方文档。1.2 基础抓包流程让我们从最简单的广播抓包开始将ESP32刷入BLE广播示例程序启动蓝牙嗅探器并连接到电脑在Wireshark中选择正确的网络接口开始捕获并观察广播数据包# ESP32简易广播示例代码片段 from machine import Pin import ubluetooth ble ubluetooth.BLE() ble.active(True) ble.gap_advertise(100, adv_datab\x02\x01\x06\x03\x03\xEE\xFF)这段代码会让ESP32持续发送包含特定服务UUID(0xEEFF)的广播包。在Wireshark中你应该能看到类似这样的原始数据d6 be 89 8e 20 25 1a 06 01 06 03 03 ee ff 0a 09 45 53 50 33 32 5f 42 4c 452. BLE广播协议深度解析2.1 广播包结构解剖一个完整的BLE广播包由以下几个部分组成字段长度说明前导码1字节用于同步的0101交替序列接入地址4字节固定值0x8E89BED6报头1字节包含广播类型和地址类型数据长度1字节后续数据的字节数数据域6-37字节包含MAC和有效载荷CRC校验3字节数据完整性校验在Wireshark的实际抓包中前导码通常不会被显示我们从接入地址开始分析。以之前的抓包数据为例d6 be 89 8e 20 25 1a 06 01 06 03 03 ee ff 0a 09 45 53 50 33 32 5f 42 4c 45接入地址d6 be 89 8e小端格式实际值为0x8e89bed6报头20二进制00100000长度2537字节数据域从1a开始到45结束2.2 报头字段详解报头字节(0x20)可以分解为0010 0000 └┬┘ └┬┘ ┬ │ │ └─ 接收地址类型(0公共地址) │ └─── 发送地址类型(0公共地址) └─────── PDU类型(0010扫描响应)常见的PDU类型包括0000ADV_IND可连接的无向广播0001ADV_DIRECT_IND可连接的有向广播0010ADV_NONCONN_IND不可连接的无向广播0011SCAN_REQ扫描请求0100SCAN_RSP扫描响应0101CONNECT_REQ连接请求0110ADV_SCAN_IND可扫描的无向广播3. 数据域解析实战3.1 MAC地址与LTV结构数据域的前6个字节总是设备的MAC地址。在我们的例子中1a 06 01 06 03 03 ee ff 0a 09 45 53 50 33 32 5f 42 4c 45MAC地址是1a:06:01:06:03:03注意这是随机地址实际设备会显示不同值。剩下的31字节采用LTVLength-Type-Value格式组织Length类型和值的总字节数Type数据类型参见BLE规范Value实际数据3.2 常见数据类型解析让我们分解示例中的LTV数据02 01 06Length2TypeValue共2字节Type0x01标志位Value0x06二进制00000110对应标志位Bit 0: LE Limited Discoverable ModeBit 1: LE General Discoverable ModeBit 2: BR/EDR Not Supported03 03 EE FFLength3Type0x0316位服务UUID完整列表Value0xEEFF自定义服务UUID0A 09 45 53 50 33 32 5F 42 4C 45Length10Type0x09完整设备名ValueESP32_BLEASCII编码4. ESP32实战自定义广播包4.1 构建复杂广播数据让我们用ESP32创建一个包含多种数据类型的广播包#include esp_bt.h #include esp_gap_ble_api.h void setup_adv_data() { esp_ble_adv_data_t adv_data { .set_scan_rsp false, .include_name true, .include_txpower true, .min_interval 0x20, .max_interval 0x40, .appearance 0x00, .manufacturer_len 4, .p_manufacturer_data (uint8_t*)\xAB\xCD\xEF\x12, .service_data_len 5, .p_service_data (uint8_t*)\x11\x22\x33\x44\x55, .service_uuid_len 4, .p_service_uuid (uint8_t*)\xAA\xBB\xCC\xDD, .flag 0x06 }; esp_ble_gap_config_adv_data(adv_data); }这段代码配置了包含以下元素的广播包设备名称发射功率制造商特定数据(0xABCDEF12)服务数据(0x1122334455)32位服务UUID(0xAABBCCDD)广播标志(0x06)4.2 高级解析技巧当遇到复杂广播包时可以按照以下步骤分析识别MAC地址前6字节遍历LTV结构读取Length字节读取Type字节并查表确定含义读取(Length-1)字节的Value数据特殊类型处理0xFF制造商特定数据0x16服务数据0x08/0x09短/完整设备名例如解析制造商特定数据05 FF AB CD EF 12Length5Type4字节数据Type0xFF制造商特定数据Value0xABCDEF12制造商自定义内容5. 常见问题与调试技巧5.1 抓包中的典型问题看不到广播包确认嗅探器固件是最新版本检查Wireshark过滤器设置尝试btle过滤器确保ESP32确实在发送广播用手机BLE扫描app验证数据解析不一致注意小端字节序转换确认使用的BLE协议版本4.0/4.2/5.0有差异检查Wireshark的解析插件是否最新CRC校验失败可能是信号干扰导致数据损坏尝试缩短嗅探器与设备的距离检查是否有其他2.4GHz设备干扰WiFi、微波炉等5.2 性能优化建议广播间隔适当增加可以减少信道冲突// 设置广播间隔为100ms esp_ble_gap_set_adv_params(adv_params);数据分片对于大量数据考虑使用扫描响应// 主广播数据 esp_ble_adv_data_t adv_data { ... }; // 扫描响应数据 esp_ble_adv_data_t scan_rsp_data { ... };信道选择BLE使用37/38/39三个广播信道// 只在37和39信道广播 adv_params.channel_map ADV_CHNL_37 | ADV_CHNL_39;在实际项目中我发现合理设置广播间隔(20ms-10s)和有效使用扫描响应可以显著提高设备发现率和数据传输效率。特别是在拥挤的RF环境中避免使用默认的最小广播间隔可以减少数据冲突。

相关新闻