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