【0x0001】HCI_Inquiry命令详解

目录

一、命令概述

1.1. 返回事件说明

1.2. 设备报告规则

二、命令格式及参数

2.1. HCI_Inquiry命令格式

2.2. LAP参数

2.3. Inquiry_Length

2.4. Num_Responses

三、响应事件

3.1. HCI_Command_Status 事件

3.2. HCI_Inquiry_Result, HCI_Inquiry_Result_with_RSSI, 或 HCI_Extended_Inquiry_Result 事件

3.3. HCI_Inquiry_Complete 事件

四、命令执行流程

4.1. 命令发起阶段

4.2. 查询执行阶段

4.3. 查询结束阶段

4.4. 示例代码

五、应用场景

5.1. 蓝牙设备发现与配对

5.2. 蓝牙设备网络组建与管理

5.3. 蓝牙设备定位与追踪(基于信号强度)

5.4. 蓝牙设备兼容性检测与识别

5.5. 其他应用场景

六、注意事项

6.1. 参数设置

6.2. 事件过滤

6.3. 信号干扰与环境因素

6.4. 设备兼容性与蓝牙协议版本

6.5. 安全性

6.6. 命令执行顺序和时机

6.7. 事件处理

6.8. 硬件和资源限制


HCI_Inquiry命令是蓝牙主机控制器接口(HCI)中的一个重要命令,它允许蓝牙设备(称为主设备或Master)搜索其通信范围内的其他蓝牙设备(称为从设备或Slave)。该命令通过发送查询请求来主动发现附近的蓝牙设备,并等待这些设备响应查询。

一、命令概述

HCI_Inquiry命令用于启动蓝牙设备的查询过程,以便发现周围的蓝牙设备。该命令需要设置一些参数,如查询接入码(LAP)、查询时长(inquiry_length)和响应设备数量(num_response)等。

  • LAP : 该参数包含用于生成查询访问码(IAC)的LAP值。在BR/EDR蓝牙技术中,LAP用于标识蓝牙设备或设备组。
  • Inquiry_Length (查询长度): 与Extended_Inquiry_Length相加,指定查询模式的总持续时间。当此时间到期时,查询将停止。
  • Num_Responses (响应数量): 指定在查询停止之前可以接收的响应数量。

1.1. 返回事件说明

在查询过程中,如果附近的BR/EDR控制器响应了查询请求,那么BR/EDR控制器将向主机发送以下事件之一来报告响应的详细信息:

  • HCI_Inquiry_Result:报告附近BR/EDR控制器的基本信息,如设备地址和类。
  • HCI_Inquiry_Result_with_RSSI:除了基本信息外,还报告接收信号强度指示(RSSI)值,这有助于了解设备的相对距离或信号质量。
  • HCI_Extended_Inquiry_Result:提供比标准查询结果更详细的信息,包括扩展的查询响应数据,如设备名称、服务类等。

查询模式结束时,BR/EDR控制器会向主机发送HCI_Inquiry_Complete事件,以报告查询已结束。

1.2. 设备报告规则

在查询期间或查询周期内,如果一个设备响应了查询,并且该设备在当前查询或查询周期内之前未被报告过,同时也没有被使用HCI_Set_Event_Filter命令过滤掉,那么BR/EDR控制器应该始终在HCI_Inquiry_ResultHCI_Inquiry_Result_with_RSSIHCI_Extended_Inquiry_Result事件中报告该设备给主机。

如果设备在当前查询或查询周期内之前已被报告过,那么是否再次报告将取决于具体实现。例如,是否已在BR/EDR控制器中保存了早期结果,以及保存了多少响应。为了避免重复报告,建议BR/EDR控制器在查询或查询周期内只报告特定设备一次。

二、命令格式及参数

2.1. HCI_Inquiry命令格式

HCI_Inquiry命令通常遵循蓝牙核心规范中定义的HCI(Host Controller Interface,主机控制器接口)指令格式。

