【从零开始】手写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 蓝牙分析仪

posted @ 2026-03-30 16:53  ixbwer  阅读(3)  评论(0)    收藏  举报