Skip to content

HCI连接相关Command及Event

🕒 Published at: a year ago

写在前面

本文基于Bluetooth Core Specification 5.3。分类参考Bluetooth Core Specification 4.2。
命令和事件不是完整的, 只是列举了一些常见的。

通用的Event

Event描述
HCI_Command_Complete用于传递每个HCI命令的返回状态和其他事件参数。
HCI_Command_Status用于表明根据Command_Opcode参数所描述的命令已经被接收,并且控制器正在执行此命令的任务。
HCI_Hardware_Error用于表明硬件的一些类型失败.

设备设置

Command描述
HCI_Reset对于BR/EDR Controller, 重置HCI, Link Manager, Bluetooth radio. 对于LE Controller, 重置HCI, the Link Layer, and LE PHY. 通常Android设备开关蓝牙会调用此命令, 也会重置HCI的log文件.

Controller信息

这组的命令用于Host发现有关本地设备的信息。

Command描述
HCI_Read_Local_Version_Information读取当前Controller的版本信息. 返回参数包含HCI版本等.
HCI_Read_Local_Supported_Commands读取当前Controller支持的命令.
HCI_Read_Local_Supported_Features读取本地设备支持的特性.
HCI_Read_Local_Extended_Features读取本地设备支持的拓展特性.
HCI_Read_BD_ADDR读取本地设备地址.
HCI_LE_Read_Local_Supported_Features读取本地Controller支持的LE特性
HCI_LE_Read_ Supported_States读取本地LE Controller当前支持状态和角色组合.

Controller配置

这组命令和事件用于配置全局的配置参数.

类型名称描述
CommandHCI_Read_Local_Name读取用户友好的设备名称, 通常就是Android设备展示的蓝牙名称
CommandHCI_Write_Local_Name修改用户友好的设备名称.
CommandHCI_Read_Class_of_Device读取设备类配置参数值, 值用于向其他设备表示本地设备的功能.
CommandHCI_Write_Class_of_Device写入设备类配置参数值.
CommandHCI_Read_Scan_Enable读取Scan_Enable配置参数值, 该参数控制BR/EDR Controller是否定期(period)扫描其他BR/EDR控制器发送的连接(page)尝试和/或查询(inquiry)请求.
CommandHCI_Write_Scan_Enable配置Scan_Enable参数.
CommandHCI_Read_Extended_Inquiry_Response读取BR/EDR Controller在查询(inquiry)响应期间发送的扩展查询(inquiry)响应数据包中的数据。
CommandHCI_Write_Extended_Inquiry_Response写入在查询(inquiry)响应期间发送的扩展查询(inquiry)响应数据包中的数据。

设备发现

这组commands和events允许设备发现周围的设备.

类型名称描述
CommandHCI_Inquiry使本地设备进入Inquiry模式, 用于查询周围的设备
CommandHCI_Inquiry_Cancel取消查询, 通常Android设备在进行连接前会取消查询, 因为查询操作是一个比较耗时操作.
EventHCI_Inquiry_Result查询结果事件, 通常包含远程设备的地址, 设备类等
EventHCI_Extended_Inquiry_Result拓展的查询结果
EventHCI_Inquiry_Complete表示查询结束
EventHCI_Inquiry_Result_with_RSSI表示在查询的过程有一个或多个BR/EDR Controller做出了回应.
CommandHCI_Periodic_Inquiry_Mode配置BR/EDR Controller进行基于特定周期范围的自动查询。
CommandHCI_Exit_Periodic_Inquiry_Mode在当前设备处于Period Inquiry Mode时退出该模式
CommandHCI_Read_Inquiry_Scan_Activity读取Inquiry_Scan_Interval和Inquiry_Scan_Window配置参数值。
CommandHCI_Write_Inquiry_Scan_Activity设置Inquiry_Scan_Interval和Inquiry_Scan_Window配置参数值。
CommandHCI_Read_Inquiry_Scan_Type读取Inquiry_Scan_Type配置参数值,该值用于设置normal/interlaced扫描。
CommandHCI_Write_Inquiry_Scan_Type设置Inquiry_Scan_Type配置参数值。
CommandHCI_Read_Inquiry_Mode读取Inquiry_Mode配置参数值
CommandHCI_Write_Inquiry_Mode写入Inquiry_Mode配置参数值

连接建立

这组命令和事件用于在设备间建立连接。

