DBus for IPC in Qt
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DBus for IPC in Qt相关的知识,希望对你有一定的参考价值。
参考技术A 获取system bus获取session bus
例子:
Dbus Server
DBus Client
输出:
方式一
方式二
方式三: 异步调用
方式一:
方式二:
同时支持
QStringList, QByteArray
方式一:
方式二:
利用QByteArray实现自定义类型
如果注册对象时,使用QDBusConnection::ExportAllContents, 会导致很多的接口都暴露给用户。 为此, 可以编写Adaptor来控制接口
基本类型
void setAge(int age)
int age() const
void setName(QString name)
void setNames(QStringList names)
void setNames(QByteArray ba)
// 有待测试
类和结构体, 不允许空结构体
struct MyStruct
int key;
QString value;
void setCustom(MyStruct my)
void setCustoms(QList<MyStruct> mystructs)
struct MyStruct
QMap<QString, QVariant> maps;
void setCustom(MyStruct my)
键值队
void setDict(QMap<int, QString> dict);
通过配置文件来实现权限控制。
所有 context=”default” 的策略被应用
所有 group=”connection’s user’s group” 的策略以不定的顺序被应用
所有 user=”connection’s auth user” 的策略以不定顺序被应用
所有 at_console=”true” 的策略被应用
所有 at_console=”false” 的策略被应用
所有 context=”mandatory” 的策略被应用
后应用的策略会覆盖前面的策略。
调用函数
发送信号
监听dbus-daemon的行为
启动后会得到一个地址
设置环境变量 DBUS_SESSION_BUS_ADDRESS
再启动dbus server 和dbus client 都会用这个dbus-daemon 来通信。
参考:
http://blog.csdn.net/mznewfacer/article/details/7475265
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 for IPC in Qt的主要内容,如果未能解决你的问题,请参考以下文章