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

蓝牙文章链接直达: 👇

1.profile层(待更新)

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

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

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

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

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

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

8.链路层(LL)

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

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

11.蓝牙应用

在上述文章中我们已经讲述了广播信道的相关Pdu,接下来我们对链路层的相关数据包进行详细的介绍:

数据信道pdu

在这里插入图片描述
在这里插入图片描述

  • 以上是数据信道的pdu,数据信道的分类会根据payload中的操作码去划分,以上格式是针对链路层的格式,数据信道的每个pdu都会包含。
  • 数据信道的pdu主要有数据头、payload和完整性校验(MIC)组成。
参数类型参数含义
LLID逻辑链路标识符,用来判断数据报文属于下列种类型
0b00,保留
0b01,来白L2CAP的延续帧,或者是一个空包.高层报文延续
0b10,来自L2CAP的开始帧,或者是一个完整的报文,高层报文开始
0b11,控制报文,管理连接
NESN(1bit)预期序列号
SN(1bit)序列号
MD(1bit)更多数据
CP(1bit)是否包含CTEinfo
RFU(3bit)保留
length(8bit)长度
CTEinfo(8bit)指明Constant Tone Extension的类型和长度
Payload数据,长度为0到251字节,
MIC消息完整性校验,4个字节,可选
LL control pdu

在这里插入图片描述

  • 上图就是数据信道中的payload数据,payload中根据不同的Opcode类型,分为以下多种PDU:
OpcodeLL Control PDU NameOpcodeLL Control PDU Name
0x00LL_CONNECTION_UPDATE_IND0x16LL_PHY_REQ
0x01LL_CHANNEL_MAP_IND0x17LL_PHY_RSP
0x02LL_TERMINATE_IND0x18LL_PHY_UPDATE_IND
0x03LL_ENC_REQ0x19LL_MIN_USED_CHANNELS_IND
0x04LL_ENC_RSP0x1ALL_CTE_REQ
0x05LL_START_ENC_REQ0x1BLL_CTE_RSP
0x06LL_START_ENC_RSP0x1CLL_PERIODIC_SYNC_IND
0x07LL_UNKNOWN_RSP0x1DLL_CLOCK_ACCURACY_REQ
0x08LL_FEATURE_REQ0x1ELL_CLOCK_ACCURACY_RSP
0x09LL_FEATURE_RSP0x1FLL_CIS_REQ
0x0ALL_PAUSE_ENC_REQ0x20LL_CIS_RSP
0x0BLL_PAUSE_ENC_RSP0x21LL_CIS_IND
0x0CLL_VERSION_IND0x22LL_CIS_TERMINATE_IND
0x0DLL_REJECT_IND0x23LL_POWER_CONTROL_REQ
0x0ELL_PERIPHERAL_FEATURE_REQ0x24LL_POWER_CONTROL_RSP
0x0FLL_CONNECTION_PARAM_REQ0x25LL_POWER_CHANGE_IND
0x10LL_CONNECTION_PARAM_RSP0x26LL_SUBRATE_REQ
0x11LL_REJECT_EXT_IND0x27LL_SUBRATE_IND
0x12LL_PING_REQ0x28LL_CHANNEL_REPORTING_IND
0x13LL_PING_RSP0x29LL_CHANNEL_STATUS_IND
0x14LL_LENGTH_REQ0x2ALL_PERIODIC_SYNC_WR_IND
0x15LL_LENGTH_RSP
LL_CONNECTION_UDPATE 连接参数更新

在这里插入图片描述

  1. 连接参数更新pdu中的参数在连接pdu已提过,此处只多了一个Instant,瞬时参数,表示主从设备更改连接参数的起始位置。
  2. 在连接过程中,主从设备都会维护一个连接事件计数器(connEventCounter),更新连接参数时,约定当计数值等于Instant,主从设备就会使用新的连接参数进行交互。
  3. (但需要注意的是,蓝牙协议规定了主设备必须保证6次的数据发送机会,如果从设备延迟(lantency)为200ms的话,Instan值必须设置为1.2S之后的某个值。)
CHANNEL_MAP_IND 信道图指示

在这里插入图片描述

  • 信道图(ChM)在之前已描述过,5字节每一位表示0~39信道是否可用,0表示不可用,反之表示可用,
  • 这里的瞬时值(Instant)跟上述连接参数更新包中瞬时值含义一致。
