低功耗蓝牙链路层数据格式汇总(一)

Hello,我是无赖的猴子,一个蓝牙爱好者,分享蓝牙相关的知识,关注我,学习蓝牙:

蓝牙文章链接直达: 👇

1.profile层(待更新)

2.属性协议层(ATT)(待更新)

3.安全管理协议层(SMP)

4.通用访问协议层(GAP)(待更新)

5.通用属性协议层(GATT)(待更新)

6.逻辑链路控制和适配协议层(L2CAP)

7.主机控制器接口层(HCI)

8.链路层(LL)

9.低功耗蓝牙链路层数据格式汇总(一)

10.低功耗蓝牙链路层数据格式汇总(二)

11.蓝牙应用

数据包格式

在这里插入图片描述
链路层数据包格式由前导帧(Preamble)、接入地址AA(Access-Address)、PDU(Protocol Data Unit)、校验码(CRC),外加可选的恒定音调扩展数据包CTE(Constant Tone Extension)构成。

  • 根据物理层(PHY)数据的不同,前导帧的长度也各不相同,在PHY为1 MPHY或2MPHY时,前导帧的长度为1和2字节。
    前导帧的字节序取决于AA的最低位,AA最低位为1时,前导帧以101010…排列,即为0xAA,而最低位为0时,就是0x55。
    前导帧用于区别PHY速率的不同,用以告知物理层所需要用到的增益。
  • 4字节的AA地址在37、38、39广播信道固定为0b10001110_10001001_10111110_11010110 (0x8E89BED6)。其它信道或数据包根据其协议产生AA地址。
  • CRC检验码用于数据冗余错误检查.
  • 可选的CTE包用于蓝牙AOA/AOD精准定位。

PDU格式

在这里插入图片描述
而其中PDU则是上一层封装过的包数据,它由协议头(Header)+数据荷载(Payload)构成。
图2.5就是header的帧格式,header由PDU Type、信道选择算法2标志位(ChSel)、发送与接收地址类别(TxAdd、RxAdd),长度。

PDU Type

PDU Type根据其类型的不同,将数据包分为了广播类、连接类、扩展广播类等,下图是详细的分类:
在这里插入图片描述
在这里插入图片描述

ChSel信道选择算法2

ChSel是为了选择不同信道让信号传输更加顺畅,不产生拥堵,下面是整体架构:
在这里插入图片描述

TxAdd、RxAdd

两者则代表地址类别,当为0时代表公共地址,为1时代表静态地址。

广播信道pdu

广播PDU
ADV_IND、ADV_NONCONN_IND 、ADV_SCAN_IND

在这里插入图片描述

ADV_DIRECT_IND

在这里插入图片描述

扫描PDU
SCAN_REQ ,AUX_SCAN_REQ

扫描请求PDU
扩展广播扫描请求PDU
在这里插入图片描述

SCAN_RSP

扫描响应PDU
在这里插入图片描述

连接
CONNECT_IND

连接请求PDU和AUX_CONNECT_REQ 扩展广播连接请求PDU
连接信道数据包包含初始化地址、广播地址和链路层数据。
在这里插入图片描述
链路层数据又包含接入地址(Access Address)、CRCInit、传输窗口大小(WinSize)、传输窗口偏移(WinOffset)、 连接间隔(Interval)、从机延时(Lantency)、连接超时(Timeout)、信道图(ChM)、调频算法(Hop)、中心设备最差睡眠时钟参数。
在这里插入图片描述
CRC校验码用于冗余错误检查,传输窗口大小用于计算传输窗口大小,transmitWindowSize = WinSize * 1.25 ms。传输窗口是用于告知广播者在窗口内准备连接。传输窗口偏移则指示广播者在多久后打开连接。连接间隔定义了设备每次交互事件的时间。从机延时可设置为忽略多少个连接事件。连接超时规定了连接的时间范围,5字节的信道图指示37个信道哪些是可用,哪些是不可用的,方便设备跳频。跳频算法取值范围在5-16之间,按照蓝牙规定的跳频算法进行跳频操作:
这里的hopincrenment即上述跳频算法hop值。
在这里插入图片描述
中心设备最差睡眠时钟参数可通知设备的时钟精度,精度更高,通信更稳定,响应更及时
在这里插入图片描述

扩展广播