一个完整的 HCI_Inquiry 命令包含命令头(Command Opcode)和命令参数(Command Parameters)两部分。 

  • 命令头(Command Opcode)
    • 长度和位置:命令头的长度固定为 2 字节。它位于命令的最前端,是主机发送给蓝牙控制器的第一个信息部分,用于标识命令的类型。

    • 组成和含义:命令头又分为两个部分:操作码(Opcode)和操作码组(Opcode Group)。其中,操作码用于唯一确定具体的命令,在 HCI_Inquiry 命令中,它有一个特定的值来表示这是一个查询命令。操作码组则用于对命令进行分类,例如所有的查询相关命令可能会属于同一个操作码组。

  • 命令参数(Command Parameters):
    • 长度和内容变化:命令参数的长度根据具体的查询要求和蓝牙协议版本等因素而变化。它包含了与查询操作相关的各种参数,这些参数用于控制查询的范围、时长、设备类型等多个方面。
    • 常见参数:
      • Inquiry Length:查询持续时间,以1.28秒的倍数表示。例如,如果设定值为10,则实际持续时间为12.8秒。
      • Num_Responses:期望的最大响应数。这个参数指定了主设备希望在查询过程中接收到的最大设备响应数。
      • Inquiry Mode:查询模式,决定了查询结果的详细程度和格式。常见的查询模式包括标准查询模式(可能不包含RSSI或EIR信息)、带RSSI的查询模式(包含设备信号强度信息)以及RSSI和EIR查询模式(同时包含设备信号强度和扩展查询响应信息)。

2.2. LAP参数

在蓝牙的底层通信机制中,接入码用于同步和识别通信链路。LAP 提供了一种自定义或指定接入码的方式,使得查询过程能够在特定的范围内(由 LAP 定义的逻辑范围内)准确地发现目标设备。

  • 取值范围(Range):从 0x9E8B00 到 0x9E8B3F 之间。意味着在实际使用该参数进行蓝牙设备查询相关操作时,所设定的具体值必须落在这个规定的十六进制数值区间内。
  • Size: 3 octets(大小:3字节):表示LAP参数由3个字节(或24位)组成,每个字节由8位(1个octet=1字节)构成。
  • LAP在蓝牙技术中的作用:
    • 作为接入点:LAP充当蓝牙设备和局域网之间的桥梁,允许蓝牙设备通过LAP接入局域网并享受其提供的服务。
    • 安全鉴权:在蓝牙设备通过LAP接入局域网之前,需要进行安全鉴权过程,以确保只有授权的设备才能接入网络。
    • 服务发现:蓝牙设备通过LAP可以查询并发现局域网中可用的服务,从而选择所需的服务进行连接和数据传输。

2.3. Inquiry_Length

Inquiry_Length参数允许设备在查询其他蓝牙设备时,根据需求调整查询的时间长度。如果设置的时间较长,设备将有更多的时间来发现和响应其他设备,但也可能导致查询过程耗时较长。相反,如果设置的时间较短,查询过程将更快,但可能无法发现所有可用的设备。在实际应用中,根据使用场景和设备的需求,可以调整这个参数的值,以达到最佳的查询效果和效率。

  • N:这是一个十六进制值(0xXX),表示可以添加到扩展查询长度上的最大时间量。
  • 范围:N的值从0x01到0x30。
  • 时间:N的值乘以1.28秒,得到的时间范围是从1.28秒到61.44秒

2.4. Num_Responses

在蓝牙设备执行查询周边其他 BR/EDR 控制器的操作时,“Num_Responses” 参数为使用者提供了一种灵活调控查询结果规模的手段。通过合理设置该参数,能够在满足不同的资源限制、查询目的等实际需求的基础上,更加精准地控制查询过程以及获取到合适数量的周边设备响应信息,有助于提高蓝牙设备查询操作的效率和针对性。

  • 0x00:表示查询过程中不限制响应的数量,即可以接收无限多的响应。
  • 0xXX(其中XX为1到FF之间的十六进制数):表示查询过程中可以接收的最大响应数量。一旦达到这个数量,查询过程将被中止。
  • 范围:从0x01到0xFF,即1到255。意味着可以设置的最大响应数量是255。

在实际应用中,这个参数的设置取决于设备的需求和查询的目的。如果希望尽可能多地发现周围的蓝牙设备,可以将此参数设置为0x00(无限制)。但是,如果设备资源有限或只需要发现一定数量的设备,就可以设置一个具体的数值来限制响应的数量,从而节省资源和时间。

需要注意的是,即使设置了响应数量的限制,如果查询过程中没有其他设备响应或响应的设备数量少于设置的限制,查询仍然会在达到其他中止条件(如查询时间超时)时被中止。

三、响应事件

在执行HCI_Inquiry命令后,会有一系列特定的事件按照相应规则从 BR/EDR 控制器发送到主机(Host)。

