Qt D-Bus

介绍

        D-Bus是为Linux系统开发的进程间通信(IPC)和远程过程调用(RPC)机制,使用统一的通信协议来代替现有的各种IPC解决方案。它允许系统级进程(如:打印机和硬件驱动服务)和普通用户进程进行通信。

       它使用一个快速的二进制消息传递协议,该协议的低延迟和低消耗特点适用于同一台机器的通信。它的规范目前由freedesktop.org项目定义,可供所有团体使用。

    通信通常经一个叫做“总线”(由于它的名字)的主服务器应用发起,但是直接应用到应用的通信也是可能的。在总线上通信时,应用程序可以查询哪个其它的应用或服务可用,也可以在需要时激活某个应用或服务。

总线

         当需要多对多通信时,就要用到D-Bus总线。为此,主服务器必须要在任何应用连接到总线之前上线:主服务器负责跟踪连接到总线上的应用并适当地负责源应用与目的应用之间消息路由

           另外,D-Bus定义了两条命名总线,分别叫做系统总线(system bus)和会话总线(session bus这两条总线是特别的,因为它们有明确的语义:一些服务定义在其中一条或两条总线上。

       例如,一个应用想查询本机的硬件设备清单,它可能会与系统总线上的某个服务通信,然而打开用户网页浏览器的服务可能会在会话总线上。

          在系统总线上,限制了每个应用允许提供的服务。因此,你有理由相信,如果出现了某个服务,那么它必然由一个可靠的应用提供。

概念


消息

       在底层,应用程序通过D-Bus机制向另一个应用程序发送消息进行通信消息用于传递远程过程调用以及相关的返回值和错误信息在使用总线时,消息有一个目的地址这就意味着它被路由到特定的对象群体,避免了因“群发”和广播带来的阻塞。

         有一种特殊的消息叫做“信号消息”(基于Qt信号和槽机制的一个概念),它没有预设的目的地址。信号消息旨在用于一对多的上下文中,因此它被设计工作于一种“选择性接收”机制之上。

         Qt D-Bus模块将消息的概念完全封装成一个Qt开发者所熟悉的简单的面向对象的方法。大多数情况下,开发者无需关心消息的发送或接收。

服务名

     在总线上通信时,应用程序会获得一个所谓的“服务名”。这是应用程序用来方便同一总线上其它应用程序识别所用的名称。服务名由D-Bus总线守护进程解析,用于应用程序间消息的路由。与服务名类似的概念是IP地址和主机名:一台电脑通常有一个IP地址,根据其向网络提供的服务可能对应有一个或多个主机名。

       另一方面,如果不使用总线,也就不需要服务名。如果仍然与计算机网络比较,那么这相当于对等网络(P2P):一旦知道对方,就不需要用主机名来找到对方或查出它的IP地址。

       事实上,D-Bus服务名的格式与主机名非常相似:点分字母和数字序列。按照惯例,服务名是根据定义该服务的组织机构的域名来命名的。

       例如,D-Bus服务由freedesktop.org定义,可以根据服务名org.freedesktop.DBus在总线上找到该服务。

对象路径

       类似于网络主机,应用程序通过输出对象向其它应用程序提供特定的服务。这些对象组织有序,很像QObject的派生类具有的父子关系。然而,一个不同之处在于,这里有“根对象”的概念,所有对象都具有根对象,根对象是终极父对象。

       我们继续来类比网络服务,对象路径相当于URL路径的一部分:

       就像这样,D-Bus中的对象路径在文件系统中形成类似的路径名:它们是由斜杠分隔的标签,每个标签由字母,数字和下划线("_")构成。它们必须由斜杠开始,但是不能以斜杠结束。

接口

        接口类似于C++的抽象类和Java的interface关键字,定义了一个建立在调用者与被调者之间“契约(contract)”。也就是说,它们建立了方法的名称,信号和可用特性,还有通信时双方预期的行为。

    Qt在其插件系统中,使用了非常相似的机制:C++基本类结合作为唯一标识符的Q_DECLARE_INTERFACE()宏。

    D-Bus接口命名,采用了类似于Qt插件系统普遍采用的方法:标识符通常由定义该接口的实体的域名构成。

速查表

           为了便于记忆命名格式和它们的用途,下面的表格能被用到:

D-Bus概念
类比
命名格式
服务名网络主机名点号分隔(看起来像主机名)
对象路径URL路径斜杠分隔(看起来像路径)
接口插件标识符点号分隔

调试

         当使用D-Bus开发应用程序时,能够获得每个应用程序在总线上收发的消息的一些信息有时是很有用的

         在每个应用程序运行之前设置QDBUS_DEBUG环境变量就能在每单个应用程序基础上使用这一特性。

         例如,在D-Bus遥控汽车例程中通过如下方式运行控制器和汽车,我们可以仅对汽车进行调试:

     examples/dbus/remotecontrolledcar/controller/controller&             

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

          关于消息的信息会写到启动这个应用程序的控制台。

         英文原文地址:http://doc.qt.io/qt-5/qtdbus-index.html






      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值