类型名称描述
CommandHCI_Create_Connection尝试创建与一个给定BR_ADDR的远程设备间的ACL连接
EventHCI_Connection_Request表示正在尝试建立新传入的BR/EDR连接
CommandHCI_Accept_Connection_Request接受新传入的BR/EDR连接请求
CommandHCI_Reject_Connection_Request拒绝新传入的BR/EDR连接请求
CommandHCI_Create_Connection_Cancel请求取消正在进行的创建连接操作
EventHCI_Connection_Complete表示已经建立了新的连接, 连接建立后将会返回一个Connection_Handle标识这个连接
CommandHCI_Disconnect终止已经存在的连接(BR/EDR或LE)
EventHCI_Disconnection_Complete发生于一个连接已经终止时
CommandHCI_Read_Page_Timeout读取Page_Timeout配置参数,该参数表示等待远程设备响应的最大时间
CommandHCI_Write_Page_Timeout写入Page_Timeout配置参数
CommandHCI_Read_Page_Scan_Activity读取Page_Scan_Interval和Page_Scan_Window参数
CommandHCI_Write_Page_Scan_Activity设置Page_Scan_Interval和Page_Scan_Window参数
CommandHCI_Read_Page_Scan_Type读取Page Scan类型:normal或interlaced
CommandHCI_Write_Page_Scan_Type设置Page Scan类型
CommandHCI_Read_Connection_Accept_Timeout读取Connection_Accept_Timeout配置参数
CommandHCI_Write_Connection_Accept_Timeout设置Connection_Accept_Timeout配置参数
CommandHCI_Read_Hold_Mode_Activity读取Hold_Mode_Activity参数值, 该参数表示在Hold Mode下哪些活动需要挂起
CommandHCI_Write_Hold_Mode_Activity设置Hold_Mode_Activity参数值

远程信息

这组命令和事件用于发现远程设备的信息.

类型名称描述
CommandHCI_Remote_Name_Request读取远程设备的名称
CommandHCI_Remote_Name_Request_Cancel取消读取远程设备名称
EventHCI_Remote_Name_Request_Complete读取远程设备名称完成事件
CommandHCI_Read_Remote_Supported_Features读取远程设备支持的特性
EventHCI_Read_Remote_Supported_Features_Complete返回远程设备支持的特性
CommandHCI_Read_Remote_Extended_Features读取远程设备支持的拓展特性
EventHCI_Read_Remote_Extended_Features_Complete返回远程设备支持的拓展特性
CommandHCI_Read_Remote_Version_Information读取远程设备版本信息
EventHCI_Read_Remote_Version_Information_Complete返回远程设备版本信息

连接状态

这组命令和事件用于链接配置,主要是支持低电量操作

类型名称描述
EventHCI_Mode_Change表示mode改变,有三种mode: Active mode, Hold mode, Sniff mode
CommandHCI_Hold_Mode切换为Hold mode
CommandHCI_Sniff_Mode切换为Sniff mode
CommandHCI_Sniff_Subrating为本地设备配置sniff子速率参数
EventHCI_Sniff_Subrating通知host本地和远程的发送和接受延迟情况
CommandHCI_Exit_Sniff_Mode退出Sniff mode
CommandHCI_Park_State改变Link manager行为, 使用本地或远程设备处于park状态
CommandHCI_Exit_Park_State退出park状态进入激活模式
CommandHCI_Read_Link_Policy_Settings读取Link Policy设置参数
CommandHCI_Write_Link_Policy_Settings设置Link Policy设置参数
CommandHCI_Read_Default_Link_Policy_Settings读取默认的Linck Policy设置参数
CommandHCI_Write_Default_Link_Policy_Settings设置默认的Linck Policy设置参数

Piconet结构

这组命令和事件用于查看和重新配置一个Piconet

类型名称描述
CommandHCI_Role_Discovery用于host确定设备在特定的Connection_Handle上所扮演的角色
CommandHCI_Switch_Role切换连接角色
EventHCI_Role_Change表示角色已经切换

这组命令和事件用于配置physical link

类型名称描述
CommandHCI_Read_Link_Supervision_Timeout读取设备的Link Supervision Time配置参数的值. Controller使用该参数来确定链路丢失
CommandHCI_Write_Link_Supervision_Timeout配置Link Supervision Time配置参数
EventHCI_Link_Supervision_Timeout_Changed表示Link Supervision Time改变

Flow Control