3.1. HCI_Command_Status 事件

当 BR/EDR 控制器启动了查询(Inquiry)过程后,就会向主机发送 HCI_Command_Status 事件。

这个事件相当于一个反馈信号,告知主机对应的查询命令已经开始被执行,主机可以借此确认操作的启动情况,以便后续依据此状态进行相应的流程处理或者等待后续其他事件的到来。

3.2. HCI_Inquiry_Result, HCI_Inquiry_Result_with_RSSI, 或 HCI_Extended_Inquiry_Result 事件

  • 触发条件:只要周边的 BR/EDR 控制器对查询(Inquiry)消息做出了响应,并且没有对这些事件进行过滤(unless filtered),那么就会针对每个做出响应的 BR/EDR 控制器分别创建对应的事件。这里有三种不同类型的事件,各自特点如下:
    • HCI_Inquiry_Result:用于向主机反馈做出响应的 BR/EDR 控制器的基本相关信息,例如设备的一些标识等基础数据,帮助主机知晓有哪些设备在此次查询范围内做出了回应。
    • HCI_Inquiry_Result_with_RSSI:相比 HCI_Inquiry_Result,此事件除了包含基本的响应设备信息外,还额外附带了接收信号强度指示(RSSI,Received Signal Strength Indication)信息。RSSI 信息对于主机进一步判断设备与自身的距离远近、信号强弱等情况非常有帮助,可辅助后续诸如设备选择、连接优先级判断等操作。
    • HCI_Extended_Inquiry_Result:同样也是用于反馈响应设备相关信息,不过它可能包含比前两者更详细或者扩展的一些数据内容,具体取决于蓝牙协议在这方面的具体定义和实现要求,也是为了让主机能更全面地了解响应设备的情况。

  • 合并情况:另外需要注意的是,多个对查询消息做出响应的 BR/EDR 控制器,有可能会被合并到同一个上述类型的事件中进行反馈,具体的合并规则和机制可能会依据蓝牙协议的详细设定以及设备实现情况有所不同,但总体目的是为了更高效地向主机传达响应设备的相关信息,避免过多零散的事件发送造成不必要的资源消耗和处理复杂度提升。

3.3. HCI_Inquiry_Complete 事件

当整个查询(Inquiry)过程全部完成后,就会生成 HCI_Inquiry_Complete 事件。这个事件用于告知主机查询操作已经结束,主机接收到此事件后便可以知晓此次查询的最终状态,例如可以根据是否收到了期望数量的响应、整个查询过程是否正常结束等情况来决定后续的动作,比如是否需要重新发起查询或者基于已获取的响应设备信息进行下一步的连接等相关操作。

在实际应用中,这些事件对于蓝牙设备的发现和管理至关重要。通过监听这些事件,主机可以了解周围蓝牙设备的存在、获取它们的详细信息,并据此执行进一步的连接或通信操作。同时,通过设置适当的过滤条件,主机可以控制哪些设备的信息被接收和处理,从而优化资源使用和性能。

四、命令执行流程

HCI_Inquiry 命令执行涉及主机、蓝牙控制器以及周边被查询的蓝牙设备之间的交互协作,通过一系列步骤完成蓝牙设备的查询操作,从参数设置开始,到最终查询结束并通知主机相关结果,各环节紧密相连。以下是蓝牙HCI_Inquiry命令执行流程的详细梳理。

4.1. 命令发起阶段

  • 主机设置查询参数
    • 主机通过HCI(Host Controller Interface)层向蓝牙控制器发送HCI_Inquiry命令。
    • 命令中附带必要的参数,包括LAP、Inquiry_Length)和Num_Responses。
  • 控制器接收并校验命令
    • 蓝牙控制器接收到HCI_Inquiry命令后,首先进行内部初始化操作。
    • 校验命令的合法性和参数的有效性。
  • 控制器准备进入查询模式
    • 如果命令和参数都符合要求,控制器准备进入查询模式。
    • 向主机发送HCI_Command_Status事件,告知主机查询过程已经开始启动。

