BLE数据包

本文详细解读了LinkLayer数据包的结构,包括Preamble、AccessAddress、PDUPDU分类(如广播通道中的Primary/Secondary等)、广播包的扩展特性、数据通道的流控机制,以及ConstantToneExtension在isochronous通道的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、link layer数据包格式
1.Uncoded Phys
1M/2M Phys

| Preamble|AccessAddress |PDU| CRC| Constant Tone Extension|

其中前4部分是强制的,最后一部分cte是可选的,用于AoA等用途。
Preamble:4Bytes, 这个是为了接收机来同步频率等用途的,每种无线通信都必须必须包含的。是固定的01序列,
并且对于1M PHY 是1字节,2M PHY是2字节。取值取决于之后的访问码地址最低位。简言之,就是Preamble取值是为了与相邻的AccessAddress域有明显的位跳变。具体取值如下:
如果访问码b0是1,则Preamble取以0结束的值,即0xAA/0xAAAA;
如果访问码b0是0,则Preamble取以1结束的值,即0x55/0x5555.

因为整包数据传输工作在1Msybs 或者 2M sybs,所以在不包括CTE的情况下,整包数据传输需要44us~2128us时间。

AccessAddress
在我个人看来,accessAddress更多的是标识一个物理通道,通信双方约定好在哪个通道上碰头交换信息。另外对于监听的设备,只需要通过判断该域就可以判断是否是自己感兴趣的数据。

PDU
PDU分为三大类,
primary广播通道/Secondary广播通道以及周期广播通道上的packet使用广播通道Adv PDU;
数据通道上使用数据通道 Data PDU;
Isochronous通道上使用Isochronous PDU.

1. 广播通道
包括Primary/Secondary/Periodic广播通道PDU格式如下:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ChSel/TxAdd/RxAdd 对于不同的type可能有不同的含义,如果不包含该域,则认为是保留域。

Length: 表示之后的数据Payload的长度,取值1~255字节。

这里着重说一下扩展广播包:
扩展广播的payload的数据使用 Common Extended Advertising Payload Format。
在这里插入图片描述
Extended Header Length 取值范围在0~63之间,实际取决于Extended Header.
AdvMode:
0b00 - 不可扫描不可连接广播包
0b01 - 可连接不可扫描
0b10 - 不可连接可扫描
0b01 - reseved.

在这里插入图片描述
Extended Header Flags: 位map,域映射,分别对应之后的AdvA ~ TxPower域。如果某位为1,说明该域存在。
AdvA 和 TargetA含义和之前广播header含义一致,分别代表广播发出者地址和广播接收者地址。并且类型受广播header种的TxAdd 和 RxAdd约束。
CTEInfo: 表明该包是否包含 Constant Tone Extension(额外的16~160us).
AdvDataInfo(ADI) : 由advertiser设置用于表明广播集信息。
在这里插入图片描述
SID: 用于区分不同的广播集
DID: 广播数据ID。scanner可以据此来区分是不是重复数据包。
AuxPtr:
如果存在该域,就说明至少有部分甚至所有广播数包是存在于随后的辅助广播包里(subsequent auxiliary packet)。但是接下的数据包会在什么时间什么地点发送呢?该域就是描述辅助包的。
在这里插入图片描述
Channel Index,表示可能在哪些通道上发辅助包。
offset Units, Aux Offset域对应数值的时间单位。
0 - 30us,
1- 300us
AUX Offset, 表明从参考点到辅助包开始发送的时间便宜。参考点是指包含该AuxPtr的数据包开始时间。offset = AUX Offset * offset Units. 这个offset至少要大于该包整包发送时间+T_MAFS. 如果Aux Offset小于 245,700 µs, Offset Units需要设置为0. 辅助包的发送时间点不应该早于参考点之后的Aux Offset,并且不晚于参考点之后的Aux Offset + Offset Units。其实就是限制辅助包在参考点+ Aux Offset之后的 offset Units时间内发出去。
在这里插入图片描述
Aux Phy: 辅助包使用的phy
00 - 1M 01 - 2M 10 - Coded 11 - reseved
CA , Clock Accuracy,表示Adevertiser在该包与辅助广播包之间将会使用的时钟精度。
0 : 51ppm ~ 500ppm 1: 0ppm ~ 50ppm

