Windows和Linux下,通过C++实现获取蓝牙版本号

news/2025/2/23 20:34:38

在 C++ 中获取蓝牙版本号,不同的操作系统有不同的实现方式,下面分别介绍在 Windows 和 Linux 系统下的实现方法。

Windows 系统

在 Windows 系统中,可以使用 Windows API 来与蓝牙设备交互,获取蓝牙版本号。以下是一个示例代码:

收起

cpp

#include <iostream>
#include <windows.h>
#include <bthdef.h>
#include <bthapi.h>
#include <BluetoothAPIs.h>

#pragma comment(lib, "Bthprops.lib")

// 函数用于获取本地蓝牙设备的版本号
void GetBluetoothVersion() {
    // 初始化WSA数据
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        std::cerr << "WSAStartup failed: " << WSAGetLastError() << std::endl;
        return;
    }

    // 打开本地蓝牙设备
    BLUETOOTH_FIND_RADIO_PARAMS radioParams = { sizeof(BLUETOOTH_FIND_RADIO_PARAMS) };
    HBLUETOOTH_RADIO_FIND hFind = BluetoothFindFirstRadio(&radioParams, &radioParams.hRadio);
    if (hFind == NULL) {
        std::cerr << "BluetoothFindFirstRadio failed: " << GetLastError() << std::endl;
        WSACleanup();
        return;
    }

    // 获取蓝牙设备信息
    BLUETOOTH_RADIO_INFO radioInfo = { sizeof(BLUETOOTH_RADIO_INFO) };
    if (BluetoothGetRadioInfo(radioParams.hRadio, &radioInfo) != ERROR_SUCCESS) {
        std::cerr << "BluetoothGetRadioInfo failed: " << GetLastError() << std::endl;
    }
    else {
        // 提取蓝牙版本信息
        WORD lmpVersion = radioInfo.lmpVersion;
        std::cout << "Bluetooth Version: ";
        switch (lmpVersion) {
        case 1:
            std::cout << "1.0";
            break;
        case 2:
            std::cout << "1.1";
            break;
        case 3:
            std::cout << "1.2";
            break;
        case 4:
            std::cout << "2.0 + EDR";
            break;
        case 5:
            std::cout << "2.1 + EDR";
            break;
        case 6:
            std::cout << "3.0 + HS";
            break;
        case 7:
            std::cout << "4.0";
            break;
        case 8:
            std::cout << "4.1";
            break;
        case 9:
            std::cout << "4.2";
            break;
        case 10:
            std::cout << "5.0";
            break;
        case 11:
            std::cout << "5.1";
            break;
        case 12:
            std::cout << "5.2";
            break;
        case 13:
            std::cout << "5.3";
            break;
        default:
            std::cout << "Unknown (" << lmpVersion << ")";
            break;
        }
        std::cout << std::endl;
    }

    // 关闭蓝牙设备查找句柄和设备句柄
    BluetoothFindRadioClose(hFind);
    CloseHandle(radioParams.hRadio);
    WSACleanup();
}


int main() {
    GetBluetoothVersion();
    return 0;
}
代码解释

  1. WSAStartup:初始化 Windows Sockets DLL,为后续的蓝牙操作做准备。
  2. BluetoothFindFirstRadio:查找本地的第一个蓝牙适配器。
  3. BluetoothGetRadioInfo:获取蓝牙适配器的详细信息,其中lmpVersion字段包含了蓝牙版本号。
  4. 根据lmpVersion判断蓝牙版本:通过switch语句将lmpVersion转换为对应的蓝牙版本字符串并输出。
  5. 清理资源:关闭蓝牙设备查找句柄和设备句柄,调用WSACleanup清理 Windows Sockets 资源。
Linux 系统

在 Linux 系统中,可以使用 BlueZ 库来与蓝牙设备交互。以下是一个示例代码:

收起

cpp

#include <iostream>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>

// 函数用于获取本地蓝牙设备的版本号
void GetBluetoothVersion() {
    // 打开第一个HCI设备
    int dev_id = hci_get_route(NULL);
    int sock = hci_open_dev(dev_id);
    if (sock < 0) {
        std::cerr << "Failed to open HCI device: " << strerror(errno) << std::endl;
        return;
    }

    // 获取蓝牙设备信息
    struct hci_version version;
    if (hci_read_local_version(sock, &version, 1000) < 0) {
        std::cerr << "Failed to read local version: " << strerror(errno) << std::endl;
        close(sock);
        return;
    }

    // 输出蓝牙版本信息
    std::cout << "Bluetooth Version: ";
    switch (version.lmp_ver) {
    case 1:
        std::cout << "1.0";
        break;
    case 2:
        std::cout << "1.1";
        break;
    case 3:
        std::cout << "1.2";
        break;
    case 4:
        std::cout << "2.0 + EDR";
        break;
    case 5:
        std::cout << "2.1 + EDR";
        break;
    case 6:
        std::cout << "3.0 + HS";
        break;
    case 7:
        std::cout << "4.0";
        break;
    case 8:
        std::cout << "4.1";
        break;
    case 9:
        std::cout << "4.2";
        break;
    case 10:
        std::cout << "5.0";
        break;
    case 11:
        std::cout << "5.1";
        break;
    case 12:
        std::cout << "5.2";
        break;
    case 13:
        std::cout << "5.3";
        break;
    default:
        std::cout << "Unknown (" << version.lmp_ver << ")";
        break;
    }
    std::cout << std::endl;

    // 关闭HCI设备
    close(sock);
}