4.2. 查询执行阶段

  • 控制器进入查询模式
    • 根据命令参数,控制器进入查询模式,开始向外发送查询消息。
    • 查询消息中包含根据LAP派生出来的查询接入码,用于发现附近的其他蓝牙设备。
  • 被查询设备响应
    • 处于查询扫描模式的蓝牙设备监听查询消息。
    • 当接收到查询消息时,符合响应条件的设备会向发起查询的控制器发送响应消息。
  • 控制器接收响应并生成事件
    • 控制器根据Num_Responses参数判断是否接收响应。
    • 对于每个接收到的响应(且未被过滤),控制器生成相应的事件,如HCI_Inquiry_Result、HCI_Inquiry_Result_with_RSSI或HCI_Extended_Inquiry_Result事件。
    • 这些事件包含响应设备的详细信息,如设备地址、设备类型、RSSI等。
  • 主机接收并处理事件
    • 主机接收到这些事件后,解析出被查询设备的信息。
    • 将设备信息存储在查询数据库中,以便后续操作。

4.3. 查询结束阶段

  • 判断查询结束条件
    • 查询过程持续进行,直到满足结束条件。
    • 结束条件包括查询时长耗尽(根据Inquiry_Length计算)或接收到的响应数量达到Num_Responses设定的值(如果不是0x00的话)。
  • 控制器发送完成事件
    • 当查询结束后,控制器向主机发送HCI_Inquiry_Complete事件。
    • 该事件告知主机查询模式已经结束。
  • 主机处理完成事件
    • 主机接收到HCI_Inquiry_Complete事件后,知道整个查询过程已经完成。
    • 可以根据之前接收到的响应设备信息进行后续操作,如尝试与某个设备建立连接或进行其他蓝牙通信相关操作。

这个流程涵盖了从主机发起查询命令到查询结束并处理响应的整个过程,是蓝牙设备发现机制的核心部分。

4.4. 示例代码

以下示例代码将是一个高度概括和简化的版本,旨在展示基本的流程框架。请注意,以下代码并不完整,也不包含实际的蓝牙通信代码,因为那将涉及大量的底层细节和特定的硬件接口。此外,为了简化,示例中省略了错误处理和资源管理代码。

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>// 假设这些是蓝牙库提供的函数和类型定义(实际使用时需要替换为实际的蓝牙库)
typedef struct {uint8_t LAP[3];          // Local Access Pointuint16_t Inquiry_Length; // Inquiry duration in units of 1.28 secondsuint8_t Num_Responses;   // Maximum number of responses to receive
} HCI_Inquiry_Command_Params;typedef struct {uint8_t Event_Code;      // Event code indicating the type of eventuint8_t Num_Responses;   // Number of responses in this event// 假设这里还有其他字段,比如设备地址、设备类型、RSSI等// 这些字段在实际应用中会根据具体事件类型有所不同
} HCI_Event;// 假设这是蓝牙控制器句柄(实际使用时需要替换为实际的蓝牙控制器句柄)
typedef void* BluetoothControllerHandle;// 假设这是发送HCI命令的函数(实际使用时需要替换为实际的蓝牙库函数)
bool SendHCICommand(BluetoothControllerHandle handle, uint16_t OpCode, const void* Params, uint16_t ParamLen);// 假设这是接收HCI事件的回调函数(实际使用时需要替换为实际的蓝牙库回调函数)
typedef void (*HCI_EventCallback)(const HCI_Event* Event);// 假设这是注册HCI事件回调函数的函数(实际使用时需要替换为实际的蓝牙库函数)
bool RegisterHCIEventCallback(BluetoothControllerHandle handle, HCI_EventCallback Callback);// 示例代码:执行HCI_Inquiry命令
void ExecuteHCIInquiry(BluetoothControllerHandle handle, HCI_EventCallback callback) {// 设置查询参数HCI_Inquiry_Command_Params params = {.LAP = {0x33, 0x8B, 0x9E}, // 示例LAP值,实际使用中需要根据需要设置.Inquiry_Length = 8,       // 示例查询长度,8 * 1.28s = 10.24s.Num_Responses = 0xFF      // 接收无限制数量的响应};// 发送HCI_Inquiry命令if (!SendHCICommand(handle, 0x0401, &params, sizeof(params))) {// 命令发送失败,进行错误处理printf("Failed to send HCI Inquiry command\n");return;}// 注册HCI事件回调函数if (!RegisterHCIEventCallback(handle, callback)) {// 回调注册失败,进行错误处理printf("Failed to register HCI event callback\n");return;}// 此时,查询过程已经开始,等待回调函数被调用以处理接收到的事件// 注意:在实际应用中,这里通常会有一个事件循环来等待和处理蓝牙事件
}// 示例HCI事件回调函数
void OnHCIEvent(const HCI_Event* Event) {// 根据事件类型进行处理switch (Event->Event_Code) {case 0x02: // HCI_Inquiry_Result事件// 处理HCI_Inquiry_Result事件,解析设备信息printf("Received HCI Inquiry Result\n");break;case 0x03: // HCI_Inquiry_Result_with_RSSI事件// 处理HCI_Inquiry_Result_with_RSSI事件,解析设备信息和RSSIprintf("Received HCI Inquiry Result with RSSI\n");break;case 0x04: // HCI_Extended_Inquiry_Result事件// 处理HCI_Extended_Inquiry_Result事件,解析扩展的设备信息printf("Received HCI Extended Inquiry Result\n");break;case 0x05: // HCI_Inquiry_Complete事件// 查询过程结束,进行后续操作printf("HCI Inquiry Complete\n");// 这里可以添加代码来尝试与发现的设备建立连接等break;// 处理其他事件类型...default:printf("Received unknown HCI event\n");break;}
}int main() {// 假设这是获取蓝牙控制器句柄的函数(实际使用时需要替换为实际的蓝牙库函数)BluetoothControllerHandle handle = GetBluetoothControllerHandle();// 执行HCI_Inquiry命令ExecuteHCIInquiry(handle, OnHCIEvent);// 注意:在实际应用中,这里通常会有一个事件循环来等待和处理蓝牙事件// 由于这是一个示例,所以这里没有实现事件循环return 0;
}
  • 上述代码中的函数和类型定义(如SendHCICommandRegisterHCIEventCallbackBluetoothControllerHandle等)是假设的,实际使用时需要替换为实际的蓝牙库提供的函数和类型定义。

  • 示例代码中的GetBluetoothControllerHandle函数也是假设的,用于获取蓝牙控制器句柄。在实际应用中,这通常涉及初始化蓝牙库和控制器,并获取一个用于后续操作的句柄。

  • 示例代码中的事件回调函数OnHCIEvent根据事件类型进行了简单的处理。在实际应用中,这里需要根据具体需求来解析和处理接收到的蓝牙事件。

  • 由于蓝牙通信涉及底层硬件接口和复杂的协议栈实现,因此上述示例代码仅用于展示基本的流程框架。在实际应用中,还需要考虑错误处理、资源管理、并发处理等多个方面的问题。

