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;
}
代码解释
- WSAStartup:初始化 Windows Sockets DLL,为后续的蓝牙操作做准备。
- BluetoothFindFirstRadio:查找本地的第一个蓝牙适配器。
- BluetoothGetRadioInfo:获取蓝牙适配器的详细信息,其中
lmpVersion字段包含了蓝牙版本号。 - 根据
lmpVersion判断蓝牙版本:通过switch语句将lmpVersion转换为对应的蓝牙版本字符串并输出。 - 清理资源:关闭蓝牙设备查找句柄和设备句柄,调用
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;
}
代码解释
- hci_get_route:获取第一个 HCI 设备的 ID。
- hci_open_dev:打开指定的 HCI 设备。
- hci_read_local_version:读取本地蓝牙设备的版本信息,结果存储在
hci_version结构体中。 - 根据
lmp_ver判断蓝牙版本:通过switch语句将lmp_ver转换为对应的蓝牙版本字符串并输出。 - 关闭设备:调用
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 中获取蓝牙版本号,不同的操作系统有不同的实现方式,下面分别介绍在 Windows 和 Linux 系统下的实现方法。 Windows 系统 在 Windows 系统中,可以使用 Windows API 来与蓝牙设备交互,获取蓝牙版本号。以下是一个示例代码&…...
【网络】如何划分子网、计算子网掩码、确定网络地址、广播地址和可用主机地址范围?
当然!让我们一步一步详细介绍如何划分子网、计算子网掩码、确定网络地址、广播地址和可用主机地址范围。假设我们从一个 10.0.0.0/24 的网络开始,并且需要为每个子网提供 50 个主机地址。 问题概述: 我们有一个网络 10.0.0.0/24。我们希望为…...
内核数据结构用法(2)list
list 在 Linux 内核中,链表操作是通过一组宏和函数来实现的,这些操作通常用来管理和遍历链表。以下是一些常用的链表函数和宏的具体用法。 1. 定义链表节点 首先,你需要定义一个包含 struct list_head 的结构体: #include <…...
【数据分析】2.数据分析业务全流程
业务流程方法论:3阶段6步骤 一、课程核心内容结构 1. 方法论概述 目标:系统性地解决商业中的关键问题框架:分为三个阶段,每个阶段包含两个步骤适用场景:适用于数据分析师、业务经理等需要通过数据分析支持决策的从业…...
第三十章 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循环实现,但是如果输入的数字变多,嵌套的for循环也会变长,所以暴力破解的方法不合适。 可以定义一个map将数字和字母对应,这样就可以获得数字字母的映射了…...
21.《SpringBoot 异步编程@Async与CompletableFuture》
SpringBoot 异步编程 文章导读 本文系统讲解 Spring Boot 异步编程的核心技术与实践方案,涵盖从基础使用到高级优化的全链路知识。通过深入剖析 Async 注解原理、线程池配置策略、异步异常处理机制等关键技术点,结合典型业务场景的代码示例,…...
激光雷达YDLIDAR X2 SDK安装
激光雷达YDLIDAR X2 SDK安装 陈拓 2024/12/15-2024/12/19 1. 简介 YDLIDAR X2官方网址https://ydlidar.cn/index.htmlYDLIDAR X2 YDLIDAR X2是一款高性能的激光雷达传感器,具有以下主要特点和规格参数: 测距频率:3000Hz 扫描频…...
大模型在肝硬化风险预测及临床决策中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与数据来源 二、肝硬化及大模型相关理论基础 2.1 肝硬化概述 2.2 大模型技术原理 2.3 大模型在医疗领域的应用现状 三、大模型预测肝硬化术前风险 3.1 术前风险因素分析 3.2 大模型预测术前风险…...
计算机毕业设计SpringBoot+Vue.js母婴商城(源码+LW文档+PPT+讲解+开题报告)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Java多线程三:补充知识
精心整理了最新的面试资料,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Lambda表达式 简介: 希腊字母表中排序第十一位的字母,英语名称为Lambda避免匿名内部类定义过多其实质属于函数式编程的概念 为什么要使用lam…...
计算机网络————(一)HTTP讲解
基础内容分类 从TCP/IP协议栈为依托,由上至下、从应用层到基础设施介绍协议。 1.应用层: HTTP/1.1 Websocket HTTP/2.0 2.应用层的安全基础设施 LTS/SSL 3.传输层 TCP 4.网络层及数据链路层 IP层和以太网 HTTP协议 网络页面形成基本 流程:…...
stream流常用方法
1.reduce 在Java中,可以使用Stream API的reduce方法来计算一个整数列表的乘积。reduce方法是一种累积操作,它可以将流中的元素组合起来,返回单个结果。对于计算乘积,你需要提供一个初始值(通常是1,因为乘法…...
最新扣子(Coze)案例教程:全自动DeepSeek 写影评+批量生成 + 发布飞书,提效10 倍!手把手教学,完全免费教程
👨💻群里有同学是做影视赛道的博主,听说最近DeepSeek这么火,咨询能不能用DeepSeek写影评,并整理电影数据资料,自动发布到飞书文档,把每天的工作做成一个自动化的流程。 那今天斜杠君就为大家…...
数据结构:动态数组vector
vector 是 C 标准库的动态数组。 在C语言中一般初学者会使用malloc,int[n]等方式来创建静态数组,但是这种方式繁琐且容易出错。我们做算法题一般使用动态数组vector, 并且在刷题网站的题目给的输入一般也是vector类型。 示例:vect…...
【HeadFirst系列之HeadFirst设计模式】第9天之模板方法模式:从咖啡和茶到Spring框架,掌握设计模式的精髓
模板方法模式:从咖啡和茶到Spring框架,掌握设计模式的精髓 《Head First 设计模式》是一本经典的设计模式入门书籍,它以轻松幽默的方式讲解了设计模式的核心思想。其中,模板方法模式是一个非常简单但非常实用的设计模式ÿ…...
力扣hot100——排序链表(常见方法,归并排序)
解题思路: 分解(Divide):将待排序的列表递归地分成两半,直到每个子列表只包含一个元素(此时每个子列表都是有序的)。解决(Conquer):递归地对每个子列表进行排…...
使用 DeepSeek 和 ECharts 实现大屏数据可视化
引言 在当今数据驱动的时代,数据可视化成为了分析和展示数据的重要手段。大屏数据可视化不仅能够直观地展示数据,还能帮助决策者快速理解复杂信息。本文将介绍如何结合 DeepSeek(一个强大的数据处理与分析工具)和 ECharts(一个流行的数据可视化库)来实现大屏数据可视化。…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
