【藍牙】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
英文地址,請注明出處:http://en.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 開…