五、应用场景

HCI_Inquiry命令在蓝牙技术中具有广泛的应用场景,它主要用于启动蓝牙设备的查询过程,以发现周围其他蓝牙设备的存在。以下是HCI_Inquiry命令的主要应用场景。

5.1. 蓝牙设备发现与配对

  • 初始设备发现
    • 当蓝牙设备首次使用或需要连接新设备时,通过发送HCI_Inquiry命令,可以搜索到附近处于可发现状态的蓝牙设备。
    • 获取设备地址、设备类型等基本信息,为后续的设备配对和连接做准备。
  • 设备配对前信息收集
    • 除了基本的设备标识信息,HCI_Inquiry命令还能获取如RSSI(接收信号强度指示)等附加信息。
    • 根据RSSI值,选择信号强度合适的设备进行配对,优化连接质量,提高后续使用体验。

5.2. 蓝牙设备网络组建与管理

  • 微微网(Piconet)组建
    • 通过HCI_Inquiry命令,主设备可以寻找和发现周围合适的从设备,以构建微微网。
    • 在智能家居等场景中,智能音箱等主设备通过该命令查找智能灯泡、智能插座等从设备,实现集中控制。
  • 散射网(Scatternet)扩展与维护
    • 已在微微网中的设备通过HCI_Inquiry命令搜索其他微微网中的设备,实现不同微微网之间的连接,形成散射网。
    • 在大型蓝牙设备网络环境中,如工业自动化场景下的多个蓝牙传感器网络互联,或大型智能建筑中的蓝牙设备集成管理等场景中非常有用。

5.3. 蓝牙设备定位与追踪(基于信号强度)

  • 室内定位系统(IPS)
    • 利用HCI_Inquiry命令获取的RSSI信息,实现简单的蓝牙设备定位。
    • 在商场、仓库等大型室内场所,通过多个带有蓝牙功能的定位基站发送HCI_Inquiry命令,获取周围设备的RSSI值,进行定位计算。
  • 资产追踪与管理:管理人员通过发送HCI_Inquiry命令的设备扫描周围蓝牙标签的信号强度,确定资产位置,实现实时追踪和管理。

