【蓝牙】Linux Qt4查看已经配对的蓝牙信息

在Linux系统中使用Qt4查看已配对的蓝牙设备信息,可以基于DBus与BlueZ(Linux下的蓝牙协议栈)进行交互。以下是一个实现方案:

1. 引入必要的库和头文件

确保项目中包含DBus相关的头文件,并链接QtDBus模块:

cpp

#include <QDBusInterface>
#include <QDBusReply>
#include <QDBusObjectPath>
#include <QVariantMap>

2. 定义DBus常量

用于连接BlueZ服务的DBus接口、服务名和路径:

cpp

#define BLUEZ_DBUS_SERVICE  "org.bluez"
#define BLUEZ_DBUS_PATH "/org/bluez/hci0"
#define BLUEZ_DBUS_IF "org.bluez.Adapter1"

3. 获取已管理对象(Managed Objects)

通过调用org.freedesktop.DBus.ObjectManager接口的GetManagedObjects方法,可以获取所有蓝牙设备的信息。

cpp

QVariantMap getManagedObjects()
{QDBusInterface manager(BLUEZ_DBUS_SERVICE, "/","org.freedesktop.DBus.ObjectManager", QDBusConnection::systemBus());QDBusReply<ManagedObjectList> reply = manager.call("GetManagedObjects");if (!reply.isValid()) {qWarning() << "Failed to get managed objects:" << reply.error().message();return QVariantMap();}ManagedObjectList objects = reply.value();QVariantMap result;foreach (const QDBusObjectPath &path, objects.keys()) {InterfaceList interfaces = objects.value(path);foreach (const QString &interface, interfaces.keys()) {result[path.path()] = interfaces.value(interface);}}return result;
}

需要自定义类型 ManagedObjectList 和 InterfaceList

cpp

typedef QMap<QString, QVariantMap> InterfaceList;
typedef QMap<QDBusObjectPath, InterfaceList> ManagedObjectList;Q_DECLARE_METATYPE(InterfaceList)
Q_DECLARE_METATYPE(ManagedObjectList)

4. 过滤已配对的蓝牙设备

遍历返回的对象,提取出org.bluez.Device1接口中的设备信息,并筛选出已配对的设备。

cpp

void getPairedDevices(BluetoothDeviceList_t &deviceList)
{QVariantMap objects = getManagedObjects();QSet<QString> uniqueAddresses; // 去重foreach (const QString &path, objects.keys()) {QVariantMap deviceProps = objects[path].toMap();if (deviceProps.contains("Name") && deviceProps.contains("Address") &&deviceProps.contains("Paired")) {QString name = deviceProps["Name"].toString();QString address = deviceProps["Address"].toString();bool paired = deviceProps["Paired"].toBool();if (!name.isEmpty() && !uniqueAddresses.contains(address) && paired) {uniqueAddresses.insert(address);BluetoothDevice_t device;device.address = address;device.Name = name;device.Paired = paired;device.Connected = deviceProps["Connected"].toBool();device.Icon = deviceProps["Icon"].toString();deviceList << device;}}}
}

5. 数据结构定义

定义蓝牙设备的数据结构:

cpp

struct BluetoothDevice_t {QString address;QString Name;QString Icon;QString Alias;bool Connected;bool Paired;
};typedef QList<BluetoothDevice_t> BluetoothDeviceList_t;

6. 注册元类型

为了让Qt支持跨线程传递自定义结构体,需要注册元类型:

cpp

qRegisterMetaType<BluetoothDevice_t>("BluetoothDevice_t");
qRegisterMetaType<InterfaceList>("InterfaceList");
qRegisterMetaType<ManagedObjectList>("ManagedObjectList");

7. 展示设备列表

将获取到的设备列表展示在QTableWidget中:

cpp