2.Data通道
在这里插入图片描述
在这里插入图片描述
在以下2种情况下可能不存在MIC,

  1. 未加密的acl链路
    2)加密但是payload长度为0

流控机制
connection建立时初始化NESN 和 SN均为0,
NESN:next expected sequence number,
SN : sequence Number
本地维护两个变量transmitSeqNum 和 expectedSeqNum,
Tx时, 设置SN = transmitSeqNum
Rx时,判断接收包的SN是否等于expectedSeqNum, 如果相等则说明对端已经确认收到了last packet,此时将transmitSeqNum加1.

  1. Constant Tone Extention and IQ sample
  2. Isochronous physical channel
    在这里插入图片描述
    CIS 数据包:
    A Connected Isochronous PDU (CIS PDU) shall be either a CIS Data PDU or a CIS Null PDU. A CIS Data PDU is used to carry isochronous data. A CIS Null PDU is used when there is no data to be sent.
    在这里插入图片描述
    在这里插入图片描述
    BIS包:
    A Broadcast Isochronous PDU (BIS PDU) shall be either a BIS Data PDU or BIG Control PDU. A BIS Data PDU is used to carry isochronous data. A BIG Control PDU is used to send control information for a BIG.
    在这里插入图片描述
    在这里插入图片描述
    BIG控制包:
    在这里插入图片描述
    目前BIG控制包只包括2个实际的opcode:
    0x00 - BIG_CHANNEL_MAP_IND
    0x01 - BIG_TERMINATE_IND
    在这里插入图片描述
    在这里插入图片描述
### 如何使用 Wireshark 抓取和分析 BLE 数据包 #### 配置环境 为了成功抓取并分析蓝牙低功耗 (BLE) 数据包,需要准备合适的硬件设备和支持软件。常见的低成本解决方案包括 Nordic Semiconductor 的 nRF52832 USB Dongle 或其他兼容的 BLE 转发器作为嗅探器(sniffer)[^2]。这些设备能够通过串口与计算机通信并将数据传递给 Wireshark。 安装驱动程序后,在 Wireshark 中需确认已启用 `btusb` 捕获接口,并将其绑定至指定的 sniffer 设备。如果未自动识别,请手动调整输入源以匹配所使用的适配器端口号[^1]。 #### 设置过滤规则 由于 BLE 协议具有复杂的跳频机制(共涉及 37 个频道中的动态切换),单靠廉价硬件可能无法覆盖全部频率从而丢失部分传输记录[^2]。为此建议依据具体场景设定初步筛选条件来提高效率: - **按访问地址过滤**: 若目标设备拥有固定的 Access Address,则可通过命令如 `btle.access_address == [your_hex_value_here]` 来限定范围[^3]。 ```plaintext Example: btle.access_address == 0x3129f646 ``` - **基于服务 UUID 定位特定交互**: 当关注某些特征值读/写操作时,利用类似表达式进一步缩小视野: ```plaintext Example: btle.uuid == "service_uuid" ``` #### 实际捕获过程注意事项 尽管采取了上述措施仍可能存在遗漏现象,特别是在高负载环境下容易发生丢帧情况。对此推荐以下策略缓解影响: - 尝试优化天线位置减少干扰; - 增加缓冲区大小延长存储周期以便后续补全缺失片段; - 对比不同时间段内的重复序列验证完整性——例如检查 SN(NESN)字段一致性判断是否存在重传行为[^2]; 另外值得注意的是默认情况下Wireshark展示的时间戳反映自启动以来累计经历秒数而非绝对时刻点。对于跨时段或多终端同步需求而言改用固定参照系会更加直观实用: 进入菜单路径:“View -> Time Display Format”,选择合适选项比如“Date and time of day”。 最后关于特殊标记含义解释,“More Data=True”指示当前连接事件期间存在额外待处理消息等待发送出去[^3]。 ```python # 示例 Python 脚本用于自动化解析导出日志文件 import pyshark cap = pyshark.FileCapture('ble_traffic.pcapng', display_filter='btle') for packet in cap: try: print(f'Packet {packet.number}: AA={packet.btle.access_address}, MoreData={"Yes" if hasattr(packet.btle, "more_data") and getattr(packet.btle, "more_data") == "True" else "No"}') except AttributeError as e: continue ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值