5.4. 蓝牙设备兼容性检测与识别

  • 设备兼容性检查
    • 通过HCI_Inquiry命令获取设备的详细信息,如设备类型、支持的蓝牙协议版本等,判断设备之间是否兼容。
    • 在连接之前确保设备之间的兼容性,避免连接失败或性能下降。
  • 非法设备识别与防范
    • 在安全敏感的蓝牙网络环境中,通过HCI_Inquiry命令定期扫描周围的蓝牙设备,识别出未经授权或潜在的恶意设备。
    • 及时采取措施,如发出警报或进行隔离等操作,保障网络安全。

5.5. 其他应用场景

  • 连接状态管理
    • 在蓝牙设备的连接状态管理中,通过HCI_Inquiry命令搜索目标设备,进行连接操作。
    • 定期更新周围的设备列表,确保设备列表的准确性和完整性。
  • 蓝牙设备调试与测试
    • 在蓝牙设备的开发和调试过程中,使用HCI_Inquiry命令检测设备的查询功能是否正常。
    • 在测试过程中模拟不同的查询场景和条件,验证设备的性能和稳定性。

HCI_Inquiry命令在蓝牙技术中具有广泛的应用场景,不仅用于设备发现与配对,还涉及连接状态管理、蓝牙网络构建、设备定位与追踪、兼容性检测与识别等多个方面。它是蓝牙技术中不可或缺的重要命令之一。

六、注意事项

在使用HCI_Inquiry命令时,需要注意以下事项。

6.1. 参数设置

  • 查询时长(Inquiry_Length)与Extended_Inquiry_Length
    • 平衡查询时长与资源占用,避免过长导致资源浪费,过短则可能遗漏设备。
    • 考虑应用场景和蓝牙控制器性能,合理设置查询时长。
  • 响应数量限制(Num_Responses)
    • 根据实际需求设置响应数量,避免过多响应导致系统资源耗尽。
    • 在人员密集场所,考虑增加响应数量限制以应对大量设备响应。
  • 本地接入点(LAP)
    • 确保LAP值符合蓝牙协议规定范围。
    • 考虑应用场景,选择合适的LAP值以优化查询效果。

6.2. 事件过滤

  • 注意事件过滤对查询结果反馈的影响,避免过滤掉重要信息。
  • 根据实际需求设置事件过滤规则,确保获取完整的设备信息。

6.3. 信号干扰与环境因素

  • 信号干扰
    • 考虑Wi-Fi、其他无线设备信号等干扰源对查询效果的影响。
    • 在干扰严重的环境中,可能需要调整查询参数或采取其他措施提高查询成功率。
  • 物理环境因素
    • 考虑障碍物对蓝牙信号传播的影响。
    • 在大型建筑物或金属屏蔽场所,可能需要增加信号放大器或调整查询参数以提高查询效果。

6.4. 设备兼容性与蓝牙协议版本

  • 协议版本兼容性
    • 确保发起查询的设备与被查询的设备之间的蓝牙协议版本兼容。
    • 考虑不同设备对HCI_Inquiry命令的特殊要求或限制。
  • 设备特性
    • 考虑低功耗蓝牙设备的特性,如时间限制或功率限制。
    • 在执行HCI_Inquiry命令时,充分考虑这些设备的特性,避免无法发现设备或导致其电池过快耗尽。

6.5. 安全性

  • 避免泄露敏感信息
    • 在发送HCI_Inquiry命令时,注意避免泄露敏感信息,如设备的唯一标识符。
    • 使用加密技术和身份验证机制提高安全性。
  • 监控和防范未经授权的设备
    • 在安全敏感的场景中,定期使用HCI_Inquiry命令扫描周围的蓝牙设备。
    • 通过监控设备列表的变化,及时发现并处理未经授权的设备或潜在的恶意设备。

6.6. 命令执行顺序和时机

  • 确保蓝牙设备处于可查询状态,即设备已经打开蓝牙功能并设置为可被其他设备发现。
  • 遵循蓝牙协议规范,按照定义的HCI指令格式和参数要求发送HCI_Inquiry命令。

