Qt D-Bus原理剖析

D-Bus介绍

D-Bus是一种进程间通信(IPC)和远程过程调用(RPC)机制,最初是为Linux开发的,目的是用一个统一的协议替代现有的和竞争的IPC解决方案。它还被设计成允许系统级进程(例如打印机和硬件驱动程序服务)和普通用户进程之间进行通信。
它使用了一种快速的二进制消息传递协议,由于其低延迟和低开销,该协议适用于同机通信。它的规范目前由freedesktop.org项目定义,所有各方都可以使用。
通信通常通过称为“总线(bus)”(因此得名)的中央服务器应用程序进行,但是也可以直接进行应用程序到应用程序的通信。当在总线上通信时,应用程序可以查询哪些其他应用程序和服务可用,以及按需激活一个。

The Buses

D-Bus总线用于需要多对多通信时。为了实现这一点,在任何应用程序可以连接到总线之前启动一个中央服务器:该服务器负责跟踪已连接的应用程序,并正确地将消息从源路由到目的地。
此外,D-Bus定义了两个著名的总线,称为系统总线和会话总线。这些总线的特殊之处在于它们具有定义良好的语义:一些服务被定义在这些总线中的一个或两个中。
例如,希望查询附加到计算机上的硬件设备列表的应用程序可能会与系统总线上可用的服务通信,而提供打开用户web浏览器的服务可能会在会话总线上找到。
在系统总线上,还可以期望找到每个应用程序允许提供的服务的限制。因此,可以合理地确定,如果存在某种服务,那么它是由受信任的应用程序提供的。

Concepts

Messages

在底层,应用程序通过D-Bus相互发送消息进行通信。Messages用于中继远程过程调用以及与之相关的应答和错误。当在Bus上使用时,消息有目的地,这意味着它们只被路由到相关方,避免了由于“群集”或广播而造成的拥塞。
但是,一种称为“signal message”的特殊类型的消息(基于Qt的信号和插槽机制的概念)没有预定义的目的地。因为它的目的是在一对多的上下文中使用,所以signal message被设计成通过“选择加入”机制工作。
Qt D-Bus模块将消息的低级概念完全封装为Qt开发人员熟悉的更简单、面向对象的方法。在大多数情况下,开发人员不必担心发送或接收消息。

Service Names

当通过总线通信时,应用程序获得所谓的“Service Names”:这是该应用程序选择由同一总线上的其他应用程序知道的方式。Service Names由D-Bus总线守护进程代理,用于将消息从一个应用程序路由到另一个应用程序。与服务名类似的概念是IP地址和主机名:一台计算机通常有一个IP地址,它可能有一个或多个主机名,根据它向网络提供的服务。
另一方面,如果不使用总线,也不使用服务名称。如果我们再次将其与计算机网络进行比较,这将等同于点到点网络:由于对等点是已知的,因此不需要使用主机名或它的IP地址来查找它。
D-Bus服务名称的格式实际上非常类似于主机名称:它是由字母和数字组成的点分隔序列。通常的做法甚至是根据定义该服务的组织的域名来命名服务名称。
例如,D-Bus服务由freedesktop.org定义,可以在bus上找到服务名称:

org.freedesktop.DBus

Object Paths

与网络主机一样,应用程序通过导出对象向其他应用程序提供特定的服务。这些对象是分层组织的,很像从QObject派生的类所拥有的父子关系。然而,有一个区别是存在“root object”的概念,所有对象都具有最终的父对象。
如果我们继续与Web服务进行类比,则Object Paths等同于URL的路径部分:
在这里插入图片描述
与它们类似,D-Bus中的Object Paths也类似于文件系统中的路径名:它们是斜杠分隔的标签,每个标签由字母、数字和下划线字符(“_”)组成。它们必须以斜杠开始,而不能以斜杠结束.

Interfaces

Interfaces类似于c++抽象类和Java的接口关键字,声明调用者和被调用者之间建立的“契约”。也就是说,它们建立了可用的方法、信号和属性的名称,以及通信建立时双方期望的行为。
Qt在其插件系统中使用了非常类似的机制:c++中的基类通过Q_DECLARE_INTERFACE()宏与惟一标识符相关联。
实际上,D-Bus接口名的命名方式与Qt插件系统所建议的类似:标识符通常由定义该接口的实体的域名构建。

为便于记住命名格式,可使用如下对比表:
在这里插入图片描述

Debugging

在开发使用D-Bus的应用程序时,有时能够看到关于每个应用程序通过总线发送和接收的消息的信息是很有用的。
通过在运行每个应用程序之前设置QDBUS_DEBUG环境变量,可以在每个应用程序的基础上启用该特性。例如,在 D-Bus Remote Controlled Car Example 的例子中,我们只能对小车进行调试,通过控制器和小车的运行方式如下:

examples/dbus/remotecontrolledcar/controller/controller &
QDBUS_DEBUG=1 examples/dbus/remotecontrolledcar/car/car &

有关消息的信息将写到应用程序启动时所在的控制台。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值