在这里插入图片描述
扩展广播数据包包含长度、广播模式、扩展广播头、广播数据包组成。
AdvMode
不同的value值代表了不同的广播模式
在这里插入图片描述
扩展广播头包含了flags、广播地址、目标地址、扩展CTE信息、广播数据、辅助数据包指针、同步信息、发射功率和附加控制器广播信息。
在这里插入图片描述
falg中不同的位代表了其他变量是否存在,具体如下:
在这里插入图片描述
AdvA和TargetA代表地址,CTEInfo用于蓝牙精准定位技术AOA/AOD,CTEInfo包含CTETime和CTEType,CTETime是以8 µs为单位的值,指示音频扩展时间。CTETime范围在2-20间,即在16~160µs间。
在这里插入图片描述
CTEType则定义了音频扩展类别,值为0时发射角AOA,值为1时是入射角AOD(切换时间为1 µs)定义如下:
在这里插入图片描述
ADI(AdvDataInfo)中DID表示是否是上个广播副本,SID表明同一设备的不同广播。
在这里插入图片描述
辅助数据包指针(AuxPtr)指向了第二信道的扩展数据在何时何地出现,Channel Index指明扩展数据在那个信道出现,CA代表晶振时钟精度,Offset Units为偏移单位,值为0代表30 µs,值为1是300 µs。最后一个PHY指明PHY,000代表1M PHY,001代表2MPHY,010代表 coded PHY。
在这里插入图片描述
SyncInfo field是同步包窗口偏移信息,Offset Units:同步广播单位,0为30us;1为300us。如果同步包窗口偏移量小于245,700µs,则 Offset Units设置为0,Interval:1.25ms为单位,不得小于7.5ms
Chm表明当前哪些信道可用,哪些不可用,别名为信道图。
在这里插入图片描述
Txpower是发射功率,单位为dB。ACAD是附加控制器广播信息。ACAD(Additional Controller Advertising Data)是附加控制器广播信息。ACAD在Audio中会传输BIG信息。
这样扩展广播数据包结构就结束了(不得不说真的长)。

接下来说说扩展广播的一些具体pdu
ADV_EXT_IND 扩展广播主信道PDU
ADV_EXT_IND采用扩展广播格式要求,ADV_EXT_IND中对不同数据格式,某些字段会不存在,如下图所示:其中M代表必须支持,X代表不支持,C.1代表可选参数、O代表支持。
在这里插入图片描述

AUX_ADV_IND

扩展广播次要信道PDU,
在这里插入图片描述
在这里插入图片描述

AUX_SYNC_IND

周期广播使用
在这里插入图片描述

AUX_CHAIN_IND

额外数据包,通常用于多广播包
在这里插入图片描述

AUX_SYNC_SUBEVENT_IND

用于PAWR(带响应的周期广播)
在这里插入图片描述

AUX_SYNC_SUBEVENT_RSP

在这里插入图片描述

AUX_SCAN_RSP

扩展广播扫描响应PDU
在这里插入图片描述

AUX_CONNECT_RSP

扩展广播连接响应PDU
在这里插入图片描述

数据信道PDU详情见这里

关注公众号《嵌入式大丙哥》,回复蓝牙,获取最新蓝牙咨询和嵌入式资料。

Android解析蓝牙数据的具体步骤如下: 1. 获取蓝牙数据:使用Android的蓝牙API连接蓝牙设备,并获取蓝牙设备传输的数据。可以使用BluetoothGattCallback回调函数中的onCharacteristicChanged()方法获取蓝牙设备传输的数据。 2. 解析蓝牙数据:对获取的蓝牙数据进行解析,获取数据中的各个字段,例如数据长度、命令类型、数据内容等。 3. 根据解析结果进行相应操作:根据解析的结果进行相应的操作,例如将解析的数据显示在界面上、进行数据处理等。 下面是一个简单的Android解析蓝牙数据的示例代码: ```java public class BluetoothDataParser { private static final String TAG = "BluetoothDataParser"; public static void parseData(byte[] data) { int dataLength = data[0]; // 数据长度 int commandType = data[1]; // 命令类型 byte[] content = Arrays.copyOfRange(data, 2, dataLength); // 数据内容 Log.d(TAG, "Data Length: " + dataLength); Log.d(TAG, "Command Type: " + commandType); Log.d(TAG, "Content: " + Arrays.toString(content)); // 根据解析的结果进行相应的操作 // ... } } ``` 在BluetoothGattCallback回调函数中的onCharacteristicChanged()方法中,可以调用上述解析蓝牙数据的方法进行解析: ```java @Override public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { byte[] data = characteristic.getValue(); BluetoothDataParser.parseData(data); } ``` 需要注意的是,在解析蓝牙数据时,需要根据实际情况进行解析,例如根据数据中字段的定义来解析数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值