void setPairedDeviceList(const BluetoothDeviceList_t &deviceList)
{int row_count = deviceList.count();if (row_count <= 0) return;ui->tableWidget->setRowCount(row_count);ui->tableWidget->setColumnCount(1);for (int row = 0; row < row_count; ++row) {const BluetoothDevice_t &device = deviceList.at(row);QTableWidgetItem *item = new QTableWidgetItem(device.Name);item->setData(Qt::UserRole, device.address);item->setData(Qt::UserRole + 1, device.Paired);item->setData(Qt::UserRole + 2, device.Connected);QBrush brush = QColor(0, 0, 0);if (device.Connected && device.Paired) {brush = QColor(0x00DC00); // 绿色} else if (device.Paired) {brush = QColor(0x3E81DA); // 蓝色}item->setForeground(brush);ui->tableWidget->setItem(row, 0, item);}ui->tableWidget->selectRow(0);
}

8. 完整流程

  • 初始化UI:设置表格样式、隐藏表头等。
  • 获取设备列表:调用getPairedDevices()
  • 设置设备列表:调用setPairedDeviceList()显示到界面上。

示例运行效果

该程序会列出所有已配对的蓝牙设备名称和地址,并根据是否连接显示不同的颜色。


如需进一步扩展功能,例如连接/断开设备发送文件等,可以通过调用BlueZ提供的DBus接口实现

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

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

相关文章

企业客户数据防窃指南:从法律要件到维权实操

作者&#xff1a;邱戈龙、曾建萍 ——上海商业秘密律师 在数字经济时代&#xff0c;客户数据已成为企业最核心的资产之一。然而&#xff0c;数据显示&#xff0c;近三年全国商业秘密侵权案件中&#xff0c;涉及客户信息的案件占比高达42%&#xff0c;但最终进入刑事程序的不足…

WHAT - React Native 中 Light and Dark mode 深色模式(黑暗模式)机制

文章目录 一、Light / Dark Mode 的原理1. 操作系统层2. React Native 如何获取?3. 样式怎么跟着变?二、关键代码示例讲解代码讲解:三、自定义主题四、运行时自动更新五、核心原理一张图组件应用例子最小示例:动态样式按钮的动态样式如何封装一套自定义主题四、如何和 Them…

[25-cv-07396、25-cv-07470]Keith代理Anderson这9张版权图,除此之外原告还有50多个版权!卖家要小心!

Anderson 版权图 案件号&#xff1a;25-cv-07396、25-cv-07470 立案时间&#xff1a;2025年7月2日 原告&#xff1a;Anderson Design Group, Inc. 代理律所&#xff1a;Keith 原告介绍 原告是美国的创意设计公司&#xff0c;成立于1993年&#xff0c;简称ADG&#xff0c;一…

五、代码生成器:gen项目开发

目录 1.新建数据库 2.nacos中配置文件 3.gen项目配置代码 4.前端项目 我们再项目中需要代码生成器,这边自己开发一个gen代码生成器服务。 1.新建数据库 CREATE TABLE `gen_table` (`table_id` bigint NOT NULL AUTO_INCREMENT COMMENT 编号,`table_name` varchar(200) DEF…

UI前端大数据处理安全性保障:数据加密与隐私保护策略

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 一、引言&#xff1a;大数据时代前端安全的核心挑战 在数据驱动业务发展的今天&#xff0c;U…

基于 alpine 构建 .net 的基础镜像

准备基础镜像 alpine:3.22 完整的 Dockerfile 如下&#xff1a; # 使用官方的 Alpine 3.22 镜像作为基础镜像 FROM --platform$TARGETPLATFORM alpine:3.22 AS builder# 设置环境变量 ENV DEBIAN_FRONTENDnoninteractive# 创建目录结构 WORKDIR /app# 备份原始源文件并更换为…

Blob分析及形态学分析

目录 Blob分析的基本思想&#xff1a; Blob分析主要流程&#xff1a; Blob分析 分割: Binary Threshold 分割: Histogram 分割: 动态阈值 全局阈值与动态局部阈值的比较 形态学处理 连通区域 connetion 形态学算子 特征提取 提取特征 常用相关算子 区域特征&#…

中小河流雨水情监测预报系统解决方案

一、方案概述 中小河流在防洪减灾体系中地位关键&#xff0c;但由于其数量众多、分布广泛&#xff0c;监测预报基础相对薄弱&#xff0c;易引发洪水灾害&#xff0c;威胁沿岸居民生命财产安全。本系统旨在构建完善的中小河流雨水情监测预报体系&#xff0c;提升防洪减灾能力。实…

Abase和ByteKV存储方案对比

Abase 和 ByteKV 是字节跳动内部自研的两款分布式 KV 存储系统&#xff0c;虽然都服务于大规模在线业务&#xff0c;但在设计目标、架构模型、适用场景等方面存在显著差异。以下是核心区别的详细分析&#xff1a; &#x1f527; ‌1. 设计目标与一致性模型‌ ‌Abase‌&#x…

JSON的缩进格式方式和紧凑格式方式

将对象转化为json格式字符串在以缩进的方式显示 HxParamMsg hxCommMsg new HxParamMsg() {name "Tom",age 25 }; string json JsonConvert.SerializeObject(hxCommMsg); var parsed JToken.Parse(json); string data parsed.ToString(Formatting.Indented); // …

设计模式篇:灵活多变的策略模式

引言&#xff1a;从现实世界到代码世界的面向对象在商业策略制定中&#xff0c;企业会根据市场环境选择不同的竞争策略&#xff1b;在军事行动中&#xff0c;指挥官会根据敌情选择不同的战术&#xff1b;在游戏对战中&#xff0c;玩家会根据局势调整作战方式。这种根据情境选择…

Bitvisse SSH Client 安装配置文档

一、软件功能介绍​ Bitvisse SSH Client 是一款功能强大的 SSH 客户端软件&#xff0c;具备以下显著特点&#xff1a;​ 丰富的代理隧道协议支持&#xff1a;支持 socks4、socks4a、socks5 和 http 等多种连接代理隧道协议&#xff0c;为网络连接提供多样选择。​便捷的应用…

DataGear 5.4.1 发布,数据可视化分析平台

DataGear 数据可视化分析平台 5.4.1 发布&#xff0c;BUG修复&#xff0c;具体更新内容如下&#xff1a; 修复&#xff1a;修复SQL数据集使用预编译语法后SQL关键字防注入功能不起作用的BUG&#xff1b;修复&#xff1a;修复内置图表选项disableSetting在图表展示页不起作用的…

Visual Studio install 解决进度条不加载,自动安装失败导致软件无法打开问题

路径 C:\Windows\System32\drivers\etc修改hosts文件&#xff0c;需要右键管理员权限打开。 # Copyright (c) 1993-2009 Microsoft Corp. # # This is a sample HOSTS file used by Microsoft TCP/IP for Windows. # # This file contains the mappings of IP addresses to h…

关于小波降噪、小波增强、小波去雾的原理区分

在传统的图像处理中使用小波分解是一种常见的方法。经常分不清小波降噪和小波增强的区别&#xff0c;简单记录下二者的区别同时再记录一下小波去雾的原理。一、小波降噪原理信号分解小波降噪基于小波变换。它将含噪信号分解成不同尺度&#xff08;频率&#xff09;下的小波系数…

Python商务数据分析——Matplotlib 数据可视化学习笔记

一、Matplotlib 基础认知 1.1 库功能与定位 核心作用&#xff1a;将数据可视化展示&#xff0c;提升数据直观性与说服力 应用场景&#xff1a;绘制折线图、饼图、柱状图等 2D/3D 图表 双接口模式&#xff1a; MATLAB 风格&#xff1a;通过pyplot函数快速绘图&#xff08;自…

GIC控制器(一)

目录 处理器工作模式 异常源 ​编辑寄存器组织结构 异常处理流程 CPSR寄存器 异常向量表 编写异常向量表 CP15协处理器 CP15 协处理器寄存器分组 协处理器指令 C0寄存器 C1寄存器 C12寄存器 C15寄存器 CBAR寄存器 Reset异常 前言&#xff1a; GIC&#xff08;G…

深入解析RS485通信:从原理到Linux驱动开发实践

深入解析RS485通信&#xff1a;从原理到Linux驱动开发实践在工业控制、智能建筑和物联网领域&#xff0c;RS485凭借其强大的抗干扰能力和多节点组网特性&#xff0c;成为长距离可靠通信的首选方案。本文将带您深入理解RS485的核心技术。一、RS485通信技术解析 1.1 RS485与RS232…

Linux系统常用性能分析运维命令

分类命令描述CPU性能分析相关命令mpstat -P ALL 5监控所有CPU的使用情况&#xff0c;间隔5秒后输出一组数据。用于查看是否出现某个CPU占满的情况CPU性能分析相关命令pidstat -u 5 1监控所有进程的CPU使用情况&#xff0c;用于查看是否出现某个进程CPU占用过高的问题CPU性能分析…

HTTP 压缩

介绍 压缩是提升网站性能的关键手段之一。对于某些类型的文件&#xff0c;最大可减少 70% 的大小&#xff0c;从而大幅降低带宽需求。随着时间的推移&#xff0c;压缩算法不断得到优化&#xff0c;新的高效算法也逐渐被客户端和服务器所支持。 在实际应用中&#xff0c;Web 开…