当前位置: 首页 > news >正文

蓝牙技术栈笔记(2)

蓝牙笔记(2)

本笔记为作者再学习蓝牙Host协议栈的一些心得体会,如有不对的地方,请包含与谅解!

​ ————by wsoz

本章开始我们正式进入到传统蓝牙host的学习,先学习一下HCI控制器接口层

主机控制器接口层(HCI)

主机控制器接口 (Host Controller Interface, HCI) 是一套标准的协议接口,它定义了蓝牙协议栈的主机 (Host) 部分和控制器 (Controller) 部分之间如何通信。

首先HCI协议已经被蓝牙SIG组织规定好了,所以对于主机Host以及控制器Controlller都必须遵循这个协议,这样才可以实现不同厂商之间的通信,这也是为什么主机层以及控制器层为啥都有主机控制接口层的原因。

首先先介绍一下core文档的内容,以便于我们在解决问题时可以准确定位

在这里插入图片描述

  1. Introduction主要是HCI 的总体介绍
  2. Over of Host Controller transport layer主要介绍 Transport 层
  3. Over of Host commands and events主要是汇总了HCI command 和 event的内容
  4. HCI flow control主要介绍的是HCI的流控
  5. HCI data formats主要介绍的是几种通信的格式
  6. HCI configuration parameters主要介绍HCI data的参数
  7. HCI commands and events主要介绍通信的命令以及事件,重点
  8. Appendix A Deprecated commands,events,and configuration parameters主要介绍以及被抛弃的events和command参数

下图为core文档中的协议架构图

在这里插入图片描述

下图为core文档中的一个蓝牙系统的数据交互图

在这里插入图片描述

在整个蓝牙系统中我们可以直接简化为层与层之间的通信,如图所示及HOST层与HOST层之间进行通信,Controlller层与Controlller层之间相互进行通信


HCI流控

流控制用于在主机和主机控制器之间,避免传送到主机控制器的未应答远程设备的 ACL 数据溢出主机控制器数据缓冲区(控制器内部缓冲区小无法容纳的情况下会丢弃新包)。主机(蓝牙协议栈)负责管理主机控制器(蓝牙芯片)的数据缓冲区。流控又分为了两种:1.主机到控制器的流控 2.控制器到主机的流控

主机到控制器的流控

这个流控的方法又分为两种:'packet-based' flow control'data-block-based' flow control

对于这两种流控模式的切换可以借助HCI_Write_Flow_Control_Mode命令来切换,对于BR/EDR蓝牙来说,,默认使用的是'packet-based' flow control的流控方式,对于AMP来说,默认使用的是'data-block-based' flow control的流控方式。

HCI_Write_Flow_Control_Mode命令

CommandOCFCommand ParametersReturn Parameters
HCI_Write_Flow_Control_Mode0x0067Flow_Control_ModeStatus

Flow_Control_Mode

ValueParameter Description
0x00Packet based data flow control mode (default for a BR/EDR or LE Controller)
0x01Data block based data flow control mode (default for an AMP Controller)
All other valuesReserved for future use

Status

ValueParameter Description
0x00Packet based data flow control mode (default for a BR/EDR or LE Controller)
0x01Data block based data flow control mode (default for an AMP Controller)
All other valuesReserved for future use

Return Parameters 是控制器(Controller)处理完命令后,返回给主机(Host)的内容。主机在发送命令时,绝对不会包含 Return Parameters

下面主要讲解一下'packet-based' flow control流控模式的原理

  • 初始化时,主机先向控制器发送HCI_Read_Buffer_Size查询最大能接收的ACL 和 SCO 数据分组包数
  • 控制器接收到查询后返回HCI_ACL_Data_Packet_Length以及HCI_SCO_Data_Packet_Length(每个ACL和 SCO 数据包的最大长度字节,不包括包头)以及**Total_Num_ACL_Data_Packets以及Total_Num_SCO_Data_Packets**(控制器总共能缓存多少个ACL数据包,重要)
  • 在至少有一个连接或处于本地回送的情况下,主机控制器利用Number Of Completed Packets 事件控制从主机发来的数据流。
  • 事件分组包括一个连接句柄列表, 以及自从前一个事件返回后已经完成的 HCI 数据分组的相应数目(如果对于一个特定的连接句柄,没有事件返回发生,就从连接建立的时间算起 )。发送完成是指数据分组的传输清除回送至主机。。当主机控制器在其缓存中存放有 HCI 数据分组时,它必须向主机周期性持续发送 Number Of Completed Packets 事件, 直到最终所有 ACL 数据分组都已发送完毕或溢出。
  • 当主机收到 Number Of Completed Packets 事件时,主机的协议栈会增加其内部维护的可用缓冲区计数器(例如Host_Available_Packets)。随后,主机检查该计数器。如果计数器的值大于0,主机就可以从其发送队列中取出相应数量的数据包,发送给控制器。每发送一个数据包,主机便将此计数器减一。这个过程的另一端是:控制器通过射频将数据发送给对端设备后,其内部的物理缓冲区被释放。控制器会记录这些被释放的缓冲区数量,并在合适的时机(例如累积了一定数量或经过了一段时间后),通过Number Of Completed Packets事件将这些“已完成”的数量报告给主机。
