BLE数据报文格式解析

1、数据链路层报文结构

报文的基础是数据链路层的报文,其它报文都是从此展开的,BLE数据链路层数据格式如下:
在这里插入图片描述
后期补充:在最新的core spec 5.2中,有1M PHY和2M的PHY,对应前导符变为1-2个字节。前导符用于频率同步、时序评估和自动增益控制训练。前导符第一bit应该与接入地址的LSB相同。
在这里插入图片描述

2、 广播通道与数据通道 PDU 区别:

(1) 广播通道的 PDU 格式:

在这里插入图片描述
后期补充: :PDU数据长度为1-255字节

字段解析:

  • 报文类型(低 4 个 bit):
    ADV_IND(0000) ——通用广播
    ADV_DIRECT_IND(0001) ——定向连接广播
    ADV_NONCONN_IND(0010) ——不可连接广播
    ADV_SCAN_IND(0110) ——可扫描广播
    SCAN_REQ( 0011) ——主动扫描请求
    SCAN_RSP( 0100) ——主动扫描应答
    CONNECT_REQ( 0101) ——连接请求

### BLE广播类型及其数据包结构 #### 数据包结构概述 BLE(Bluetooth Low Energy)广播数据包是一种用于设备间无连接通信的方式。它允许外围设备周期性地发送短小的数据包至周围的空间,这些数据包可以携带多种信息,如设备名称、UUID和服务数据等[^1]。 #### 广播类型的分类 BLE广播主要分为四种标准类型,每种类型适用于不同的应用场景: 1. **ADV_IND**: 可连接的不可定向广告。这种广播类型表示接收方可以通过发起连接请求来与广播设备建立连接。 2. **ADV_DIRECT_IND**: 定向广告。该广播仅针对特定的目标地址发出,通常用于快速建立一对一连接的情况。 3. **ADV_NONCONN_IND**: 不可连接的非定向广告。这类广播不接受来自任何设备的连接请求,主要用于单向数据传输场景。 4. **SCAN_REQ 和 SCAN_RSP**: 扫描请求和响应机制。当中心设备希望获取更多关于广播设备的信息时,它可以发送 `SCAN_REQ` 请求,随后广播设备会返回额外的数据作为 `SCAN_RSP` 响应[^2]。 #### 数据字段及格式说明 BLE广播数据包的最大有效载荷为31字节,在某些情况下可能通过扩展协议增加到更大的尺寸[^3]。以下是典型的广播数据包组成: - **Preamble (前导码)**: 占用1个字节,用于同步目的。 - **Access Address (访问地址)**: 长度固定为4字节,标识一个合法的BLE链路。 - **Payload (负载)**: 这是实际承载应用层数据的部分,具体包括以下几个子域: - **AD Structure Header (广告数据头)**: 表明后续跟随的是何种类型的服务或参数配置。 - AD Type 字段指示当前记录的具体含义,比如完整的本地名字 (`Complete Local Name`) 或者服务 UUID 列表(`Service UUIDs`) 等。 - AD Length 字段则指定了紧随其后的数据长度。 - **Advertising Data / Scan Response Data**: 实际的应用级数据区域,依据前面提到的不同广播模式填充相应的具体内容。 - **CRC Checksum (循环冗余校验位)**: 为了检测传输过程中可能出现错误的最后一部分附加信息,大小也是固定的三个八比特组[^5]。 对于需要更大容量的有效载荷情况,则可通过协商启用所谓的“Data Length Extension”功能,从而突破原有较小帧体带来的局限性[^4]。 ```python # 示例代码展示如何解析简单的BLE广播报文中的AD Structures部分 def parse_ad_structures(data_bytes): parsed_data = [] index = 0 while index < len(data_bytes): length = data_bytes[index] if not length or index + length >= len(data_bytes): break ad_type = data_bytes[index+1] value = data_bytes[(index+2):(index+length+1)] parsed_data.append({ 'Length': length, 'Type': ad_type, 'Value': bytes(value).hex() }) index += length + 1 return parsed_data example_payload = bytearray([7, 9, 82, 65, 83, 80, 73, 82, 90]) print(parse_ad_structures(example_payload)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值