`
ihuashao
  • 浏览: 4744920 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

dbus实例讲解(一):初次见面

阅读更多

网上有不少介绍dbus的文章。本文的目标是补充一些简单的例子。

1、dbus是什么东西?

网上有一篇叫“D-Bus Tutorial”的文章,流传较广。不少介绍dbus的资料,都引用了其中的段落。其实相对于这篇文章,我建议大家直接读“D-Bus Specification”,篇幅不算长,文字也不算枯燥。

D-Bus是针对桌面环境优化的IPC(interprocess communication )机制,用于进程间的通信或进程与内核的通信。最基本的D-Bus协议是一对一的通信协议。但在很多情况下,通信的一方是消息总线。消息总线是一个特殊的应用,它同时与多个应用通信,并在应用之间传递消息。下面我们会在实例中观察消息总线的作用。消息总线的角色有点类似与X系统中的窗口管理器,窗口管理器既是X客户,又负责管理窗口。

支持dbus的系统都有两个标准的消息总线:系统总线和会话总线。系统总线用于系统与应用的通信。会话总线用于应用之间的通信。网上有一个叫d-feet的python程序,我们可以用它来观察系统中的dbus世界。

图1、由d-feet观察到的D-Bus世界

D-Bus是一个程序。它提供了API。但我们一般不会直接使用dbus的接口。dbus-glib是GTK版本的dbus接口封装。本文假设读者安装了dbus-glib,我安装的是dbus-glib-0.76。后面还会看到,通过python操纵dbus是多么简单。

2、D-Bus的基本概念

2.1、从例子开始

我写了一个最简单的dbus服务器,它通过dbus提供了一个加法的接口。大家可以下载这个例子。这是一个autotool工程,大家解包后,执行:

./autogen.sh
./configure
make

然后在src目录运行:

./example-service

这时再运行d-feet,连接session bus,在“Bus Name”窗口会看到一个叫“org.fmddlmyy.Test”连接名。

图2、提供D-Bus服务的org.fmddlmyy.Test

选择“org.fmddlmyy.Test”,在右侧窗口点击展开“Object Paths”->“/TestObj”->“Interfaces”->“org.fmddlmyy.Test.Basic”->“Methods”,可以看到一个Add方法。双击Add方法,弹出下面这个对话框:

图3、通过D-Bus接口计算1+2=3

在Parameters窗口输入“1,2”,点击“Execute”按钮,然后在“Output”窗口我们看到了输出结果。我们刚刚创建了一个dbus服务并调用了它。

2.2、名词

我们来解释一下d-feet中出现的名词。

2.2.1、Bus Name

可以把Bus Name理解为连接的名称,一个Bus Name总是代表一个应用和消息总线的连接。有两种作用不同的Bus Name,一个叫公共名(well-known names),还有一个叫唯一名(Unique Connection Name)。

2.2.1.1、可能有多个备选连接的公共名

公共名提供众所周知的服务。其他应用通过这个名称来使用名称对应的服务。可能有多个连接要求提供同个公共名的服务,即多个应用连接到消息总线,要求提供同个公共名的服务。消息总线会把这些连接排在链表中,并选择一个连接提供公共名代表的服务。可以说这个提供服务的连接拥有了这个公共名。如果这个连接退出了,消息总线会从链表中选择下一个连接提供服务。公共名是由一些圆点分隔的多个小写标志符组成的,例如“org.fmddlmyy.Test”、“org.bluez”。

2.2.1.2、每个连接都有一个唯一名

当应用连接到消息总线时,消息总线会给每个应用分配一个唯一名。唯一名以“:”开头,“:”后面通常是圆点分隔的两个数字,例如“:1.0”。每个连接都有一个唯一名。在一个消息总线的生命期内,不会有两个连接有相同的唯一名。拥有公众名的连接同样有唯一名,例如在前面的图中,“org.fmddlmyy.Test”的唯一名是“:1.17”。

有的连接只有唯一名,没有公众名。可以把这些名称称为私有连接,因为它们没有提供可以通过公共名访问的服务。 d-feet界面上有个“Hide Private”按钮,可以用来隐藏私有连接。

2.2.2、Object Paths

Bus Name确定了一个应用到消息总线的连接。在一个应用中可以有多个提供服务的对象。这些对象按照树状结构组织起来。每个对象都有一个唯一的路径(Object Paths)。或者说,在一个应用中,一个对象路径标志着一个唯一的对象。

“org.fmddlmyy.Test”只有一个叫作“/TestObj”的对象。图1中的“org.bluez”有多个对象路径。

2.2.3、Interfaces

通过对象路径,我们找到应用中的一个对象。每个对象可以实现多个接口。例如:“org.fmddlmyy.Test”的“/TestObj”实现了以下接口:

  • org.fmddlmyy.Test.Basic
  • org.freedesktop.DBus.Introspectable
  • org.freedesktop.DBus.Properties

后面讲代码时会看到,我们在代码中其实只实现了“org.fmddlmyy.Test.Basic”这个接口。接口“org.freedesktop.DBus.Introspectable”和“org.freedesktop.DBus.Properties”是消息总线提供的标准接口。

2.2.4、Methods和Signals

接口包括方法和信号。例如“org.fmddlmyy.Test”的“/TestObj”对象的“org.fmddlmyy.Test.Basic”接口有一个Add方法。后面的例子中我们会介绍信号。

标准接口“org.freedesktop.DBus.Introspectable”的Introspect方法是个很有用的方法。类似于Java的反射接口,调用Introspect方法可以返回接口的xml描述。我们双击 “org.fmddlmyy.Test”->“/TestObj”->“org.fmddlmyy.Test.Basic”->“org.freedesktop.DBus.Introspectable”的Introspect方法。这个方法没有输入参数,我们直接点击“Execute”按钮,你在“Output”窗口看到了什么?

图4、调用Introspect方法

后面我们会用另一种方式调用Introspect方法。

2.3 小结

“org.fmddlmyy.Test”->“/TestObj”->“org.fmddlmyy.Test.Basic”->“org.freedesktop.DBus.Introspectable”的Introspect方法,这个描述是不是很麻烦。其实前面还要加上“session bus”。

后面在看客户端的C代码时,我们会看到同样的过程:用dbus_g_bus_get得到到session bus的连接。在这个连接上用dbus_g_proxy_new_for_name函数获得到拥有指定公共名的连接的指定对象的指定接口的代理。最后,用dbus_g_proxy_call函数通过接口代理调用接口提供的方法。

3 下集预告

d-feet虽然很方便,但它使用了python的gtk模块,在一些嵌入式环境可能使用不了。后面会看到,用一个叫dbus-send的命令行工具,或者写几行python脚本都可以完成同样的工作。我们还会用一个叫dbus-monitor的命令行工具观察dbus调用过程中究竟发生了什么?

分享到:
评论

相关推荐

    linux DBUS 实例讲解

    ### Linux DBUS 实例讲解 #### 一、DBUS 是什么? D-Bus是一种轻量级的进程间通信(IPC)机制,专为Linux和其他类Unix操作系统设计,主要用于桌面环境中不同应用程序之间的通信以及应用程序与系统内核之间的通信。相...

    python-dbus-next::bus:下一个支持asyncio的Python下一个出色的DBus库

    下一个很棒的Python DBus库。 python-dbus-next是DBus的Python库,旨在成为功能齐全的高级库,主要用于将应用程序集成到Linux桌面和移动环境中。 桌面应用程序开发人员可以通过实现常见的DBus标准接口或创建自定义...

    dbus-glib使用教程

    其形如一个 DBUS 代理服务器,由它进行所有 DBUS 消息的遍历与转发,服务端与消息发送端只需要向 DBUS deamon 申请注册唯一的 DBUS name 、绑定 GOBJECT 后,DBUS deamon 就会将申请连到该 DBUS name 的 DBUS 信息...

    dbus-udisks2:用于与 UDisks2 DBus API 交互的 Rust 库

    use dbus::connection::{Connection, ConnectionItem}; use dbus::arg::{RefArg, Variant}; use dbus_udisks2::{ObjectManager, ObjectPath, Drive, Block}; fn main() { let conn = Connection::system().unwrap...

    dbus-async:异步DBus库

    一个纯Rust编写的异步DBus库。 用法 将此添加到您的Cargo.toml : [ dependencies ] dbus-async = " ~2.1.0 " 您必须指定应使用哪个Tokio Runtime。 对于多线程,请将其添加到您的Cargo.toml : [dependencies....

    基于dbus-glib注册总线接口实例

    DBus 是一个轻量级的消息总线系统,允许不同进程之间交换消息,而DBus-Glib 是一个 C 语言库,它为DBus 提供了更方便的绑定,尤其适合用在 GLib 和 GTK+ 的应用程序中。在这个实例中,我们将探讨如何在 C/C++ 中使用...

    QtDbus资料集合

    2. **QtDbus的signal通讯例程**:这部分可能包含如何定义、发射和接收DBus信号的实例,演示如何在不同进程之间进行实时通信。 3. **QtDbus的method通讯例程**:这里会展示如何定义DBus方法,以及如何在客户端和...

    QT DBUS通讯小程序

    QT DBUS通讯小程序是一种利用QT库和DBus技术实现的跨进程通信工具。DBus是一个轻量级的、基于消息的协议,允许不同的应用程序之间交换信息,它在Linux和其他类Unix系统中广泛使用。在这个项目中,QT作为一个强大的多...

    D-BUS实例讲解

    ### D-BUS实例讲解知识点梳理 #### 一、D-BUS简介及基本概念 ##### 1.1 D-BUS的概念 - **定义**: D-BUS是一种进程间通信(IPC)机制,专门针对桌面环境进行了优化设计,使得不同进程之间能够进行有效、便捷的通信...

    Dbus简介和例程

    DBus是Linux系统中的一种消息总线服务,它允许不同的应用程序之间进行通信,实现了进程间通信(IPC,Inter-Process Communication)。DBus的核心理念是提供一种简单、高效且安全的方式来协调和同步多个运行在相同...

    dbus绿色版支持Windows10,基于dbus-1.13.6编译

    DBus,全称Desktop Bus,是Linux桌面环境中的一个核心组件,用于进程间通信(IPC,Inter-Process Communication)。它提供了一种高效、轻量级的方式来让不同进程之间交换信息,协调工作。DBus的设计使得应用程序无需...

    QT中dbus的应用程序

    QT中的DBus是一个强大的进程间通信(IPC)框架,允许应用程序之间进行实时通信,分享数据和服务。DBus基于消息传递模型,采用XML定义接口,使得不同语言编写的程序可以互相调用方法、发送信号和处理事件。在QT中使用...

    linux下的多进程通讯DBUS例程

    linux下的总线通讯DBus的一个实例,还不错。

    DBus_C_API_Lowlevel

    - **信号**:一种发布/订阅模型,一个进程可以发出信号,其他进程可以监听并响应。 2. **DBus连接和会话**: - **连接管理**:使用`dbus_bus_get()`获取到消息总线的连接,通常有SESSION和SYSTEM两种总线。 - **...

    p5-Protocol-DBus:CPAN的协议

    my $dbus = Protcol::DBus::Client::system(); # Authentication and “Hello” call/response: $dbus->initialize(); $dbus->send_call( path => '/org/freedesktop/DBus', interface => 'org....

    dbus基础知识

    DBus 是一个在 Linux 和其他 Unix-like 操作系统中广泛使用的进程间通信(IPC)机制,它允许不同的应用程序之间共享服务和传递消息。DBus 的设计目标是简化桌面环境中的组件交互,但它的应用范围已经超越了桌面环境...

    android dbus应用

    在 Android 系统中,DBus 是一个基于 Linux DBus 技术实现的进程间通信(IPC, Inter-Process Communication)框架。DBus 允许不同进程之间的应用程序通过发送消息来相互协作,实现了服务的发布、订阅和调用,是 ...

    dbus-1.12.10.tar.gz(普通资源,通通5币)

    DBus是Linux系统中的一种消息总线服务,它允许不同的应用程序之间进行相互通信。DBus-1.12.10是DBus的一个特定版本,这里我们深入探讨一下这个版本的细节和相关知识点。 DBus的核心功能是作为进程间通信(IPC, ...

    samples-dbus:说明 D-BUS 基本使用的示例代码

    libdbus是 D-Bus 本身提供的库,并暴露了一个低级 API。 GDBus是GLib从 2.26 开始对 D-Bus 的支持。 它简化了 D-Bus 编程的细节,旨在取代 DBus-GLib 绑定​​。 它提供了和API。服务器服务器导出单个对象,可以在 ...

    dbus_1.8.tar.gz

    DBus,全称Desktop Bus,是Linux桌面环境中的一个核心组件,用于进程间通信(IPC,Inter-Process Communication)。DBus的设计目标是提供一种简单、高效且可靠的方式来让不同的应用程序之间交换消息,实现服务发现和...

Global site tag (gtag.js) - Google Analytics