控制器到主机的流控

这个控制器到主机的流控不是必须的,因为此时蓝牙空中传输的数据相较于主机CPU处理的速率更慢所以在大多数情况下是没有必要开启控制器到主机的流控的。只有在当我们的主机资源受限以及主机任务量大负载高的情况下需要开启此流控。

初始化时主机向控制器发送HCI_Set_Host_Controller_To_Host_Flow_Control command决定是不是需要开启流控,默认acl和sco流控都是关闭的。

HCI_Set_Host_Controller_To_Host_Flow_Control command命令

CommandOCFCommand ParametersReturn Parameters
HCI_Set_Controller_To_Host_Flow_Control0x0031Flow_Control_EnableStatus

Flow_Control_Enable

ValueParameter Description
0x00Flow control off in direction from Controller to Host. Default.
0x01Flow control on for HCI ACL Data packets and off for HCI Synchronous Data packets in direction from Controller to Host.
0x02Flow control off for HCI ACL Data packets and on for HCI Synchronous Data packets in direction from Controller to Host.
0x03Flow control on both for HCI ACL Data packets and HCI Synchronous Data packets in direction from Controller to Host.
All other valuesReserved for future use

Status

ValueParameter Description
0x00HCI_Set_Controller_To_Host_Flow_Control command succeeded.
0x01 to 0xFFHCI_Set_Controller_To_Host_Flow_Control command failed. See [Vol 1] Part F, Controller Error Codes for a list of error codes and descriptions.

值得注意的是我们主机发送对应的开启命令之后,当控制器响应了就会返回相应的完成事件,通过查询状态码看是不是成功开启。

整个控制器向主机流控的流程

  • 初始化的时候协议栈给蓝牙芯片发送 Set Controller To Host Flow Control command 命令,决定来开启 acl 或者 sco 流控

  • 初始化的时候通过 Host Buffer Size command 由蓝牙协议栈发送给芯片acl,sco packet num,以及 length

    Host Buffer Size command命令

    CommandOCFCommand ParametersReturn Parameters
    HCI_Host_Buffer_Size0x0033Host_ACL_Data_Packet_Length,
    Host_Synchronous_Data_Packet_Length,
    Host_Total_Num_ACL_Data_Packets,
    Host_Total_Num_Synchronous_Data_Packets
    Status

    Host_ACL_Data_Packet_Length
    Size: 2 octets (2字节)

    ValueParameter Description
    0xXXXX主机能够接收的每个 HCI ACL 数据包中数据部分的最大长度 (以字节为单位)。

    Host_Synchronous_Data_Packet_Length
    Size: 1 octet (1字节)

    ValueParameter Description
    0xXX主机能够接收的每个 HCI 同步数据包中数据部分的最大长度 (以字节为单位)。

    Host_Total_Num_ACL_Data_Packets
    Size: 2 octets (2字节)

    ValueParameter Description
    0xXXXX可存储在主机数据缓冲区中的 HCI ACL 数据包总数。

    Host_Total_Num_Synchronous_Data_Packets
    Size: 2 octets (2字节)

    ValueParameter Description
    0xXXXX可存储在主机数据缓冲区中的 HCI 同步数据包总数。

    Status
    Size: 1 octet (1字节)

    ValueParameter Description
    0x00HCI_Host_Buffer_Size 命令成功。
    0x01 to 0xFFHCI_Host_Buffer_Size 命令失败。请参阅 [Vol 1] Part F, Controller Error Codes (卷1, F部分, 控制器错误代码) 以获取错误代码和描述列表。
  • 协议栈收到 acl 后发送给芯片 Host Number Of Completed Packets command

    Host Number Of Completed Packets command命令

    CommandOCFCommand ParametersReturn Parameters
    HCI_Host_Number_Of_Completed_Packets0x0035Num_Handles,
    Connection_Handle[i],
    Host_Num_Completed_Packets[i]

    Num_Handles
    Size: 1 octets (1字节)

    ValueParameter Description
    0xXXThe number of Connection_Handles and Host_Num_Completed_Packets parameters pairs contained in this command.
    Range: 0 to 255

    Connection_Handle[i]
    Size: 大小:句柄数量 × 2字节,其中12位有效

    ValueParameter Description
    0xXXXXConnection_Handle
    Range: 0x0000 to 0x0EFF

    Host_Num_Completed_Packets[i]
    Size: 2 octets (2字节)

    ValueParameter Description
    0xXXXXThe number of HCI Data packets that have been completed for the associated Connection_Handle since the previous time the event was returned.
    Range: 0x0000 to 0xFFFF
  • 控制器通过接收 Host Number Of Completed Packets command 来维护内部的一个计数器确定是不是该向主机发送数据


