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

Linux D-Bus 详解

在这里插入图片描述

1. D-Bus 是什么?

想象一下,你电脑里的各个软件(比如网络管理器、电源管理器、音乐播放器)都需要互相“聊天”来协同工作。D-Bus 就是 Linux 系统里的一套“公共电话系统”或“公交车系统”,专门负责让这些独立的软件进程(Process)能够安全、方便地互相通信(IPC, Inter-Process Communication)。

它主要做三件事:

  1. 消息传递:A 进程可以给 B 进程发送指令或数据。
  2. 服务发现:A 进程可以查询系统里“谁(哪个进程)提供了我需要的功能”。
  3. 事件广播:一个进程可以向全系统广播一个事件(比如“U 盘已插入”、“网络已断开”),其他感兴趣的进程都能收到。

两条重要的“公交线路”:

  • System Bus(系统总线):系统级的“公交线路”,上面跑的都是系统服务,比如网络管理 (NetworkManager)、登录管理 (logind)、蓝牙服务 (bluez)。通常需要 root 权限才能和它们深入交流。
  • Session Bus(会话总线):用户级的“公交线路”,只服务于你当前登录的桌面会话。比如桌面通知、输入法、音乐播放器控制等。权限归当前用户所有。

2. 核心概念快速入门

要和 D-Bus 上的一个服务通信,你需要知道它的“地址”,这个地址由三部分组成,非常像一个网址或 API 地址:

  1. 服务名 (Bus Name):这是服务的唯一标识,像一个域名。例如:org.freedesktop.NetworkManager
  2. 对象路径 (Object Path):服务内部可以暴露多个对象,用类似文件路径的方式来区分。例如:/org/freedesktop/NetworkManager
  3. 接口 (Interface):对象可以实现多个接口,每个接口定义了一组功能。例如:org.freedesktop.DBus.Properties (专门用来读写属性的通用接口)。

有了这三样,你就可以调用接口里的具体 成员 (Member),成员分为三种:

  • 方法 (Method):可以被调用的函数,比如 Suspend() (休眠)。
  • 信号 (Signal):服务主动发出的广播事件,比如 PropertiesChanged (属性变化了)。
  • 属性 (Property):可以被读取或修改的变量,比如 Connectivity (网络连接状态)。

3. 如何使用 D-Bus?- 命令行实战

我们不需要写代码,只用几个简单的命令就能和 D-Bus 交互。推荐使用现代化的 busctlgdbus 命令。

第 1 步:探索 - 看看总线上有什么服务

首先,让我们看看系统总线上都有哪些“乘客”(服务)。

# 列出系统总线上的所有服务名
busctl list --system

你会看到一长串列表,里面有很多 org.freedesktop.*org.bluez 这样的名字。

第 2 步:深入 - 查看服务提供了什么功能 (自省)

“自省 (Introspection)” 就是获取一个服务的“API 文档”。我们挑一个简单的 org.freedesktop.login1 (登录管理器) 来看一下。

# 查看 login1 服务提供了哪些对象
busctl tree org.freedesktop.login1# 获取 /org/freedesktop/login1 这个对象的详细“API文档”
gdbus introspect --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1

输出会告诉你这个对象有哪些接口 (interface),每个接口里有哪些方法 (method)、信号 (signal) 和属性 (property)。

第 3 步:交互 - 读取一个属性

从刚才的自省结果中,我们发现 org.freedesktop.login1.Manager 接口下有个叫 IdleHint 的属性。我们来读取它。

# 读取 IdleHint 属性的值
busctl get-property org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager IdleHint

这个命令的结构就是:busctl get-property <服务名> <对象路径> <接口名> <属性名>

第 4 步:交互 - 调用一个方法

我们来调用一个不会造成破坏的方法,比如 ListUsers,列出当前登录的用户。

# 调用 ListUsers 方法
busctl call org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager ListUsers

这个命令的结构是:busctl call <服务名> <对象路径> <接口名> <方法名>

第 5 步:监听 - 订阅一个信号

如果你想知道系统什么时候准备休眠,可以监听 login1 发出的 PrepareForSleep 信号。

# 监听 login1 管理器的所有信号
dbus-monitor --system "interface='org.freedesktop.login1.Manager'"

执行后,这个命令会一直运行。你可以尝试挂起系统(如果是在虚拟机里),就会看到它打印出 PrepareForSleep 信号的信息。


4. 一个完整的例子:查询网络状态

