
HCI_Read_Remote_Version_Information 是一个蓝牙主机控制器接口(HCI)命令。主要目的是获取由 Connection_Handle 参数所标识的远程设备的版本信息。通过这个命令,主机能够了解远程设备的软件或硬件版本相关的数据,对于设备兼容性检查、功能匹配以及故障排查等方面都非常有用。
当执行 HCI_Read_Remote_Version_Information 命令时,它会通过指定的 Connection_Handle 发送请求到远程设备,以获取该设备的版本信息。

这些信息通常包括:
HCI_Read_Remote_Version_Information 命令格式HCI_Read_Remote_Version_Information 命令属于HCI命令集的一部分。和其他 HCI 命令一样,具有特定的格式,包括命令操作码(OCF)和参数部分。

以下是该命令的详细格式:
0x001D。当使用 HCI_Read_Remote_Version_Information 命令时,通过指定这个 Connection_Handle 参数就能准确地告知蓝牙协议栈,要获取的是哪个连接所指向的远程设备的版本信息。

如果指定的值不在这个 0x0000 到 0x0EFF 范围之内,命令很可能无法正确执行,因为该值不符合协议对于有效连接句柄的定义,协议栈无法依据其识别出对应的连接,进而也就没办法获取到期望的远程设备版本信息了。
HCI_Read_Remote_Version_Information 命令本身直接不存在返回参数,意味着主机在发送命令后,并不会立刻接收到关于远程设备版本信息的相关数据。而是需要借助后续触发产生的特定事件来获取相应内容。
当蓝牙控制器接收到 HCI_Read_Remote_Version_Information 命令时,会向主机发送 HCI_Command_Status 事件。主要作用在于通知主机,表明控制器已经成功接收到了该命令,并且命令已进入处理流程。

事件包含了命令的状态码,用于指示命令是否被成功接收、执行中、还是由于某种原因失败。不过需要注意的是,此事件本身并不携带远程设备版本信息的具体内容,它仅仅是起到一个让主机知晓命令传递环节正常、开始进入后续处理阶段的告知作用。
在链路管理器或者链路层完成相应的操作序列,成功确定了远程设备的版本信息之后,本地的控制器会向主机发送 HCI_Read_Remote_Version_Information_Complete 事件。

这个事件十分关键,因为它包含了两方面重要的信息:
Connection_Handle,且连接必须是ACL - U或LE - U逻辑链路对应的连接。HCI_Read_Remote_Version_Information 命令。Connection_Handle 参数的有效性。HCI_Command_Status 事件,告知命令已被接收并进入处理流程。Connection_Handle 与远程设备进行通信,以获取远程设备的版本信息。HCI_Read_Remote_Version_Information_Complete 事件。以下是一个简化的C语言代码示例,模拟HCI_Read_Remote_Version_Information命令的执行流程。
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// 模拟的HCI命令和事件结构体
typedef struct {
uint16_t opcode; // 操作码
uint16_t handle; // 连接句柄
} HCI_Command;
typedef struct {
uint8_t status; // 命令状态
} HCI_Command_Status;
typedef struct {
uint8_t status; // 命令状态
uint16_t handle; // 连接句柄
uint8_t lmp_version; // LMP版本
uint16_t manufacturer; // 制造商
uint16_t lmp_subversion; // LMP子版本
} HCI_Read_Remote_Version_Information_Complete;
// 模拟的蓝牙控制器接口函数(在实际应用中,这些函数会调用硬件接口或蓝牙协议栈)
void send_hci_command(HCI_Command* cmd) {
// 在这里,我们仅仅打印命令以模拟发送
printf("Sending HCI command: opcode=0x%04X, handle=0x%04X\n", cmd->opcode, cmd->handle);
// 假设命令总是成功接收,并立即生成反馈和结果事件
HCI_Command_Status status_event = {.status = 0x00}; // 0x00表示成功
HCI_Read_Remote_Version_Information_Complete version_event = {
.status = 0x00,
.handle = cmd->handle,
.lmp_version = 0x05, // 假设LMP版本为5
.manufacturer = 0x0001, // 假设制造商ID为1
.lmp_subversion = 0x0001 // 假设LMP子版本为1
};
// 调用回调函数来模拟接收事件
receive_hci_event(&status_event, sizeof(status_event));
receive_hci_event(&version_event, sizeof(version_event));
}
// 模拟接收HCI事件的回调函数(在实际应用中,这些函数会由蓝牙协议栈或硬件接口调用)
void receive_hci_event(void* event, size_t size) {
if (size == sizeof(HCI_Command_Status)) {
HCI_Command_Status* status_event = (HCI_Command_Status*)event;
printf("Received HCI Command Status event: status=0x%02X\n", status_event->status);
// 在这里,我们可以根据状态来决定是否继续等待结果事件
if (status_event->status == 0x00) {
// 假设我们已经知道接下来会收到版本信息完成事件(在实际应用中,这通常是异步的)
// 为了简化,我们直接在这里模拟接收它(在实际应用中,这将是另一个回调函数)
}
} else if (size == sizeof(HCI_Read_Remote_Version_Information_Complete)) {
HCI_Read_Remote_Version_Information_Complete* version_event = (HCI_Read_Remote_Version_Information_Complete*)event;
printf("Received HCI Read Remote Version Information Complete event:\n");
printf(" status=0x%02X, handle=0x%04X, LMP version=0x%02X, manufacturer=0x%04X, LMP subversion=0x%04X\n",
version_event->status, version_event->handle, version_event->lmp_version,
version_event->manufacturer, version_event->lmp_subversion);
} else {
printf("Received unknown HCI event of size %zu\n", size);
}
}
int main() {
// 准备要发送的HCI命令
HCI_Command cmd = {.opcode = 0x001D, .handle = 0x0001}; // 假设连接句柄为0x0001
// 发送HCI命令
send_hci_command(&cmd);
// 在实际应用中,这里可能会有一个等待循环来接收事件
// 但由于我们的模拟是同步的,所以不需要等待
return 0;
}请注意,这个示例代码是高度简化的,并且不包含任何实际的硬件操作或蓝牙协议栈的实现。
为确保命令的正确执行并获取准确信息,以下是使用此命令时需要注意的关键要素:
Connection_Handle在有效范围内(0x0000到0x0EFF)。Connection_Handle对应的连接必须是ACL-U或LE-U逻辑链路。HCI_Read_Remote_Version_Information_Complete事件以获取版本信息。综上所述,HCI_Read_Remote_Version_Information 命令是蓝牙HCI中的一个重要命令,它允许主机获取远程蓝牙设备的版本信息,对于确保蓝牙设备之间的兼容性和正确操作至关重要。通过了解远程设备的版本信息,可以更有效地管理和优化蓝牙连接,提供更佳的用户体验。