类型名称描述
CommandHCI_Host_Buffer_Size用于host通知Controller HCI ACL和同步数据包的数据部分的最大值(从Controller发向host)
CommandHCI_Set_Event_Mask控制HCI应当为Host生成那些事件
CommandHCI_Set_Event_Filter用于host指定不同的事件过滤器

认证和加密

这组命令和事件用于设备间的认证以及连接加密.

类型名称描述
CommandHCI_Read_Authentication_Enable读取Authentication_Enable参数
CommandHCI_Write_Authentication_Enable写入Authentication_Enable参数
EventHCI_Link_Key_Request表示与指定BD_ADDR的设备连接需要link key
CommandHCI_Link_Key_Request_Reply用于回复Controller发起的Link Key请求事件,并指定Host存储的Link Key作为与其他由BD_ADDR指定的BR/EDR控制器连接的link key.
CommandHCI_Link_Key_Request_Negative_Reply用于回复Controller发起的Link Key请求事件, 表示Host并没有存储对应设备的Link Key
EventHCI_PIN_Code_Request表示需要pin code去创建一个新的link key
CommandHCI_PIN_Code_Request_Reply回复Pin Code请求事件, 并指定连接所用的pin code
CommandHCI_PIN_Code_Request_Negative_Reply回复Pin Code请求事件, 表示无法为连接指定pin code
EventHCI_Link_Key_Notification表示为连接已经创建了一个新的link key
CommandHCI_Authentication_Requested用于在两个关联设备之间建立认证
EventHCI_Authentication_Complete表示指定连接的认证已经完成
CommandHCI_Set_Connection_Encryption用于开启和关闭link级加密
EventHCI_Encryption_Change表示加密模式已经改变
CommandHCI_Change_Connection_Link_Key用于强制连接的两个设备生成新的link key
EventHCI_Change_Connection_Link_Key_Complete表示已完成link key修改
CommandHCI_Read_PIN_Type读取Pin type配置
EventHCI_Write_PIN_Type写入Pin type配置
CommandHCI_Read_Stored_Link_Key读取一个或多个存储在Controller的link key
EventHCI_Return_Link_Keys返回HCI_Read_Stored_Link_Key读取的link key
CommandHCI_Write_Stored_Link_Key写入一个或多个link key到Controller
CommandHCI_Delete_Stored_Link_Key删除一个或多个存在Controller的link key
CommandHCI_IO_Capability_ Request_Reply回复Controller的IO Capability Request事件, 并指定当前Host的I/O能力
EventHCI_IO_Capability_Request表示在simple pairing过程中需要Host的I/O能力
EventHCI_IO_Capability_Response表示收到远程设备的I/O能力
CommandHCI_User_Confirmation_Request_Reply回复User Confirmation Request事件, 表示用户选择了 "是"
CommandHCI_User_Confirmation_Request_Negative_Reply回复User Confirmation Request事件, 表示用户选择了 "否"
EventHCI_User_Confirmation_Request表示用户需要确认数值的内容
CommandHCI_User_Passkey_Request_Reply回复User Passkey Request事件, 并携带用户输入的数值(passkey)用于SSP(Secure Simple Pairing)
CommandHCI_User_Passkey_Request_Negative_Reply回复User Passkey Request事件, 表示主机端无法提供passkey
EventHCI_User_Passkey_Request表示passkey需要作为SSP的一部分
EventHCI_User_Passkey_Notification向Host提供用于给用户展示的passkey
CommandHCI_Read_Simple_Pairing_Mode读取Simple Pairing Mode参数
CommandHCI_Write_Simple_Pairing_Mode写入Simple Pairing Mode参数
EventHCI_Keypress_Notification收到passkey通知后返回Host事件
CommandHCI_IO_Capability_Request_Negative_Reply用于在Host接收到HCI IO Capability Request事件后, 拒绝配对尝试
CommandHCI_Read_Encryption_Key_Size读取当前加密key的大小

HCI配置参数

Scan_Enable

控制BR/EDR Controller是否定期(period)扫描其他BR/EDR控制器发送的连接(page)尝试和/或查询(inquiry)请求. 即设备是否可被查询扫描到或者连接扫描到.

取值:

  • 0x00 No Scans enabled. Default.
  • 0x01 Inquiry Scan enabled. Page Scan disabled.
  • 0x02 Inquiry Scan disabled. Page Scan enabled.
  • 0x03 Inquiry Scan enabled. Page Scan enabled.

Inquiry_Scan_Interval