蓝牙HCI数据包格式

主机和控制器之间的数据包command/event/acl/sco/iso,每一种类型的分组都有其对应的格式,下面我们将会来依次看一下各个数据包的格式。

需要注意的是如果没有特别说明的情况下,接收和发送的数据包均为小端字节序列(低位在前)

command数据包

HCI 命令包是从协议栈发送给芯片的命令。其命令格式如下图:

在这里插入图片描述

下面进行解释

  • 命令格式由三个字段组成:opcode(操作码,唯一标识) parameter total length(所有参数总长度) parameter(参数字段)

  • opcode操作码(2个字节):
    用来唯一标识不同的命令。又由OCF(操作码命令字段,低10位)和OGF(操作码组字段,高6位)组成

    • OGF的组类型:

      OGF 值分组名称说明
      0x01Link Control Commands链路控制命令,如查询、连接、断开等。
      0x02Link Policy Commands链路策略命令,如角色切换、保持模式等。
      0x03Controller & Baseband Commands控制器和基带命令,如重置、读缓冲区大小等。
      0x04Informational Parameters信息参数命令,读版本、支持的特性等。
      0x05Status Parameters状态参数命令。
      0x06Testing Commands测试命令。
      0x08LE Controller Commands低功耗控制器命令,如设置广播参数、创建连接等。
      0x3FVendor Specific Commands厂商特定命令(OCF范围:0x0000-0x00FF)。
  • parameter total length参数长度(1字节):

    该参数标定了后续参数的长度

  • parameter参数字段(0-n个字节由命令类型决定):
    不同的hci command对应的参数不一样

分析一下组装hci命令的源码:

struct bt_pbuf_t *hci_cmd_ass(struct bt_pbuf_t *p, uint16_t ocf, uint8_t ogf, uint8_t len)
{((uint8_t *)p->payload)[0] = (ocf & 0xff); /* OCF & OGF */((uint8_t *)p->payload)[1] = (ocf >> 8)|(ogf << 2);((uint8_t *)p->payload)[2] = len-HCI_CMD_HDR_LEN; /* Param len = plen - cmd hdr  */if(hci_pcb->numcmd != 0){--hci_pcb->numcmd; /* Reduce number of cmd packets that the host controller can buffer */}return p;
}

下面为了深入理解我们利用btsnoop读取的原始数据来分析一下:

在这里插入图片描述

可以看到我们的原始数据为:0x01 0x01 0x04 0x05 0x33 0x8b 0x9e 0x0a 0x00

这是捕获的传输层的数据所以0x01就是数据包类型即是CMD数据包,后面的就是HCI命令包的数据

我们可以看到我们这个cmd的功能是inquiry查询,所以0x01 0x04提取我们的操作码为0x0401,其中经过计算后OGF为0x01 ,OCF为0x001

parameter length参数就0x05就是后续参数长度为5个字节 可以看到后续确实为5个字节数据

event数据包

HCI event 是蓝牙芯片发送给协议栈的事件。其格式如下图:

在这里插入图片描述

下面进行解释:

  • 事件由三个字段组成:Event Code(事件码,唯一标识) parameter totallength(所有参数长度) event parameter(事件参数)

  • Event Code事件码(1个字节)

    唯一 event 编码,用来区分不同的事件

  • parameter total length参数长度(1个字节)

    该参数标定了后续参数的字节长度

  • event parameter事件参数(0-n个字节由事件类型决定)

    对于不同的事件而言参数的长度是不同的

下面我们依旧结合btsnoop数据来看:

在这里插入图片描述

可以看到我们协议栈接收到原始数据为:0x04 0x0f 0x04 0x00 0x01 0x01 0x04

这是捕获的传输层的数据所以0x04就是数据包类型即是event数据包,后面的就是接收到的HCI事件的数据