int main() {
    GetBluetoothVersion();
    return 0;
}
代码解释

  1. hci_get_route:获取第一个 HCI 设备的 ID。
  2. hci_open_dev:打开指定的 HCI 设备。
  3. hci_read_local_version:读取本地蓝牙设备的版本信息,结果存储在hci_version结构体中。
  4. 根据lmp_ver判断蓝牙版本:通过switch语句将lmp_ver转换为对应的蓝牙版本字符串并输出。
  5. 关闭设备:调用close函数关闭 HCI 设备。

编译和运行

Windows 系统

使用 Visual Studio 等 IDE 打开项目,确保包含必要的头文件和链接库(Bthprops.lib),然后编译运行。

Linux 系统

使用以下命令编译代码:

收起

sh

g++ -o get_bluetooth_version get_bluetooth_version.cpp -lbluetooth

运行编译后的可执行文件:

收起

sh

./get_bluetooth_version

以上代码可以帮助你在不同的操作系统下获取蓝牙版本号。需要注意的是,代码中可能需要根据实际情况进行错误处理和资源管理的优化。


http://www.niftyadmin.cn/n/5863750.html

相关文章

Vite 和 Webpack 的区别和选择

简介 Nuxt3 默认使用 Vite 作为构建工具&#xff0c;但也可以配置为使用 Webpack。‌ 关于两者的区别和详细结构化解析可以参考文章&#xff1a;vite和webpack底层逻辑差异 两者实例化案例可以参考文章 &#xff1a; Webpack和Vite插件的开发与使用_vite使用webpack-CSDN博客 简…

《Head First设计模式》读书笔记 —— 单件模式

文章目录 为什么需要单件模式单件模式典型实现剖析定义单件模式本节用例多线程带来的问题解决问题优化 Q&A总结 《Head First设计模式》读书笔记 相关代码&#xff1a; Vks-Feng/HeadFirstDesignPatternNotes: Head First设计模式读书笔记及相关代码 用来创建独一无二的&a…

【MATLAB例程】RSSI/PLE定位与卡尔曼滤波NLOS抑制算法,附完整代码

本 MATLAB 代码实现了基于接收信号强度指示(RSSI)和路径损耗模型(PLE)的定位算法,并结合卡尔曼滤波技术进行非视距(NLOS)干扰抑制。通过模拟真实运动轨迹,代码展示了如何在存在NLOS干扰的情况下进行有效的定位。订阅专栏后,可阅读完整代码,可直接运行 文章目录 运行结…

Python strip() 方法详解:用途、应用场景及示例解析(中英双语)

Python strip() 方法详解&#xff1a;用途、应用场景及示例解析 在 Python 处理字符串时&#xff0c;经常会遇到字符串前后存在多余的空格或特殊字符的问题。strip() 方法就是 Python 提供的一个强大工具&#xff0c;专门用于去除字符串两端的指定字符。本文将详细介绍 strip(…

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_array_init 函数

ngx_array_init 定义在 src/core/ngx_array.h static ngx_inline ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size) {/** set "array->nelts" before "array->elts", otherwise MSVC thinks* that "…

游戏引擎学习第117天

仓库:https://gitee.com/mrxiao_com/2d_game_3 加载代码并考虑优化 今天的内容主要集中在游戏开发中的性能优化部分&#xff0c;特别是SIMD&#xff08;单指令多数据&#xff09;优化。在前一周&#xff0c;已经完成了一些基本的优化&#xff0c;使得代码运行速度提高了大约三…

【C语言】(一)数据在计算机中的存储与表示

目录 一、存储单位&#xff08;比特/字节&#xff09; 二、数制/进制&#xff08;二/八/十/十六&#xff09; 三、码制&#xff08;原码/反码/补码/移码&#xff09; 四、二进制表示小数 &#xff08;一&#xff09;定点数 &#xff08;二&#xff09;浮点数 十进制转化…

基于YOLO11深度学习的糖尿病视网膜病变检测与诊断系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…