dbus和qtdbus

Posted 多弗朗强哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dbus和qtdbus相关的知识,希望对你有一定的参考价值。

什么是D-Bus?

D-Bus是一种消息总线系统,用于两个应用之间的通信。
对于进程间通信,D-Bus也可以管理应用的生命周期,

Qt D-Bus

D-Bus是一种linux下进程间通信(IPC)和远程方法调用(RPC)机制,使用统一的通信方式来取代linux下多种IPC竞争状态。
它既可以进行系统级通信(system bus),也可以进行应用级通信(session bus)。
它既可以进行总线通信,也可以进行点对点通信。

总线Bus

D-Bus 总线被设计用于多对多通信方式,因此在使用前需要创建一个中心服务,即总线,然后将应用绑定到总线上,通过总线聚集和分发。
例如,如果要排序硬件设备,就使用系统总线;如果要和浏览器通信,就使用应用总线。

Messages

广播,信号,

Service Names

服务名就是应用的名称,用于一个应用在总线上寻找另一个应用。

和服务名相似的概念是IP地址(IP addresses),一台计算机有一个ip地址,然后会有很多主机根据服务和他通信。

注意,如果总线没有使用,那么服务也不会被使用。再和计算机网络对比一下,这就等同于点对点的网络,由于通信方已知,就不需要主机名或ip地址去找他了。

D-Bus服务名和主机名很像,它是由一系列点和字母组成,通常是使用该组织的域名来命名,如:
org.freedesktop.DBus

Object Paths

和网络主机一样,应用也支持应用间对象的传输,这些对象从 QObject 派生,使用父子关系(树)进行组织。不同的是,所有对象都会有一个最终的根路径。

如果我们继续和网络服务对比,那么对象的组织形式就和URL的组织形式一样:
ftp://ftp.example.com/pub/something

对象路径看起来像文件系统,由斜线,字母,点和下划线组成。他们一定要以斜线“/”开头,但不一定要以斜线“/”结尾。

Interfaces

接口的概念类似于C++的抽象类(abstract classes)和Java的接口关键字(interface),用于调用者(caller)和被调用者(callee)建立联系,在dbus中使用contract代表接口。
可以建立的方式有:

  • methods,方法
  • signals,信号
  • properties,属性

Qt在他的插件系统中使用了一个非常相似的机制,通过Q_DECLARE_INTERFACE()宏来绑定唯一标识符。

QDBusAbstractInterface

QDBusAbstractInterface类是所有D-Bus接口类的基类,允许进行远程接口调用。
由于被生成的代码类也都继承自 QDBusAbstractInterface ,因此这里描述的方法对于生成的代码也是有效的。
另外,生成的代码还提供了成员函数来检测有效性。

QDBusConnection

QDBusConnection类表示一个dbus守护进程的连接。这个类是 D-Bus session 的第一步,使用它你也可以调用远程对象、接口、连接远程信号到本地槽,注册对象等等。

D-Bus 连接是通过 connectToBus() 函数实现的,它开启了一个d-bus服务并进行了一些初始化工作,并使用一个名字绑定连接,以后就可以使用这个名字表示该连接。

销毁连接可以使用 disconnectFromBus() 函数。

一旦连接被销毁,就必须重新建立一个新的连接才能使用。

通信方式有 sessionBus() ,systemBus() 和点对点的方式。

QDBusServiceWatcher

QDBusServiceWatcher类允许用户观察dbus服务的改变。

他有三种观察模式:

  • 只观察注册信息;
  • 只观察未注册信息;
  • 观察所有服务所有权的改变(默认状态)

参考链接: [1] https://en.wikipedia.org/wiki/D-Bus [2] https://www.freedesktop.org/wiki/Software/dbus/ [3] http://doc.qt.io/qt-5/qtdbus-module.html









以上是关于dbus和qtdbus的主要内容,如果未能解决你的问题,请参考以下文章

dbus和qtdbus

使用 QtDBus 支持构建 Qt 4.8

这个 Qt DBus 信号连接代码是不是正确?

如何使用 QtDbus 注册接口和注册方法?

Qt DBus没有收到信号

如何从 Python 将无符号值发送到 dBus