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

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

在 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

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

相关文章:

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

在 C 中获取蓝牙版本号&#xff0c;不同的操作系统有不同的实现方式&#xff0c;下面分别介绍在 Windows 和 Linux 系统下的实现方法。 Windows 系统 在 Windows 系统中&#xff0c;可以使用 Windows API 来与蓝牙设备交互&#xff0c;获取蓝牙版本号。以下是一个示例代码&…...

【网络】如何划分子网、计算子网掩码、确定网络地址、广播地址和可用主机地址范围?

当然&#xff01;让我们一步一步详细介绍如何划分子网、计算子网掩码、确定网络地址、广播地址和可用主机地址范围。假设我们从一个 10.0.0.0/24 的网络开始&#xff0c;并且需要为每个子网提供 50 个主机地址。 问题概述&#xff1a; 我们有一个网络 10.0.0.0/24。我们希望为…...

内核数据结构用法(2)list

list 在 Linux 内核中&#xff0c;链表操作是通过一组宏和函数来实现的&#xff0c;这些操作通常用来管理和遍历链表。以下是一些常用的链表函数和宏的具体用法。 1. 定义链表节点 首先&#xff0c;你需要定义一个包含 struct list_head 的结构体&#xff1a; #include <…...

【数据分析】2.数据分析业务全流程

业务流程方法论&#xff1a;3阶段6步骤 一、课程核心内容结构 1. 方法论概述 目标&#xff1a;系统性地解决商业中的关键问题框架&#xff1a;分为三个阶段&#xff0c;每个阶段包含两个步骤适用场景&#xff1a;适用于数据分析师、业务经理等需要通过数据分析支持决策的从业…...

第三十章 V - W 开头的术语

文章目录 第三十章 V - W 开头的术语视图 (view)虚拟字段 (virtual field)虚拟表 (virtual table) 以 W 开头的术语观察点 (watchpoint)Web 应用程序 (web application)工作集 (working set)写入镜像日志记录 (write image journaling) 以 X 开头的术语XData 第三十章 V - W 开…...

模拟实现Java中的计时器

定时器是什么 定时器也是软件开发中的⼀个重要组件. 类似于⼀个 "闹钟". 达到⼀个设定的时间之后, 就执⾏某个指定好的代码. 前端/后端中都会用到计时器. 定时器是⼀种实际开发中⾮常常⽤的组件. ⽐如⽹络通信中, 如果对⽅ 500ms 内没有返回数据, 则断开连接尝试重…...

Eclipse2024中文汉化教程(图文版)

对应Eclipse,部分人需要中文汉化,本章教程,介绍如何对Eclipse进行汉化的具体步骤。 一、汉化前的Eclipse 默认安装Eclipse的时候,默认一般都是English的,我当前版本是使用的是2024-06版本的Eclipse。 二、汉化详细步骤 点击上方菜单选项卡,Hep——Install New Software……...

【回溯算法2】

力扣17.电话号码的字母组合 链接: link 思路 这道题容易想到用嵌套的for循环实现&#xff0c;但是如果输入的数字变多&#xff0c;嵌套的for循环也会变长&#xff0c;所以暴力破解的方法不合适。 可以定义一个map将数字和字母对应&#xff0c;这样就可以获得数字字母的映射了…...

21.《SpringBoot 异步编程@Async与CompletableFuture》

SpringBoot 异步编程 文章导读 本文系统讲解 Spring Boot 异步编程的核心技术与实践方案&#xff0c;涵盖从基础使用到高级优化的全链路知识。通过深入剖析 Async 注解原理、线程池配置策略、异步异常处理机制等关键技术点&#xff0c;结合典型业务场景的代码示例&#xff0c…...

激光雷达YDLIDAR X2 SDK安装

激光雷达YDLIDAR X2 SDK安装 陈拓 2024/12/15-2024/12/19 1. 简介 YDLIDAR X2官方网址https://ydlidar.cn/index.html‌YDLIDAR X2 YDLIDAR X2是一款高性能的激光雷达传感器&#xff0c;具有以下主要特点和规格参数‌&#xff1a; ‌测距频率‌&#xff1a;3000Hz ‌扫描频…...