LL_TERMINATE_IND

终止连接指示
在这里插入图片描述

  • 错误码列表,具体含义可参考核心协议卷1Part F
Error CodeNameError CodeName
0x00Success0x01Unknown HCI Command
0x02Unknown Connection Identifier0x03Hardware Failure
0x04Page Timeout0x05Authentication Failure
0x06PIN or Key Missing0x07Memory Capacity Exceeded
0x08Connection Timeout0x09Connection Limit Exceeded
0x0BConnection Already Exists0x0CCommand Disallowed
0x0DConnection Rejected due to Limited Resources0x0EConnection Rejected Due To Security Reasons
0x0FConnection Rejected due to Unacceptable BD_ADDR0x10Connection Accept Timeout Exceeded
0x11Unsupported Feature or Parameter Value0x12Invalid HCI Command Parameters
0x13Remote User Terminated Connection0x14Remote Device Terminated Connection due to Low Resources
0x15Remote Device Terminated Connection due to Power Off0x16Connection Terminated By Local Host
0x17Repeated Attempts0x18Pairing Not Allowed
0x19Unknown LMP PDU0x1AUnsupported Remote Feature
0x1BSCO Offset Rejected0x1CSCO Interval Rejected
0x1DSCO Air Mode Rejected0x1EInvalid LMP Parameters / Invalid LL Parameters
0x1FUnspecified Error0x20Unsupported LMP Parameter Value / Unsupported LL Parameter Value
0x21Role Change Not Allowed0x22LMP Response Timeout / LL Response Timeout
0x23LMP Error Transaction Collision / LL Procedure Collision0x24LMP PDU Not Allowed
0x25Encryption Mode Not Acceptable0x26Link Key cannot be Changed
0x27Requested QoS Not Supported0x28Instant Passed
0x29Pairing With Unit Key Not Supported0x2ADifferent Transaction Collision
0x2BReserved for future use0x2CQoS Unacceptable Parameter
0x2DQoS Rejected0x2EChannel Classification Not Supported
0x2FInsufficient Security0x30Parameter Out Of Mandatory Range
0x31Reserved for future use0x32Role Switch Pending
0x33Reserved for future use0x34Reserved Slot Violation
0x35Role Switch Failed0x36Extended Inquiry Response Too Large
0x37Secure Simple Pairing Not Supported By Host0x38Host Busy - Pairing
0x39Connection Rejected due to No Suitable Channel Found0x3AController Busy
0x3BUnacceptable Connection Parameters0x3CAdvertising Timeout
0x3DConnection Terminated due to MIC Failure0x3EConnection Failed to be Established / Synchronization Timeout
0x3FPreviously used0x40Coarse Clock Adjustment Rejected but Will Try to Adjust Using Clock Dragging
0x41Type0 Submap Not Defined0x42Unknown Advertising Identifier
0x43Limit Reached0x44Operation Cancelled by Host
0x45Packet Too Long0x46Too Late
0x47Too Early
LL_ENC_REQ

加密请求,用于SM层
在这里插入图片描述

  • 当产生加密回话时,外围设备发送随机数Rand和加密分发器EDIV,用于区分长期密匙(LTK)。
  • SKD_C是中心设备的密匙分发器的部分,IV_C是中心设备初始化向量的部分。
  • SKD_C、IV_C都是设备产生的随机数,作为密匙标识符,用于检验LTK是否合法。
LL_ENC_RSP

加密响应,用于SM层
在这里插入图片描述

  • SKD_P是外围设备的密匙分发器的部分,IV_P是外围设备初始化向量的部分。
  • 这两者与中心设备的对应随机数共同组成了SKD和IV,这两者作为输入参数,LTK作为key输送给密匙引擎产生当前的会话密匙sessionkey。
LL_REJECT_IND

在这里插入图片描述
ErrorCode见上述表格

LL_START_ENC_REQ

开始加密请求,用于SM层,没有data数据

LL_UNKNOWN_RSP

未知响应,由于操作码错误引起
在这里插入图片描述

LL FEATURE REQ 、LL_FEATURE_RSP

链路层特征请求,请求告知有哪些功能
在这里插入图片描述
下面是feature每个位代表的功能:
在这里插入图片描述
在这里插入图片描述

LL_PAUSE_ENC_REQ 、LL_PAUSE_ENC_REQ