其中0X0F就是我们的事件码,0x04就是我们的参数长度,后续的参数长度也确实是4个字节长度

acl数据包

HCI acl 用于从协议栈跟蓝牙芯片双向交互异步数据上层协议的数据。下图为具体的格式:
在这里插入图片描述

下面进行解释:

  • acl数据包由5个字段组成:Handle(连接句柄) PBFlag(用于上层数据【L2CAP】,是否是分隔数据) BCFlag(是否为广播)

    data total length(后续data数据长度)

  • handle连接句柄(12位)

    这个标志是当我们主机和控制器连接时,控制器为主机分配一个12位的连接句柄,该句柄的作用就是区分不同链路的蓝牙连接,方便蓝牙连接后跟 remote 交互 acl 数据用

  • PBFlag包边界标志(2位)

    这个标志位用于指示当前 ACL 数据包在逻辑链路层 (L2CAP 层) 协议数据单元 (PDU) 中的位置。因为ACL数据包很大可能需要分组发送。

    参数描述
    0b00L2CAP PDU 的起始片段 (Start of a L2CAP PDU)。这可以是一个完整的 PDU,也可以是一个被分段 PDU 的第一个片段。
    0b01L2CAP PDU 的延续片段 (Continuation of a L2CAP PDU)。
    0b10保留
    0b11保留

    比如我们有一长包分为3个包依次传送那包的PBFlag依次为 0b00 0b01 0b01

  • BCFlag广播标志(2位)

    这个标志位用于指示当前 HCI ACL 数据包是发送给单个设备还是多个设备(广播)

    参数描述
    0b00点对点 (Point-to-point)
    用于 ACL-U, AMP-U 或 LE-U 链路类型
    0b01BR/EDR 广播 (BR/EDR broadcast)
    主要用于 ASB-U 链路类型
    0b10保留,供将来使用 (Reserved for future use)
    0b11保留,供将来使用 (Reserved for future use)值

​ 其中广播方式只能在以下两种情况下使用:

  1. 从主机 (Host) 到控制器 (Controller),并且该主机是微网的主设备 (master)。这意味着主设备主机向其控制器发送一个广播数据包,由控制器广播出去。
  2. 从控制器 (Controller) 到主机 (Host),并且该主机是微网的**从设备 (slave)。**这意味着从设备的控制器接收到一个广播包后,将其上报给从设备主机。
  • data total length数据长度(2个字节)

    该数据长度指的是该分组中后续的data字节长度

  • data数据字段(不同acl数据长度不同)

下面依旧通过btsnoop数据来分析一下:

在这里插入图片描述

可以看到我们协议栈接收到原始数据为:0x02 0x33 0x00 0x0c 0x00 0x08 0x00 0x01 0x00 0x06 0x08 0x04 0x00 0x42 0x00 0x41 0x00

这是传输层的数据其中0x02表示了这是一组acl数据,从0x33 0x00提取句柄为0x033 包边界符为0b00表示这是首包 然后广播标识符为0b00表示就是点对点通信

data length是0x0c就是12个字节的后续data,然后可以看到后续确实有12个字节的数据。

sco数据包

HCI sco 用于从协议栈跟蓝牙芯片双向交互音频数据,主要用于传统蓝牙。下面为其的格式:

在这里插入图片描述

下面进行具体的解释:

  • sco数据包由4个字段组成:Handle(连接句柄) Packet_status_flag(包状态标志) RFU(保留) Data_Total_Length(数据长度) data(sco数据)

  • Handle连接句柄(12位)

    在主机和控制器连接时,控制器分配的一个唯一标识符给sco数据包的用于蓝牙连接后跟 remote 交互 sco 数据用。

  • Packet_status_flag包状态标志(2位)

    正常情况下这个包标状态通常都是0b00

    描述含义
    0b00Valid data (有效数据)Host -> Controller: 表示这是一个新的、首次发送的 SCO/eSCO 数据包。
    Controller -> Host: 表示控制器成功接收并提交了一个新的数据包。对于标准 SCO,这是唯一常见的值。
    0b01First retransmission (首次重传)(仅限 eSCO)
    Host -> Controller: 表示这是 Host 对一个特定数据包的第一次重传。
    Controller -> Host: 表示控制器收到的数据包是远程设备对先前丢失或损坏的数据包的第一次重传。
    0b10Subsequent retransmission (后续重传)(仅限 eSCO)
    Host -> Controller: 表示这是 Host 对一个特定数据包的第二次或更多次的重传。
    Controller -> Host: 表示控制器收到的数据包是远程设备对先前丢失或损坏的数据包的后续重传。
    0b11Flushed/Discarded (已刷新/丢弃)(仅限 eSCO,且仅由 Controller -> Host 发送)
    Controller -> Host: 表示控制器由于达到最大重传次数、超时或其他原因,已丢弃了某个数据包,无法成功传输,并通知 Host 该数据包已丢失。Host 不会发送此状态的数据包给 Controller。
  • Data_Total_Length数据长度(1字节)

    就是这个参数表示了该组sco数据data的字节长度

  • data数据字段(不同sco数据长度不同)

