【从零开始】手写BLE协议栈(3-2)实验:03_phy_connect_ind
3-2 动手实验:编译运行 03_phy_connect_ind
本篇是第 3 章的配套实验,将 3-1 中讲解的 CONNECT_IND 解析与连接参数校验完整跑通。
一、概述
03_phy_connect_ind 在广播状态下等待 Central 发送 CONNECT_IND 包,收到后解析并打印全部 12 个连接参数字段。本 Demo 仅解析参数,不进入连接状态,解析完成后重新回到广播。
通过本实验,你将验证:
- CONNECT_IND 的 22 字节 LLData 能被正确拆解
- 各参数字段(AA, CRC Init, WinSize, WinOffset, Interval, Latency, Timeout, Hop, SCA, Channel Map)的实际值
- T0(CONNECT_IND 结束时刻的 RTC ticks)被正确记录
二、编译与烧录
west build -b nrf52dk/nrf52832 .\write-BLE-stack-from-scratch\03_phy_connect_ind\ -p
west flash
编译产物:
Memory region Used Size Region Size %age Used
FLASH: 96340 B 512 KB 18.38%
RAM: 18816 B 64 KB 28.71%
三、串口日志(启动阶段)
*** Booting Zephyr OS build v4.3.0-4808-ga5d4626b8c16 ***
===================================================
BLE PHY CONNECT_IND Demo
解析连接请求中的 12 个参数字段
===================================================
Device: ConnInd Addr: A6:55:44:33:22:11
HFCLK started
RTC0 started (32768 Hz)
SW_SWITCH_TIMER (TIMER1) configured: 1MHz, 16-bit
PPI configured: CH14 END→CLEAR, CH15 CC[0]→RXEN, CH16 CC[1]→TXEN
[STATE] Entering ADVERTISING state
Radio configured: BLE 1M (ADV mode)
[ADV] events: 1 (waiting for connection...)
[ADV] events: 2 (waiting for connection...)
...
四、运行测试
使用 bumble_connect.py 发送 CONNECT_IND:
.\write-BLE-stack-from-scratch\tools\venv\Scripts\python.exe `
.\write-BLE-stack-from-scratch\tools\bumble_connect.py `
--transport usb:2FE3:000B `
--target A6:55:44:33:22:11 `
--duration 5
Bumble 侧输出:
Connecting to A6:55:44:33:22:11...
Sending CONNECT_IND with:
interval = 40 (50.00ms)
latency = 0
timeout = 200 (2000ms)
★ BLE CONNECTION ESTABLISHED #1
...
✖ DISCONNECTED
Reason : 0x3E - Failed to Establish Connection
断开原因 0x3E 是预期的 — Demo 只解析 CONNECT_IND,不回复任何数据 PDU,Central 等不到响应就超时了。
五、CONNECT_IND 解析结果(串口日志)
========== CONNECT_IND Received ==========
Peer: F0:F1:F2:F3:F4:F5
AA: 0x2917789E
CRC Init: 0x6BE11B
WinSize: 1 (x1.25ms = 1250 us)
WinOffset: 0 (x1.25ms = 0 us)
Interval: 40 (x1.25ms = 50000 us)
Latency: 0
Timeout: 200 (x10ms = 2000 ms)
Hop: 8
SCA: 5 (50 ppm)
Chan Count: 37 / 37
T0 (RTC0): 544242 ticks
==========================================
[STATE] CONNECT_IND parsed. (Not entering connection state in this demo)
[STATE] Returning to advertising...
字段对照
| 字段 | 字节 | 解析值 | 含义 |
|---|---|---|---|
| AA | 4B | 0x2917789E | 数据通道接入地址(随机生成) |
| CRC Init | 3B | 0x6BE11B | 数据通道 CRC 初始值 |
| WinSize | 1B | 1 | 发送窗口大小 = 1.25 ms |
| WinOffset | 2B | 0 | 发送窗口偏移 = 0 ms |
| Interval | 2B | 40 | 连接间隔 = 50 ms |
| Latency | 2B | 0 | 从机延迟 = 0(不跳过) |
| Timeout | 2B | 200 | 超时 = 2000 ms |
| Hop | 5-bit | 8 | 跳频增量(5~16) |
| SCA | 3-bit | 5 | 主机时钟精度 = 50 ppm |
| ChM | 5B | 37/37 | 37 个数据通道全部启用 |
📸 截图占位:Wireshark 抓包显示 CONNECT_IND 包的字节级解析
六、关键概念图
CONNECT_IND 22 字节布局
字节偏移 长度 字段 值(示例)
[0..3] 4B AA 0x2917789E
[4..6] 3B CRCInit 0x6BE11B
[7] 1B WinSize 1
[8..9] 2B WinOffset 0
[10..11] 2B Interval 40
[12..13] 2B Latency 0
[14..15] 2B Timeout 200
[16..20] 5B ChM 0x1FFFFFFFFF (37ch all on)
[21] 1B Hop(5b)+SCA(3b) Hop=8, SCA=5
本系列教程同款硬件:👇
芯片: nRF 52832 开发板
工具: nRF 52840 BLE Dongle 蓝牙嗅探器
工具: 逻辑分析仪
工具: BPA low energy 蓝牙分析仪
本文版权归作者:ixbwer所有,转载请注明原文链接:https://www.cnblogs.com/ixbwer/p/19796616,否则保留追究法律责任的权利。

浙公网安备 33010602011771号