蓝牙协议栈实战:从HCI命令到GATT服务,手把手教你用Wireshark抓包分析BLE通信

张开发
2026/6/23 13:00:44 15 分钟阅读
蓝牙协议栈实战:从HCI命令到GATT服务,手把手教你用Wireshark抓包分析BLE通信
蓝牙协议栈实战从HCI命令到GATT服务手把手教你用Wireshark抓包分析BLE通信在物联网设备爆炸式增长的今天低功耗蓝牙BLE已成为智能穿戴、家居自动化等场景的核心技术。但当你开发的智能手环频繁断连或自定义服务无法被手机识别时仅靠SDK文档远远不够——你需要深入协议栈底层像外科手术般精准定位问题。本文将带你使用Wireshark这把手术刀解剖BLE通信全过程。1. 搭建BLE抓包环境1.1 硬件准备要捕获空中传输的BLE数据包常规网卡无法胜任。推荐以下三种方案硬件方案成本适用场景推荐型号专用蓝牙嗅探器$$$企业级协议分析Ellisys Bluetooth Explorer双模蓝牙适配器$$开发调试Nordic nRF52840 Dongle手机抓包$移动端问题排查Android HCI日志功能以nRF52840 Dongle为例的配置步骤# 刷写嗅探固件 nrfjprog -f nrf52 --program sniffer.hex --chiperase # 启动Wireshark捕获 hciconfig hci0 reset wireshark -k -i /dev/hci01.2 Wireshark配置技巧安装完成后需进行关键设置在Edit Preferences Protocols Bluetooth中启用BLE LL decoding添加蓝牙厂商ID定义文件如company_ids.txt设置显示过滤器为btle || bthci_acl提示遇到CRC校验错误时尝试调整信道偏移量Channel Map2. BLE连接建立过程解析2.1 广播阶段抓包分析观察智能手环的广播包典型结构如下Frame 1234: 42 bytes on channel 37 Advertising Address: 00:11:22:33:44:55 (Random) Advertising Type: ADV_IND (0x00) Advertising Data: 01 02 01 06 // Flags: LE General Discoverable 09 09 48 65 // Complete Local Name: HelloBand 03 03 0F 18 // Service UUID: Battery Service广播包类型对比类型代码含义是否可连接是否可扫描0x00ADV_IND是是0x01ADV_DIRECT_IND是否0x02ADV_NONCONN_IND否否0x03ADV_SCAN_IND否是2.2 连接请求解密当手机发起连接时关键参数包括Connection Interval7.5ms到4s之间Slave Latency允许跳过的连接事件数Supervision Timeout超时断开阈值典型连接请求包LL_CONNECT_REQ: Access Address: 0x8E89BED6 CRCInit: 0x55AACC WinSize: 2 (2.5ms) WinOffset: 0 Interval: 24 (30ms) Latency: 4 Timeout: 200 (2s) Channel Map: 0x1FFFFFFFFF Hop: 5 SCA: 3 (251ppm to 500ppm)3. HCI层命令与事件剖析3.1 关键HCI命令结构HCI命令采用统一格式--------------------------------------------------------------------- | OGF (6 bits) | OCF (10 bits) | Parameter Length | Parameters... | ---------------------------------------------------------------------常见OGF分类0x01链路控制重置、断开等0x03控制器基带设置事件掩码0x08BLE专用命令广播/扫描设置示例设置广播参数命令# HCI_LE_Set_Advertising_Parameters (OGF0x08, OCF0x0006) command [ 0x20, 0x06, 0x0F, # Header (OGF|OCF length) 0xA0, 0x00, # Min interval 100ms 0xB0, 0x00, # Max interval 110ms 0x00, # Advertising type 0x00, # Own address type 0x00, # Peer address type 0x00,0x00,0x00,0x00,0x00,0x00, # Peer address 0x07, # Channel map 0x00 # Filter policy ]3.2 典型事件解析设备连接成功后控制器会返回LE Connection Complete事件Event Code: 0x3E (LE Meta Event) Subevent: 0x01 (LE Connection Complete) Status: 0x00 (Success) Handle: 0x0042 Role: Master Peer Address Type: Random (0x01) Peer Address: 00:11:22:33:44:55 Interval: 0x0018 (30ms) Latency: 0x0004 Timeout: 0x00C8 (2s)4. ATT/GATT协议实战分析4.1 属性协议操作流程ATT协议采用简单的请求-响应模型特征值读取流程Client - Server: READ_REQUEST (Handle0x0012) Server - Client: READ_RESPONSE (Value0x4B)通知与指示的区别通知0x1B无确认可能丢失指示0x1D需要客户端确认心率服务抓包示例ATT: Handle Value Notification (Handle0x0015) Value: 0x4E 0x00 # Heart Rate 78bpm4.2 GATT服务发现过程完整的服务发现包含三个步骤发现主要服务Client - Server: READ_BY_GROUP_TYPE_REQ (UUID0x2800) Server - Client: READ_BY_GROUP_TYPE_RSP Handle Range: 0x0001-0x0005 UUID: 180D (Heart Rate Service)发现服务特性Client - Server: READ_BY_TYPE_REQ (UUID0x2803) Server - Client: READ_BY_TYPE_RSP Handle: 0x0012 Properties: Notify (0x10) Value Handle: 0x0013 UUID: 2A37 (Heart Rate Measurement)配置通知Client - Server: WRITE_REQ (Handle0x0014) Value: 0x0100 # Enable notification5. 高级调试技巧与异常排查5.1 常见问题诊断表现象可能原因排查方法连接频繁断开Supervision Timeout太小检查LL_CONNECT_REQ参数数据传输卡顿Connection Interval过长抓包分析实际间隔时间服务发现失败属性权限设置错误检查ATT协议的READ_REQ响应广播包不可见广播信道被干扰切换至37/38/39信道测试5.2 性能优化建议连接参数调优公式最优Interval (吞吐量需求 × 8) / (MTU × 每个连接事件包数)MTU协商技巧// 在Android开发中设置最大MTU BluetoothGatt.requestMtu(247); // 最大支持247字节在完成一次完整的BLE通信分析后建议保存过滤后的数据包tshark -r capture.pcapng -Y btle || bthci_acl -w ble_filtered.pcapng

更多文章