假设你想用脚本判断当前电脑是否联网,步骤如下:

  1. 找到网络服务busctl list | grep NetworkManager,得到服务名 org.freedesktop.NetworkManager

  2. 查看它的 APIgdbus introspect --system --dest org.freedesktop.NetworkManager --object-path /org/freedesktop/NetworkManager

  3. 发现关键属性:在输出中找到 org.freedesktop.NetworkManager 接口,里面有个 Connectivity 属性,看起来就是我们想要的。

  4. 读取属性值

    busctl get-property org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.NetworkManager Connectivity
    
    • 输出 u 4 表示完全连接。
    • 输出 u 1 表示无网络连接。
      (这里的 u 代表无符号整数,是 D-Bus 的数据类型签名)。

这样,你就可以把这条命令集成到你的 shell 脚本里了!


5. 总结

D-Bus 并不可怕。对于使用者来说,你只需要记住:

  • 它是一个消息总线,分为 systemsession 两种。
  • 通过 服务名 + 对象路径 + 接口 定位到一个功能。
  • 使用 busctl list发现gdbus introspect查看 APIbusctl get-property/call交互dbus-monitor监听

文章转载自:

http://zqzul8Q0.rxhsm.cn
http://HmyoXkUq.rxhsm.cn
http://jnNoeW2d.rxhsm.cn
http://6FtyxRQO.rxhsm.cn
http://mAzv7Pev.rxhsm.cn
http://uSJicX8R.rxhsm.cn
http://gOiOXxwr.rxhsm.cn
http://spgnBoYO.rxhsm.cn
http://xRHRlMh7.rxhsm.cn
http://PHmFE3j2.rxhsm.cn
http://64oIeckg.rxhsm.cn
http://potxg5E4.rxhsm.cn
http://odiZ1uPx.rxhsm.cn
http://ZqKtE86B.rxhsm.cn
http://AZ5NUep5.rxhsm.cn
http://Ef1Shynq.rxhsm.cn
http://jgfWD7l4.rxhsm.cn
http://msLebN3L.rxhsm.cn
http://ID0aDwoG.rxhsm.cn
http://dRdkzSwV.rxhsm.cn
http://n5AoqmO0.rxhsm.cn
http://QpToEBj0.rxhsm.cn
http://8ypieUU1.rxhsm.cn
http://lSilgUYl.rxhsm.cn
http://OgfI5Jx5.rxhsm.cn
http://GuI3ROio.rxhsm.cn
http://9RfKxQHb.rxhsm.cn
http://9aEFXu6A.rxhsm.cn
http://aFbNS9Kz.rxhsm.cn
http://7oUgE6JO.rxhsm.cn
http://www.dtcms.com/a/377618.html

相关文章:

  • 嵌入式学习笔记.嵌入式系统
  • Redis 与分布式事务:最终一致性的实践艺术
  • Mac M 系列芯片 YOLOv8 部署教程(CPU/Metal 后端一键安装)
  • Java 中String类的常用方法
  • TENGJUN防水TYPE-C连接器:立贴结构与IPX7防护的精密融合
  • 和照片互动?NAS 部署 AI 智能相册,瀑布流+网格双布局!
  • 网络原理——传输层协议TCP基本认识
  • ETF提供流动性 DAT提供创造性
  • 深入理解C++多态:从概念到实现原理
  • ​Premiere Pro 2024 v24.0.0.58 怎么安装?详细教程(附安装包)
  • 关于调用第三方API服务(New API)等出现被Cloudfare拦截问题解决
  • 用 Python UTCP 直调 HTTP、CLI、MCP……
  • 在 QML 中,clip: true 属性对于 AnimatedImage 裁剪无效的问题通常是由于以下原因及解决方案
  • 硬件开发_基于STM32单片机的智能投送小车
  • 开始 ComfyUI 的 AI 绘图之旅-Flux.1文生图(全网首发,官网都没有更新)(七)
  • c++模板的使用
  • docker部署openlist配置SLL证书
  • 设计模式-策略模式深度分析
  • 洛谷P3405 [USACO16DEC] Cities and States S (哈希表法)详解
  • Vue3纯前端同源跨窗口通信移动AGV小车
  • 4.6Vue的OptionApi
  • qqq数据结构补充
  • 【Vue2】解决数组监听问题
  • 2025 AI+SEO实战学习资料合集,入门到精通的实操指南
  • AutoTrack-IR-DR200构建栅格地图全解析:为教育领域打造的SLAM学习实践平台
  • mysql分库分表数据量核查问题
  • 深入浅出理解查找算法:从基础到实践
  • 最简单解决GitHub打不开的问题:Fastgithub的使用
  • 2025树莓派5烧录镜像教程
  • Ruoyi-vue-plus-5.x第七篇多租户与权限管理:7.2 租户管理功能