iso数据包

此部分是从 core5.2 开始增加,主要是蓝牙协议栈跟蓝牙芯片交互同步数据,主要用来传输 BLE Audio 的数据。下图为其格式:

在这里插入图片描述

下面进行具体解释:

  • 该iso数据包由7个字段组成:Handle(连接句柄) pb_flag(分包标志符) ts_flag(开启时间戳标志位) RFU(保留) iso_data_load_length(iso数据包长度)RFU(保留) iso_data_load(iso数据字段)

  • Handle连接句柄(12位)

    在主机和控制器连接时,控制器分配的一个唯一标识符给iso数据包的用于蓝牙连接后跟 remote 交互 iso 数据用。

  • pb_flag分包标志符(2位)

参数描述
0b00ISO_Data_Load 字段中包含的是一个被分段的 SDU (Service Data Unit) 的起始片段
0b01ISO_Data_Load 字段中包含的是一个 SDU 的中间连续片段
0b10ISO_Data_Load 字段中包含的是一个完整的 SDU(即 SDU 未被分段)。
0b11ISO_Data_Load 字段中包含的是一个被分段的 SDU 的最后一个片段
  • ts_flag时间戳标志位(1位)

    当开启Timestamp功能时,会在 ISO_Data_Load_Length 字段之后(即 ISO_Data_Load 的起始处)包含一个 4 字节的 Time_Stamp 字段。

    开启该功能时置1,关闭时置0

  • iso_data_load_length数据包长度(14位)

    就是这个参数表示了该组iso数据data的字节长度

  • data数据字段(不同iso数据长度不同)


蓝牙命令部分

下面为列出的蓝牙 HCI 命令 (部分):