暂停加密请求,在连接建立后使用新密实会用到

LL_VERSION_IND

在这里插入图片描述
version字段表明当前协议栈属于蓝牙协议哪个版本,具体含义如下:
在这里插入图片描述

LL_REJECT_IND

数据包被拒绝,权限不足会发生
在这里插入图片描述

LL_PERIPHERAL_FEATURE_REQ

在这里插入图片描述
与上述特征描述一致

LL_CONNECTION_PARAM_REQ、LL_CONNECTION_PARAM_RSP

在这里插入图片描述

LL_REJECT_EXT_IND

扩展包被拒绝,权限不足会发生
在这里插入图片描述

LL_PING_REQ、LL_PING_RSP

链路响应包,用于判断连接是否正常,没有data数据

LL_LENGTH_REQ 、 LL_LENGTH_RSP

最大/最小接收长度请求
在这里插入图片描述

发送者连接的最大接收/发送字节,不能少于27字节,最大/发送接收时间不得小于328 μs,

LL_PHY_REQ 、LL_PHY_RSP

请求PHY调制速率,发送和传输:1M,2M,code_S2,code_S8
在这里插入图片描述
不同位代表不同的PHY:在这里插入图片描述

LL_PHY_UPDATE_IND

在这里插入图片描述
PHY_C_TO_P指明中心设备要求外尾设备需要使用哪种PHY,另外则相反,Instant则表明在多久之后需要使用更新的PHY进行通信。

LL_MIN_USED_CHANNELS_IND

在这里插入图片描述
MinUsedChannels表示了最小的使用信道,范围在2~37。

LL_CTE_REQ

在这里插入图片描述
恒定音调扩展请求包,用于AOA蓝牙精准定位技术,MinCTELenReq表示最小请求数据长度,单位是 8 µs,MinCTELenReq的value值应该在2~20。

  • CTETypeReq指明是哪种请求包,格式如下:

在这里插入图片描述

LL_CTE_RSP

没有控制数据

LL_PERIODIC_SYNC_IND

在这里插入图片描述

  • 此PDU用于PAWR,。id字段用于标识主机,SyncInfo与扩展广播字段里含义相同;
  • connEventCount记录了连接事件数量;
  • lastPaEventCounter用于决定SyncInfo的内容;SID与扩展广播字段相同。
  • AType记录地址类型,0为公共地址,1为随机地址。
  • SCA、PHY、AdvA都与扩展广播字段含义相同。
  • syncConnEventCount同步连接事件数量,用于同步锚点。
LL_CLOCK_ACCURACY_REQ and LL_CLOCK_ACCURACY_RSP

在这里插入图片描述
时钟精度pdu,用于指示中央或外围设备最差睡眠时钟精度,防止两端因温漂导致通信锚点不一致,导致连接断开,所以需要外围设备在每个连接事件中使用此pdu更新时钟精度。

LL_CIS_REQ

在这里插入图片描述
Connected Isochronous Group (CIG),已连接的等时流数据组标识;(Connected Isochronous Stream)CIS,已连接的等时流数据。顾名思义,CIG中会包含多个CIS。 PHY_C_To_P和 PHY_P_To_C已在上面介绍过,都是指示对方要使用何种PHY。Max_SDU_C_To_P表明主机要求从机的的最大SDU。Framed则表示是否存在数据帧(无数据帧时也会发包,只不过是空包)。
在这里插入图片描述

  • SDU_Interval_C_To_P指示了中心设备两个SDU间的间隔,以微妙为单位。

  • Max_PDU_C_To_P指示了最大的有效载荷,大小为0-251字节。

  • NSE是每个CIS事件中的最大子事件的数量,值应该在1-31数量之间。

  • Sub_Interval设置为同一CIS事件中该CIS的一个子事件开始到下一个子事件开始之间的时间,以微秒为单位。如果NSE字段设置为1,则该值应设置为0;否则,该值应至少为400µs,且应小于ISO_间隔值。

  • BN_C_To_P应设置为从中央到外围设备使用的BN参数值。该值应在0到15之间,BN和FT值规定了CIS事件的传输数据。FT值在1-255之间。 ISO_Interval设置为两个连续CIS锚点之间的时间,单位为1.25 ms。该值应在4和3200之间(即5 ms至4s)。

  • CIS_Offset_Min应设置为连接事件的ACL锚点之间的建议最小时间,以微秒为单位,CIS_Offset应该设置为连接事件的ACL锚点到第一个CIS锚点的时间(以微秒为单位),连接事件由connEventCount引用。该值应至少为500µs。

  • CIS_Offset_Max应该被设置为建议的最大时间,以微秒为单位,CIS_Offset应该设置为连接事件的ACL锚点到第一个CIS锚点的时间(以微秒为单位),连接事件由connEventCount引用。

  • connEventCount是连接事件的计数器。