大模型在肝硬化风险预测及临床决策中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与数据来源 二、肝硬化及大模型相关理论基础 2.1 肝硬化概述 2.2 大模型技术原理 2.3 大模型在医疗领域的应用现状 三、大模型预测肝硬化术前风险 3.1 术前风险因素分析 3.2 大模型预测术前风险…...

计算机毕业设计SpringBoot+Vue.js母婴商城(源码+LW文档+PPT+讲解+开题报告)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Java多线程三:补充知识

精心整理了最新的面试资料&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Lambda表达式 简介&#xff1a; 希腊字母表中排序第十一位的字母&#xff0c;英语名称为Lambda避免匿名内部类定义过多其实质属于函数式编程的概念 为什么要使用lam…...

计算机网络————(一)HTTP讲解

基础内容分类 从TCP/IP协议栈为依托&#xff0c;由上至下、从应用层到基础设施介绍协议。 1.应用层&#xff1a; HTTP/1.1 Websocket HTTP/2.0 2.应用层的安全基础设施 LTS/SSL 3.传输层 TCP 4.网络层及数据链路层 IP层和以太网 HTTP协议 网络页面形成基本 流程&#xff1a…...

stream流常用方法

1.reduce 在Java中&#xff0c;可以使用Stream API的reduce方法来计算一个整数列表的乘积。reduce方法是一种累积操作&#xff0c;它可以将流中的元素组合起来&#xff0c;返回单个结果。对于计算乘积&#xff0c;你需要提供一个初始值&#xff08;通常是1&#xff0c;因为乘法…...

最新扣子(Coze)案例教程:全自动DeepSeek 写影评+批量生成 + 发布飞书,提效10 倍!手把手教学,完全免费教程

&#x1f468;‍&#x1f4bb;群里有同学是做影视赛道的博主&#xff0c;听说最近DeepSeek这么火&#xff0c;咨询能不能用DeepSeek写影评&#xff0c;并整理电影数据资料&#xff0c;自动发布到飞书文档&#xff0c;把每天的工作做成一个自动化的流程。 那今天斜杠君就为大家…...

数据结构:动态数组vector

vector 是 C 标准库的动态数组。 在C语言中一般初学者会使用malloc&#xff0c;int[n]等方式来创建静态数组&#xff0c;但是这种方式繁琐且容易出错。我们做算法题一般使用动态数组vector&#xff0c; 并且在刷题网站的题目给的输入一般也是vector类型。 示例&#xff1a;vect…...

【HeadFirst系列之HeadFirst设计模式】第9天之模板方法模式:从咖啡和茶到Spring框架,掌握设计模式的精髓

模板方法模式&#xff1a;从咖啡和茶到Spring框架&#xff0c;掌握设计模式的精髓 《Head First 设计模式》是一本经典的设计模式入门书籍&#xff0c;它以轻松幽默的方式讲解了设计模式的核心思想。其中&#xff0c;模板方法模式是一个非常简单但非常实用的设计模式&#xff…...

力扣hot100——排序链表(常见方法,归并排序)

解题思路&#xff1a; 分解&#xff08;Divide&#xff09;&#xff1a;将待排序的列表递归地分成两半&#xff0c;直到每个子列表只包含一个元素&#xff08;此时每个子列表都是有序的&#xff09;。解决&#xff08;Conquer&#xff09;&#xff1a;递归地对每个子列表进行排…...

使用 DeepSeek 和 ECharts 实现大屏数据可视化

引言 在当今数据驱动的时代,数据可视化成为了分析和展示数据的重要手段。大屏数据可视化不仅能够直观地展示数据,还能帮助决策者快速理解复杂信息。本文将介绍如何结合 DeepSeek(一个强大的数据处理与分析工具)和 ECharts(一个流行的数据可视化库)来实现大屏数据可视化。…...