OGF (Opcode Group Field)OCF (Opcode Command Field)命令 (Command)命令描述 (Command Description)
Link Control Commands (0x01)0x0001Inquiry command让BR/EDR芯片进行搜索模式,搜索周边的BR/EDR设备
0x0002Inquiry Cancel command如果BR/EDR芯片在搜索状态,那么停止BR/EDR芯片的搜索
(未命名命令)让BR/EDR芯片进入周期性搜索状态,但是此命令不常用,并且有的芯片会返回错误,所以不在此处扩展讲解
0x0003Periodic Inquiry Mode command进入周期性搜索状态的BR/EDR蓝牙芯片退出周期性搜索
0x0004Exit Periodic Inquiry Mode command根据参数跟特定的蓝牙地址创建连接
0x0005Create Connection command根据参数跟特定的连接句柄断开连接,可以用来断开ACL,也可以用来断开SCO、eSCO等
0x0006Disconnect command"连接中的"取消指令,此功能感觉比较鸡肋,同样我也没用过
0x0008Create Connection Cancel command接受连接请求
0x0009Accept Connection Request command拒绝连接请求
0x000AReject Connection Request command对方向请求linkkey的时候,而我们没有link key,我们回复link key
0x000BLink Key Request Reply command用于请求linkkey时,而我们没有link key的情形下回复
0x000CLink Key Request Negative Reply command用于响应芯片发送的pincode申请,并把pincode用于连接
0x000DPIN Code Request Reply command不能用于pincode连接
0x000EPIN Code Request Negative Reply command改变正在连接的交互封装类型
0x000FChange Connection Packet Type command用于指令连接句柄的两个蓝牙地址进行身份认证
0x0011Authentication Requested command建立或取消连接层次的加密
0x0013Set Connection Encryption command用于指定链路句柄,生成一个新的link key
0x0015Change Connection Link Key command用于强制主设备设备使用的临时或永久link key
0x0017Master Link Key command获取远端设备名称
0x0019Remote Name Request command获取远端设备名称
0x001ARemote Name Request Cancel command获取Remote端支持的feature
0x001BRead Remote Supported Features command获取Remote端支持的扩展feature
0x001CRead Remote Extended Features command获取Remote端版本信息,注意此部分是LMP或者LL的版本
0x001DRead Remote Version Information command获取时钟偏移
0x001FRead Clock Offset command获取LMP句柄
0x0020Read LMP Handle command建立SCO
0x002BSetup Synchronous Connection command接受对方SCO建立请求
0x002CAccept Synchronous Connection Request command拒绝对方SCO建立请求
0x002DReject Synchronous Connection Request command当在SSP配对模式下,响应芯片IO capability的请求
0x002EIO Capability Request Reply command当在SSP配对模式下,响应芯片IO User Confirmation的请求
0x002FUser Confirmation Request Reply command当在SSP配对模式下,拒绝芯片IO User Confirmation的请求
0x0030User Confirmation Request Negative Reply command当在SSP配对模式下,拒绝芯片IO User Confirmation的请求
0x0031IO Capability Request Negative Reply command
Link Policy Commands (0x02)0x0001Hold Mode command用于改变链接的行为,并让它将指定的Connection_Handle关联的ACL基带连接置于Hold模式
0x0002Sniff Mode command进入Sniff模式
0x0003Exit Sniff Mode command离开Sniff模式
0x0004QoS Setup command用于为Connection_Handle指定服务质量参数
0x0007Role Discovery command查询当前的连接芯片处于什么角色
0x0008Switch Role command切换角色
0x000BRead Link Policy Settings command读取当前连接的策略
0x000CWrite Link Policy Settings command改变当前连接的策略
0x000DRead Default Link Policy Settings command读取默认的连接策略
0x000EWrite Default Link Policy Settings command用于指定通过Connection_Handle标识的ACL Connection_Handle传输的流量的流参数
0x000FFlow Specification command用于指定通过Connection_Handle标识的ACL Connection_Handle传输的流量的流参数
0x0010Sniff Subrating command给定链路指定用于嗅探子例程的参数
0x0011Sniff Subrating command
Control and Baseband commands (0x03)0x0001Set Event Mask command用于控制HCI为主机生成哪些事件
0x0003Reset command复位 (软复位)
0x0005Set Event Filter command设置事件过滤
0x0009Flush command丢弃芯片中正在传输的数据
0x000ARead PIN Type command读取PIN类型
0x000BWrite PIN Type command写PIN类型
0x000DRead Stored Link Key command读取芯片中存储的Link key
0x000EWrite Stored Link Key command把link key写入芯片
0x0011Delete Stored Link Key command删除芯片中的Link key
0x0012Write Local Name command写入本地名称到芯片中
0x0013Read Local Name command读取芯片的蓝牙名称
0x0014Write Connection Accept Timeout command写入蓝牙连接接收的超时时间
0x0015Read Connection Accept Timeout command读取蓝牙连接接收的超时时间
0x0016Write Page Timeout command写入page的超时时间
0x0017Read Page Timeout command读取page的超时时间
0x0019Write Scan Enable command写入scan enable
0x001ARead Scan Enable command读取scan enable
0x001BWrite Page Scan Activity command写入Page Scan Activity
0x001DRead Page Scan Activity command读取Page Scan Activity
0x0023Write Class of Device command写入芯片的cod
0x0024Read Class of Device command读取cod写人cod
0x0025Write Voice Setting command写入voice setting
0x0026Read Voice Setting command读取voice setting
0x0031Set Controller To Host Flow Control command启动HCI流程
0x0032Host Buffer Size command把buffer size写入到芯片中
0x0033Read Buffer Size command读取buffer size
0x0036Read Link Supervision Timeout command读取Link Supervision timeout时间 (也就是Link lost时间)
0x0037Write Link Supervision Timeout command写入Link Supervision timeout时间 (也就是Link lost时间)
0x0044Read Inquiry Mode command读取芯片的Inquiry模式
0x0045Write Inquiry Mode command把搜索模式写入到芯片中
0x0051Read Extended Inquiry Response command读取芯片的Extended inquiry response
0x0052Write Extended Inquiry Response command把Extended inquiry response写入到芯片
0x0055Read Simple Pairing Mode command读取芯片是否支持SSP
0x0056Write Simple Pairing Mode command把是否支持SSP写入到蓝牙芯片
Informational Parameters commands (0x04)0x0001Read Local Version information command读取本地芯片的LMP version
0x0002Read Local Supported Commands command读取本地芯片支持的command
0x0003Read Local Supported Features command读取本地芯片支持的feature
0x0004Read Local Extended Features command读取本地芯片支持的扩展feature
0x0005Read Buffer Size command读取芯片的buffer size
0x0009Read BD_ADDR command读取本地芯片的蓝牙地址
0x000ARead Data Block Size command读取芯片的block size
0x000BRead Local Supported Codecs command读取本地芯片支持的编码格式
0x000CRead Local Simple Pairing Options command读取本地芯片SSP选项
0x000ERead Local Supported Codec Capabilities command读取本地芯片支持的codec capabilities
Status Parameters commands (0x05)0x0003Read Link Quality command读取连接质量
0x0005Read RSSI command读取RSSI信号强度
0x0007Read Clock command读取clock
Testing commands (0x06)0x0001Read Loopback Mode command去读取loopback模式
0x0002Write Loopback Mode command写loopback模式
0x0003Enable Device Under Test Mode command使设备进入测试模式

