PySide6.QtDBus#
QDBus
QDBusAbstractAdaptor
QDBusAbstractInterface
QDBusAbstractInterfaceBase
QDBusArgument
QDBusConnection
QDBusConnectionInterface
QDBusContext
QDBusError
QDBusInterface
QDBusMessage
QDBusObjectPath
QDBusPendingCall
QDBusPendingCallWatcher
QDBusServer
QDBusServiceWatcher
QDBusSignature
QDBusUnixFileDescriptor
QDBusVariant
QDBusVirtualObject
详细描述#
D-Bus互进程通信和远程过程调用简介。
简介#
D-Bus最初是为Linux设计的,用于替代现有并竞争的互进程通信(IPC)解决方案,以一个统一的协议实现的进程间通信(IPC)和远程过程调用(RPC)机制。它还被设计为允许系统级进程(如打印机和服务驱动程序)与正常用户进程之间的通信。
它使用快速、二进制消息传递协议,由于其低延迟和低开销,非常适合同一机通信。该规范由freedesktop.org
项目定义,并对所有相关方开放。
通常通过名为“总线”的中心服务器应用程序进行通信,但应用程序之间的直接通信也是可能的。在总线上通信时,应用程序可以查询哪些其他应用程序和服务可用,并根据需要激活一个。
总线#
在需要多对多通信时使用D-Bus总线。为了实现这一点,在任意应用程序可以连接到总线之前,首先启动一个中心服务器:该服务器负责跟踪连接的应用程序,以及将消息从源头正确路由到目的地。
此外,D-Bus定义了两个著名的中断,称为系统中断和会话中断。这些中断的独特之处在于它们具有明确的语义:一些服务被定义为存在于这些中断中的一个或两个之中。
例如,一个希望查询连接到计算机的硬件设备列表的应用程序可能会与系统中断上的服务通信,而提供开启用户网页浏览器的服务可能会在会话中断上找到。
在系统中断上,还可以期待找到对每个应用程序可以提供的服务类型的限制。因此,可以合理地肯定,如果有某种服务存在,它是由受信任的应用程序提供的。
消息#
在底层,应用程序通过相互发送消息来通过D-Bus进行通信。消息用于传递远程过程调用以及与之相关的回复和错误。当在总线上传送时,消息具有目的地,这意味着它们只被路由到感兴趣的各方,避免了因“蜂拥”或广播而产生的拥塞。
然而,一种特殊类型的消息称为“信号消息”(基于Qt的信号和槽机制),它没有预定义的目的地。由于其用途是在一对多的情况下使用,信号消息被设计为通过“自愿”机制工作。
Qt D-Bus模块将底层消息的概念完全封装在一个更简单、对Qt开发者熟悉的面向对象方法中。在大多数情况下,开发者无需担心发送或接收消息。
服务名称#
在总线通信时,应用程序获得所谓的“服务名称”:这是该应用程序选择让同一总线上的其他应用程序认识自己的方式。服务名称由D-Bus总线守护进程代理,并用于将消息从一个应用程序路由到另一个应用程序。服务名称与IP地址和主机名的类似概念:计算机通常有一个IP地址,可能有与之相关的服务数量对应的若干主机名。
另一方面,如果未使用总线,则也不使用服务名称。如果我们再次将此与计算机网络进行比较,这相当于点对点网络:由于对等方已知,因此无需使用主机名来找到它或它的IP地址。
D-Bus服务名称的格式实际上与主机名非常相似:它是一系列由点分隔的字母和数字。常见的做法是将服务名称命名为定义该服务组织的域名。
例如,D-Bus服务由freedesktop.org
定义,可以在服务名称下在总线上找到:
org.freedesktop.DBus
对象路径#
像网络主机一样,应用程序通过导出对象为其他应用程序提供特定服务。这些对象是按层次组织的,类似于从QObject
派生的类的父子关系。然而,一个区别是有“根对象”的概念,这是所有对象的最终父代。
如果我们继续用Web服务进行类比,对象路径等同于URL的路径部分。
就像它们一样,D-Bus中的对象路径类似于文件系统上的路径名:它们由斜杠分隔的标签组成,每个标签都由字母、数字和下划线字符(”)组成。它们必须始终以斜杠开头且不能以斜杠结尾。
接口#
接口类似于C++的抽象类和Java的interface
关键字,用于声明调用者与被调用者之间建立的“合同”。也就是说,它们确立了方法、信号和属性的名称,以及在建立通信时双方预期的行为。
Qt在它的插件系统中使用了非常类似的机制:通过Q_DECLARE_INTERFACE()
宏,将C++的基类与一个唯一的标识符关联。
D-Bus接口名称实际上是以类似于Qt插件系统的建议来命名的:一个通常由定义该接口的实体的域名构成的标识符。
速查表#
为了便于记忆命名格式及其用途,可以以下表格使用
D-Bus概念
类比
名称格式
服务名称
网络主机名
点分隔(类似于主机名)
对象路径
URL路径组件
斜杠分隔(类似于路径)
接口
插件标识符
点分隔
调试#
在开发使用D-Bus的应用程序时,有时查看每个应用程序通过总线发送和接收消息的信息是有用的。
可以通过在运行每个应用程序之前设置QDBUS_DEBUG
环境变量来按应用程序启用此功能。例如,我们可以在以下方式中仅对D-Bus遥控汽车示例中的汽车启用调试:运行控制器和汽车
QDBUS_DEBUG=1 python examples/dbus/pingpong/pong.py
有关消息的信息将被写入从应用程序启动的制台上。
使用模块#
要包含模块类的定义,请使用以下指令
import PySide6.QtDBus
进一步阅读#
以下文档包含有关Qt D-Bus集成功能的信息,并提供了有关使用总线发送和接收类型信息的机制详情
类列表#
D |
|||