基于springboot的银行储蓄存业务系统

目录同行可拿货,招校园代理 ,本人源头供货商核心功能模块业务处理功能辅助功能模块技术实现要点项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商 核心功能模块 账户管理 支持个人/企业…...

别再只盯着Vgs和Id了!用这5个常被忽略的MOS管参数,帮你搞定电源开关电路设计

电源开关电路设计中5个常被忽视的MOS管参数实战解析 当你在设计一个Buck降压电路时&#xff0c;明明已经按照手册选择了足够大电流规格的MOS管&#xff0c;但实际工作中管子却异常发热&#xff1b;或者在做电机驱动时&#xff0c;PWM频率明明不高&#xff0c;MOS管却总是响应迟…...

网盘下载限速终结者:8大平台直链一键获取,解放你的生产力!

网盘下载限速终结者&#xff1a;8大平台直链一键获取&#xff0c;解放你的生产力&#xff01; 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里…...

别再只会用--help了!Python argparse的nargs和action参数实战避坑指南

深度解析Python argparse&#xff1a;掌握nargs与action参数的高阶用法 在Python开发中&#xff0c;命令行参数处理是构建可复用脚本的关键环节。虽然大多数开发者都能使用基础的add_argument方法&#xff0c;但当遇到需要处理复杂参数场景时——比如动态长度的输入列表、互斥的…...

MAX30102数据飘、读数不准?手把手教你调试与滤波实战(STM32平台)

MAX30102数据飘、读数不准&#xff1f;手把手教你调试与滤波实战&#xff08;STM32平台&#xff09; 当你在STM32平台上使用MAX30102进行心率血氧监测时&#xff0c;是否遇到过数据波动大、读数不稳定的问题&#xff1f;这可能是硬件设计、环境干扰或软件处理等多方面因素共同作…...

硬件实战手记:MOSFET损耗分析与选型避坑指南

1. MOSFET损耗的三大元凶 MOSFET在电路中的损耗主要来自三个方面&#xff1a;导通损耗、开关损耗和续流损耗。先说导通损耗&#xff0c;这是最好理解的——当MOSFET完全导通时&#xff0c;DS之间就像一个可变电阻&#xff0c;这个电阻就是Rdson。我实测过几十种MOSFET&#xff…...

从一颗芯片的“衰老”说起:用Arrhenius模型和加速测试搞定MTBF验证

从一颗芯片的"衰老"说起&#xff1a;用Arrhenius模型和加速测试搞定MTBF验证 当你的手机在两年后开始卡顿&#xff0c;或是数据中心服务器突然宕机&#xff0c;背后往往藏着一个微观世界里的秘密——电子元器件正在经历一场不可逆的"衰老"过程。这种衰老不…...

Display Driver Uninstaller完全指南:三步彻底解决显卡驱动残留问题

Display Driver Uninstaller完全指南&#xff1a;三步彻底解决显卡驱动残留问题 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers…...

Qianfan-OCR效果分享:培训教材PPT→知识点分级+案例引用+习题答案结构化

Qianfan-OCR效果分享&#xff1a;培训教材PPT→知识点分级案例引用习题答案结构化 1. 工具概览 Qianfan-OCR是基于百度千帆InternVL架构开发的单卡GPU专属文档解析工具&#xff0c;专为解决教育培训场景中的复杂文档解析需求而设计。与传统OCR工具不同&#xff0c;它不仅能识…...

从MATLAB仿真到FPGA实现:手把手搭建线性调频(LFM)脉冲压缩系统

从MATLAB仿真到FPGA实现&#xff1a;手把手搭建线性调频&#xff08;LFM&#xff09;脉冲压缩系统 雷达系统的核心挑战之一是如何在保持高距离分辨率的同时实现远距离探测。传统脉冲雷达面临一个根本性矛盾&#xff1a;缩短脉冲宽度可以提高分辨率&#xff0c;但会降低探测距离…...