蓝牙事件部分

下面为列出的蓝牙 HCI 事件 (部分):

序号 (Event Code)EVENT (事件名称)描述
0x01Inquiry Complete Event搜索完成
0x02Inquiry Result Event搜索结果
0x03Connection Complete Event连接完成
0x04Connection Request Event连接请求
0x05Disconnection Complete断开完成
0x06Authentication Complete event授权完成
0x07Remote Name Request Complete event获取远端蓝牙名称完成
0x08Encryption Change event加密模式改变完成
0x09Change Connection Link Key Complete event改变连接的link key完成
0x0AMaster Link Key Complete event管理Link key完成
0x0BRead Remote Supported Features Complete event读取远端设备feature完成
0x0CRead Remote Version Information Complete event读取远端版本完成
0x0DQoS Setup Complete eventQos setup完成
0x0ECommand Complete event命令完成
0x0FCommand Status event命令状态消息
0x10Hardware Error event蓝牙芯片硬件错误
0x12Role Change Event角色切换事件
0x13Number Of Completed Packets event完成封包个数
0x14Mode Change event模式改变
0x15Return Link Keys event返回link key
0x16PIN Code Request eventPIN code请求
0x17Link Key Request eventLink key请求
0x18Link Key Notification eventLink key通知
0x19Loopback Command eventLoopback模式返回的事件
0x1AData Buffer Overflow event芯片buffer爆掉
0x1BMax Slots Change event最大slot变化
0x1CRead Clock Offset Complete event读取时钟偏移完成
0x1DConnection PacketType Changed event连接包类型变化
0x1EQoS Violation eventQoS违规
0x22Inquiry Result with RSSI event带RSSI的搜索结果
0x2CSynchronous Connection Complete eventSCO连接完成
0x2FExtended Inquiry Result event带EIR的搜索结果
0x31IO Capability Request eventIO capability请求
0x32IO Capability Response eventIO capability回复
0x33User Confirmation Request eventSSP配对方式用户确认请求
0x36Simple Pairing Complete eventSSP配对完成

控制器错误码

在蓝牙 HCI (Host Controller Interface) 协议中,Controller Error Code (或通常称为 Status) 是蓝牙控制器(通常是蓝牙芯片)向主机(运行蓝牙协议栈的处理器)报告操作结果或当前状态的一种机制。它们用于指示一个请求的操作是否成功完成,或者如果失败了,失败的具体原因是什么。