6.7. 事件处理

  • 监听HCI_Inquiry_Result事件
    • 当有蓝牙设备响应查询时,蓝牙控制器会产生HCI_Inquiry_Result事件。
    • 主机需要监听该事件并解析其中的设备信息,以便进行后续的设备配对和连接操作。
  • 处理HCI_Inquiry_Complete事件
    • 查询过程结束后,蓝牙控制器会产生HCI_Inquiry_Complete事件。
    • 主机需要处理该事件以结束查询过程并更新设备列表。

6.8. 硬件和资源限制

  • 考虑蓝牙控制器的性能和资源限制,避免发送过多的查询请求导致设备性能下降或资源耗尽。
  • 兼容不同品牌和型号的蓝牙设备,确保查询过程能够顺利进行。

使用HCI_Inquiry命令时需要注意多个方面的问题,包括参数设置、事件过滤、信号干扰与环境因素、设备兼容性与蓝牙协议版本、安全性、命令执行顺序和时机、事件处理以及硬件和资源限制等。通过合理设置参数、遵循蓝牙协议规范、监听和处理相关事件以及注意安全性和兼容性等方面的要求,可以确保HCI_Inquiry命令的正确执行和蓝牙设备的有效发现。

 综上所述,HCI_Inquiry命令是蓝牙技术中用于发现附近蓝牙设备的重要工具。通过合理设置查询参数和选择适当的查询模式,可以有效地发现附近的蓝牙设备,并为后续的连接、配对和管理等操作提供基础数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/484725.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五.指派问题

匈牙利发求解指派问题找独立0元素&#xff0c;常用的步骤为&#xff1a;

2024蜀道山高校联合公益赛

mixian 数组越界&#xff0c;可以去攻击stdout泄露libc&#xff0c;之后伪随机数绕过 from pwn import* from struct import pack import ctypes #from LibcSearcher import * from ae64 import AE64 def bug():gdb.attach(p)pause() def s(a):p.send(a) def sa(a,b):p.sendaf…

【若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤

&#x1f399;告诉你&#xff1a;Java是世界上最美好的语言 &#x1f48e;比较擅长的领域&#xff1a;前端开发 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持续下去的动力&#xff01; 目录 一. 作者有话说 …

Python毕业设计选题:基于大数据的旅游景区推荐系统_django

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页界面 用户注册界面 用户登录界面 景点信息界面 景点资讯界面 个人中心界面 …

Endnote 参考文献内容没有按引用顺序进行排序

Endnote 参考文献内容没有按引用顺序进行排序&#xff1a; word论文正文第一个引用就是[4]打头&#xff0c;疯狂卸载重装&#xff0c;修改设置&#xff0c;排查了大半天&#xff0c;最后解决了。 常规解决方案 就是在Endnote 软件里面对outputstyle进行修改&#xff0c;将Biogr…

图像滤波和卷积的不同及MATLAB应用实例

滤波与卷积在图像处理中都是非常重要的运算&#xff0c;但它们有着明显的区别。以下是滤波与卷积的主要不同点&#xff0c;并附带一个MATLAB实例来展示两者在图像处理中的效果差异。 一、滤波与卷积的不同 定义与目的&#xff1a; 1&#xff09;滤波&#xff1a;滤波是一种信…

低级爬虫实现-记录HCIP云架构考试

因工作需要考HCIP云架构&#xff08;HCIP-Cloud Service Solution Architect&#xff09;证书, 特意在淘宝上买了题库&#xff0c; 考过了。 事后得知自己被坑了&#xff0c; 多花了几十大洋。 所以想着在授权期内将题库“爬”下来&#xff0c; 共享给大家。 因为整个过程蛮有…

Scala—Sliding(滑动窗口)用法详解

Scala—Sliding&#xff08;滑动窗口&#xff09;用法详解 Scala 的 sliding 方法在处理集合时&#xff0c;可以方便地获取一个集合的“滑动窗口”&#xff08;能够按照指定的窗口大小和步长从集合中获取子集合&#xff09;。 sliding 方法定义&#xff1a; def sliding(size…

一、理论基础-PSI

之前参加了隐语第2期&#xff0c;对隐语SecretFlow框架有了大致的了解&#xff0c;这次参加隐语第4期&#xff0c;学习下PSI和PIR。 一、PSI定义 首先介绍PSI的定义&#xff0c;PSI&#xff08;隐私集合求交&#xff0c;Private Set Intersection即PSI)是安全多方计算&#x…