定义连续查询扫描间的时间间隔. 从上一次查询扫描开始到下一次查询扫描开始之间的时间间隔.

Inquiry_Scan_Window

定义一次查询扫描的持续时长. 所以Inquiry_Scan_Window不能超过Inquiry_Scan_Interval.

Inquiry_Scan_Type

表示查询扫描是否使用interlaced查询扫描:

  • 0x00 Mandatory: Standard Scan (default)
  • 0x01 Optional: Interlaced Scan

在标准的查询扫描下, 蓝牙设备仅发送查询扫描请求并等待其他设备的查询响应.
在interlaced查询扫描下, 蓝牙设备会在扫描查询响应和监听其他设备的查询请求间交替.

Inquiry_Mode

表示查询结果事件的返回数据格式. 有以下几种:

  • 0x00 Standard Inquiry Result event format
    • 标准的查询结果事件格式
    • 携带远程设备的一些基础信息: 蓝牙地址, 设备类
  • 0x01 Inquiry Result format with RSSI
    • RSSI: Received Signal Strength Indication 接收信号强度指示
    • 除了标准的信息外, 还携带远程设备的信号强度
  • 0x02 Inquiry Result with RSSI format or Extended Inquiry Result format
    • 除了标准的信息外, 还携带一些额外的信息, 如: 设备名称, 支持的服务等

Page_Timeout, Extended_Page_Timeout

Page_Timeout和Extended_Page_Timeout一起定义了本地Link Manager等待远程设备响应连接尝试(本地设备发起的连接尝试)的最长时间. 如果超过改时间还未接收到响应, 那么此次连接尝试将被视为失败.

Connection_Accept_Timeout参数

该参数允许Controller在经过指定的时间段后自动拒绝连接(如果新的连接未被接受)。 时间是从BR/EDR控制器发送HCI_Connection_Request事件或LE控制器发送HCI_LE_CIS_Request事件起,直到控制器自动拒绝传入连接的持续时间。

Page_Scan_Interval

定义连续连接扫描间的时间间隔. 从上一次连接扫描开始到下一次连接扫描开始之间的时间间隔.

Page_Scan_Window

定义一次连接扫描的持续时长. 所以Page_Scan_Window不能超过Page_Scan_Interval.

Page_Scan_Type

表示连接扫描是否使用interlaced扫描:

  • 0x00 Mandatory: Standard Scan (default)
  • 0x01 Optional: Interlaced Scan

PIN_Type

PIN: Personal Identification Number 决定了Link Manager是否假设主机支持可变的PIN码或固定的PIN码. 在配对过程中, Controller会使用PIN_Type的信息.

取值:

  • 0x00 Variable PIN.
  • 0x01 Fixed PIN.

Controller可以为其他BR/EDR Controller存储有限数量的Link key, Link key用于两个Controller之间的所有安全事务. Link key与设备的BR_ADDR相关联.

Authentication_Enable

控制本地设备在建立连接时(在HCI_Create_Connection或接受传入的ACL连接和Connection Complete event之间)是否需要对远程设备进行身份认证. 在连接建立时,只有启用了Authentication_Enable参数的设备才会尝试对其他设备进行身份验证.

  • 0x00 Authentication not required.
  • 0x01 Authentication required for all connections.
  • 0x02-0xFF Reserved

Hold_Mode_Activity

用于确定在BR/EDR控制器处于保持模式时应暂停哪些活动.

  • 0x00 Maintain current Power State.
  • 0x01 Suspend Page Scan.
  • 0x02 Suspend Inquiry Scan.
  • 0x04 Suspend Periodic Inquiries.
  • 0x08-0xFF Reserved for future use.

Link_Policy_Settings参数决定本地Link Manager在收到来自远程Link Manager的请求或者自身确定要改变角色,进入Hold或Sniff模式时的行为.

  • 0x0000 Disable All LM Modes.
  • 0x0001 Enable Role Switch.
  • 0x0002 Enable Hold Mode.
  • 0x0004 Enable Sniff Mode.
  • 0x0008 Enable Park State.
  • 0x0010 – 0x8000 Reserved for future use.

用于Controller监视链路丢失情况.如果由于任何原因,Connection_Handle未接收到数据包的持续时间超过Link_Supervision_Timeout设定的时间,连接将会断开.

Class_Of_Device

用于向其他设备表明本地设备具有的能力.

Supported_Commands

列举本地Controller支持的HCI命令.