Error CodeName (名称)Description (描述)
0x00Success操作成功完成。
0x01Unknown HCI Command控制器不识别主机发送的HCI命令。
0x02Unknown Connection Identifier命令中指定的连接句柄无效或不存在。
0x03Hardware Failure控制器(蓝牙芯片)发生硬件故障。
0x04Page Timeout尝试连接(Paging)远端设备时,在规定时间内未收到响应。
0x05Authentication Failure认证失败,通常在配对过程中因为PIN码或密钥不匹配导致。
0x06PIN or Key Missing需要PIN码或链路密钥,但本地设备没有存储。
0x07Memory Capacity Exceeded控制器内存不足,无法完成请求的操作。
0x08Connection Timeout现有连接的链路监管超时(Link Supervision Timeout)已过期,连接已断开。
0x09Connection Limit Exceeded控制器已达到其支持的最大连接数,无法建立新连接。
0x0ASynchronous Connection Limit To A Device Exceeded尝试与一个设备建立的同步连接(SCO/eSCO)数量超出了限制。
0x0BACL Connection Already Exists尝试与一个已经存在ACL连接的设备再次建立ACL连接。
0x0CCommand Disallowed由于控制器当前的状态,该命令不被允许执行。
0x0DConnection Rejected due to Limited Resources连接被远端设备拒绝,因为其资源有限(如内存、连接数已满)。
0x0EConnection Rejected Due To Security Reasons连接被远端设备拒绝,因为安全原因(如认证/加密要求未满足)。
0x0FConnection Rejected due to Unacceptable BD_ADDR连接被远端设备拒绝,因为它不接受来自本设备蓝牙地址(BD_ADDR)的连接。
0x10Connection Accept Timeout Exceeded主机接受连接的超时时间已过,连接自动失败。
0x11Unsupported Feature or Parameter Value主机请求的功能或参数值不被控制器支持。
0x12Invalid HCI Command ParametersHCI命令的参数无效(如长度错误、范围超限)。
0x13Remote User Terminated Connection远端用户主动终止了连接。
0x14Remote Device Terminated Connection due to Low Resources远端设备因资源不足而终止了连接。
0x15Remote Device Terminated Connection due to Power Off远端设备关机导致连接终止。
0x16Connection Terminated By Local Host连接由本地主机主动终止。
0x17Repeated Attempts由于重复尝试,操作失败(例如在认证过程中)。
0x18Pairing Not Allowed设备不允许配对。
0x19Unknown LMP PDU收到了一个未知的或格式不正确的LMP(链路管理协议)数据包。
0x1AUnsupported Remote Feature / Unsupported LMP Feature远端设备不支持请求的功能。
0x1BSCO Offset Rejected请求的SCO偏移量被拒绝。
0x1CSCO Interval Rejected请求的SCO间隔被拒绝。
0x1DSCO Air Mode Rejected请求的SCO空中模式(Air Mode)被拒绝。
0x1EInvalid LMP ParametersLMP数据包中的参数无效。
0x1FUnspecified Error未指定的通用错误。
0x20Unsupported LMP Parameter ValueLMP数据包中的参数值不被支持。
0x21Role Change Not Allowed不允许进行主从角色切换。
0x22LMP Response Timeout等待远端设备的LMP响应超时。
0x23LMP Error Transaction Collision发生了LMP事务冲突。
0x24LMP PDU Not Allowed在当前状态下不允许发送该LMP PDU。
0x25Encryption Mode Not Acceptable请求的加密模式不可接受。
0x26Link Key Can Not be Changed链路密钥无法被更改。
0x27Requested QoS Not Supported请求的服务质量(QoS)不被支持。
0x28Instant Passed一个即时(Instant)已经过去,无法在指定的时间点执行操作。
0x29Pairing With Unit Key Not Supported不支持使用单元密钥(Unit Key)进行配对。
0x2ADifferent Transaction Collision两个不同的LMP事务发生冲突。
0x2BReserved保留值,未使用。
0x2CQoS Unacceptable ParameterQoS参数不可接受。
0x2DQoS RejectedQoS请求被拒绝。
0x2EChannel Classification Not Supported不支持信道分类。
0x2FInsufficient Security当前链路的安全级别不足以执行请求的操作。
0x30Parameter Out Of Mandatory Range参数超出了强制要求的范围。
0x31Reserved保留值,未使用。

http://www.dtcms.com/a/475920.html

相关文章:

  • Java接入火山引擎快速体验
  • 求一个dw做的网站企业网站建设资金预算表
  • 企业 网站备案 法人购物网站前台模板
  • 58同城盐城网站建设网站建设违约责任
  • asp网站上传重庆网站建设leco tec
  • 要服务网站建设wordpress顶部加横幅
  • 自己怎么做返利网站什么软件做美食视频网站
  • 企业品牌网站建设怎么做宁夏省住房城乡建设厅网站
  • 分享影视资源的网站怎么做青岛网站建设选圣城
  • 雄安微网站开发北京做网站设计公司
  • 营销网站建设企业asp网站安全怎么做
  • 建设银行网站官网h5设计是什么
  • 个人网站维护费用百度知道怎么赚钱
  • 官方网站如何建设网址导航建站
  • 手机网站制作公司报价wordpress 社交网站吗
  • 自己买服务器能在wordpress建网站国外校园网站建设分析
  • 网站建设 参照 标准规范网页制作与设计先学什么
  • 免费中英文网站模板重庆设计有限公司
  • 青岛网站建设推广公司哪家好莆田网站建设费用
  • 做经营行网站需要什么wordpress 设置网站目录
  • 云南凡科建站哪家好免费2级域名注册
  • 网站设计师介绍wordpress如何做301跳转
  • html在线编辑网站备案 网站建设计划书
  • 王也头像高清帅气seo短视频网页入口引流推广
  • 做网站的整体风格确定方式产品设计招聘网站
  • 做网站备案照片的要求如何用凡科网建立一个网站
  • 做网站公司北京缙云网站建设
  • 怎么样自己创建网站怎么做网站外推
  • 网站打不开了什么原因企业网站建设457
  • Kotlin 异步数据流三剑客:Flow、Channel、StateFlow 深度解析