LL_CIS_RSP

在这里插入图片描述
LL_CIS_RSP中参数含义与LL_CIS_REQ相同。

LL_CIS_IND

在这里插入图片描述
CIS_Offset应该设置为连接事件的ACL锚点到第一个CIS锚点的时间(以微秒为单位),连接事件由connEventCount引用。CIG_Sync_Delay和CIS_Sync_Delay设置为同步时间参数,以毫秒为单位,使应用层的数据能够同步。

LL_CIS_TERMINATE_IND

在这里插入图片描述
CIG_ID与 CIS_ID表示为被终止的CIG和CIS标识,errcode是链路层错误码,已在上述定义,翻看上面PDU错误码。

LL_POWER_CONTROL_REQ

在这里插入图片描述
PHY字段表明请求使用的是何种PHY,如下图所示:
在这里插入图片描述

  • Delta字段表示为请求更改接收方的发送功率等级,单位为dB,数值为正表示需要增加,相反表示要减,0x7f 表示需要将发射功率调至最大值。
  • TxPower字段表示发射方的功率水平,以dB为单位。设置为127表示不可用。
LL_POWER_CONTROL_RSP

在这里插入图片描述

  • 发射功率响应包中Min和Max置1表示设备处于最小或最大发射功率,Delta与TxPower与请求包含义相同。
  • APR((Acceptable Power Reduction)应设置为在对端设备输出功率电平中最大减少值,以dB为单位,设置为0xFF时,表示发送方无法决定值。
LL_POWER_CHANGE_IND

在这里插入图片描述
各字段含义与上述PDU相同

LL_SUBRATE_REQ PDU

在这里插入图片描述

  • LL_SUBRATE_REQ PDU属于增强型连接事件中的PDU,connSubrateFactor即基于connSubrateBaseEvent的间隔,可以允许只使用部分连接事件。数值的大小即连接事件的大小。例如connSubrateFactor为5,则设备会忽略前4个连接事件并在第五个连接事件响应。
  • Max_Lantency是从机延时的最大时间。
  • ContinuationNumber连续数是指连续的有效的数据包数量。
  • Timeout监控超时时间。
LL_SUBRATE_IND PDU

在这里插入图片描述
此PDU是针对LL_SUBRATE_REQ的回复,以确定各参数值。

LL_CHANNEL_REPORTING_IND

在这里插入图片描述
Enable表明对端设别是否应该禁用信道报告。
Min_Spacing应设置为以200 ms为单位,表示在发送下一个LL_CHANNEL_STATUS_IND PDU之前上一个包的最小时间间隔。该值应介于5 (1秒)到150 (30秒)之间。

LL_CHANNEL_STATUS_IND

在这里插入图片描述
10字节的 Channel_Classification分为每2位一个单位,每个单位表示一个信道,每单位值有以下定义:
在这里插入图片描述

LL_PERIODIC_SYNC_WR_IND

在这里插入图片描述

  • CtrData of LL_PERIODIC_SYNC_IND即前面已描述过的PDU内容。
  • 此PDU用于新推出的PAWR广播。
  • numSubevents子事件数目,subeventInterval以1.25ms为单位,从第一个子事件的第一个插槽开始。
  • responseSlotDelay意义与subeventInterval相同,即响应时间。
  • responseSlotSpacing代表以0.125ms为单位的第一个响应槽到下一个响应槽的时间。
恒定音调扩展

在这里插入图片描述
此处的CTE

ISO(同步等时流)

在这里插入图片描述
在这里插入图片描述

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android低功耗蓝牙通过使用BluetoothLeScanner类的startScan()方法来接收数据。以下是接收数据的步骤: 1. 获取BluetoothAdapter实例:使用BluetoothAdapter.getDefaultAdapter()方法获取设备上的蓝牙适配器实例。 2. 检查设备是否支持低功耗蓝牙: 调用BluetoothAdapter的isMultipleAdvertisementSupported()方法来检查设备是否支持低功耗蓝牙。 3. 获取BluetoothLeScanner实例:调用BluetoothAdapter的getBluetoothLeScanner()方法来获取BluetoothLeScanner实例。 4. 创建ScanCallback:创建一个ScanCallback的匿名类实例,重写onScanResult()方法以处理扫描结果。 5. 开始扫描:调用BluetoothLeScanner的startScan()方法开始扫描低功耗蓝牙设备,传入ScanCallback实例作为参数。 6. 处理扫描结果:在ScanCallback的onScanResult()方法中,可以获取到扫描到的蓝牙设备的信息,包括设备的名称、物理地址和广告数据,可以进一步解析广告数据来获取需要的信息。 7. 停止扫描:当需要停止扫描时,调用BluetoothLeScanner的stopScan()方法。 总结:以上是Android低功耗蓝牙接收数据的基本步骤。在扫描到低功耗蓝牙设备后,可以通过解析广告数据来获取到设备发送的数据,进一步处理或显示到应用程序界面。 ### 回答2: 在Android设备上,接收低功耗蓝牙(BLE)数据主要分为以下几个步骤: 1. 获取蓝牙适配器:首先,需要通过调用`BluetoothAdapter.getDefaultAdapter()`方法获取到BluetoothAdapter对象,该对象用于管理本地蓝牙适配器。 2. 开启低功耗蓝牙:通过调用`adapter.enable()`方法来启用低功耗蓝牙。 3. 扫描低功耗蓝牙设备:使用`adapter.startLeScan()`方法开始扫描低功耗蓝牙设备,并通过设置回调函数获取扫描结果。 4. 连接低功耗蓝牙设备:在扫描到设备后,通过调用`device.connectGatt()`方法连接到低功耗蓝牙设备,并获取BluetoothGatt对象。 5. 发现服务:连接成功后,通过调用`BluetoothGatt.discoverServices()`方法发现低功耗蓝牙设备所支持的服务。 6. 获取特征值:在发现服务之后,通过遍历服务列表和特征值列表,找到需要接收数据的特征值。 7. 设置数据接收回调:通过调用`BluetoothGattCharacteristic.setCharacteristicNotification()`方法设置特征值的通知,以便能够接收到来自设备的数据。 8. 接收数据:当设备向特征值发送数据时,通过实现BluetoothGattCallback对象的`onCharacteristicChanged()`方法来接收数据。 需要注意的是,上述步骤中的具体实现方式会因为项目需求和代码结构的不同而有所差异。因此,在实际开发中,可以参考Android官方文档和相关开发文档,根据具体情况进行适当调整和扩展。 ### 回答3: 在Android设备上,接收低功耗蓝牙(Bluetooth Low Energy,BLE)数据可以通过以下步骤进行: 1. 创建一个BLE设备连接:首先,通过BluetoothAdapter对象获取BluetoothLeScanner,然后使用该对象扫描周围的BLE设备。找到目标设备后,使用设备的BluetoothDevice对象创建一个BLE连接。 2. 设置一个回调接口:创建一个BluetoothGattCallback对象,并重写其onConnectionStateChange、onServicesDiscovered和onCharacteristicChanged等方法。这些方法将在BLE连接状态改变、BLE服务发现和BLE特征改变时被调用。 3. 连接到设备:使用BluetoothGatt对象连接到目标设备,可以通过调用connect()方法来建立连接。 4. 发现设备的服务:连接建立后,使用BluetoothGatt对象的discoverServices()方法来发现设备的服务和特征。 5. 获取特征对象:从设备的服务列表中获取目标特征的BluetoothGattCharacteristic对象。 6. 启用数据通知:使用BluetoothGatt对象的setCharacteristicNotification()方法启用该特征的通知功能。 7. 获取特征的描述对象:从特征对象中获取其描述符(BluetoothGattDescriptor)。 8. 设置描述对象的值:使用BluetoothGattDescriptor对象的setValue()方法设置其值。 9. 更新描述对象:使用BluetoothGatt对象的writeDescriptor()方法将描述符的值写入设备。 10. 数据接收:当设备发送数据时,BluetoothGattCallback对象的onCharacteristicChanged方法将被调用,你可以在该方法中获取数据。 综上所述,通过上述步骤可以在Android设备上实现低功耗蓝牙的数据接收功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值