11.15【JAVA】【网络编程】【DEBUG】

代码以开源至cqujk/CquJavaEE 的myExp-socketCode分支,欢迎拷打 参考REPO Java 11: Standardized HTTP Client API 没反应 这是因为这应当是两个线程,当server创建好套接字后,进入accept时,就不会继续向下运行,客户端自然也就无法发送请求 首先要保证server进入accept(这个…

国家信息中心单志广:智慧城市转型中的数据要素价值释放

今日&#xff0c;由中国电信集团主办的2024数字科技生态大会数据要素合作论坛在广州市举办。国家发改委国家信息中心信息化和产业发展部主任单志广在论坛发展主旨演讲&#xff1a;智慧城市转型中的数据要素价值释放&#xff0c;主要包括发展新形势、数据新要素、数据新产权、数…

RTSP摄像头8K超高清使用场景探究和播放器要求

技术背景 8K 分辨率拥有7680x4320像素&#xff0c;像素数量是4K的四倍、1080P 的16倍。这意味着它能够呈现出极其清晰、细腻的图像&#xff0c;观众可以看到更多的细节&#xff0c;比如在体育赛事直播中&#xff0c;运动员的表情、动作细节&#xff0c;赛场上的微小标识等都能…

SpringBoot整合Mockito进行单元测试超全详细教程 JUnit断言 Mockito 单元测试

Mock概念 Mock叫做模拟对象&#xff0c;即用来模拟未被实现的对象可以预先定义这个对象在特定调用时的行为&#xff08;例如返回值或抛出异常&#xff09;&#xff0c;从而模拟不同的系统状态。 导入Mock依赖 pom文件中引入springboot测试依赖&#xff0c;spring-boot-start…

车机端同步outlook日历

最近在开发一个车机上的日历助手&#xff0c;其中一个需求就是要实现手机端日历和车机端日历数据的同步。然而这种需求似乎没办法实现&#xff0c;毕竟手机日历是手机厂商自己带的系统应用&#xff0c;根本不能和车机端实现数据同步的。 那么只能去其他公共的平台寻求一些机会&…

多人聊天室 NIO模型实现

NIO编程模型 Selector监听客户端不同的zhuangtai不同客户端触发不同的状态后&#xff0c;交由相应的handles处理Selector和对应的处理handles都是在同一线程上实现的 I/O多路复用 在Java中&#xff0c;I/O多路复用是一种技术&#xff0c;它允许单个线程处理多个输入/输出&…

电商产品自动化测试实战—解锁高效测试新技能

在这个数字化时代&#xff0c;电子商务行业的竞争愈发激烈&#xff0c;产品品质和稳定性成为了企业赢得市场的关键。而高质量的测试工作&#xff0c;正是确保产品品质和稳定性的重要保障。为此&#xff0c;我们特别推出了一场电商产品自动化测试实战公开课&#xff0c;旨在帮助…

【JavaWeb后端学习笔记】Mybatis基础操作以及动态SQL(增、删、改、查)

Mybatis 0、环境准备0.1 准备数据库表emp&#xff1b;0.2 准备SpringBoot工程0.3 配置文件中引入数据库连接信息0.4 创建对应的实体类0.5 准备Mapper接口 1、MyBatis基础操作1.1 删除1.2 新增&#xff08;主键返回&#xff09;1.3 更新1.4 查询&#xff08;解决字段名与类属性名…

SpringBoot该怎么使用Neo4j - 优化篇

文章目录 前言实体工具使用 前言 上一篇中&#xff0c;我们的Cypher都用的是字符串&#xff0c;字符串拼接简单&#xff0c;但存在写错的风险&#xff0c;对于一些比较懒的开发者&#xff0c;甚至觉得之间写字符串还更自在快速&#xff0c;也确实&#xff0c;但如果在后期需要…

如何用AI生成胶片风格的场景图 - 实用教程

如何用AI生成胶片风格的场景图 - 实用教程 在这个教程中,我们将介绍如何使用Recraft AI生成复古胶片风格的场景图。通过简单的步骤,你就能创建出独特的复古风格图片。 成功案例展示 小红书爆火作品 11月22日,小红书博主"四月崔aprilchui"发布胶片风格的场景图…

在M3上面搭建一套lnmp环境

下载docker-desktop 官网下载docker-desktop 切换镜像源 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://docke…