D-Bus分析

1.D-Bus 体系:
(1)libdbus库,提供给各个应用程序调用,使应用程序具有通信和数据交换的能力,
两个应用程序可以直接进行通信,就像是一条socket通道,两个程序之间建立通道之后,就可以通讯了。
(2)消息守护进程,在libdbus的基础上创建,可以管理多个应用程序之间的通信。
每个应用程序都和消息守护进程建立dbus的链接,然后由消息守护进程进行消息的分派。
(3)各种包装库,有libdbus-glib,libdbus-Qt等等,目的是将dbus的底层api进行一下封装。

2.Dbus是一套进程通信体系,它有以下几层:
(1)libdbus库,提供给各个应用程序调用,使应用程序具有通信和数据交换的能力,
两个应用程序可以直接进行通信,就像是一条socket通道,两个程序之间建立通道之后,就可以通讯了。
(2)消息守护进程,在libdbus的基础上创建,可以管理多个应用程序之间的通信。
每个应用程序都和消息守护进程建立dbus的链接,然后由消息守护进程进行消息的分派。
(3)各种包装库,有libdbus-glib,libdbus-Qt等等,目的是将dbus的底层api进行一下封装。

3.dbus消息的组成:
dbus中的消息由一个消息头(标识是哪一种消息)和消息数据组成,比socket的流式数据更方便一些。
bus daemon 就像是一个路由器,与各个应用程序进行连接,分派这些消息。
bus daemon 在一台机器上有多个实例,第一个实例是全局的实例,类似于sendmail和或者apache,
这个实例有很严格的安全限制,只接受一些特定的系统消息,用于系统通信。
其他bus daemon是一些会话,用于用户登录之后,在当前会话(session)中进行的通讯。
系统的bus daemon 和会话的bus daemon 是分开的,彼此不会互相影响,会话bus daemon 不会去调用系统的bus daemon

4.Native Objects and Object Paths
在不同的编程语言中,都定义了一些“对象”,如Java中的java.lang.Object,GLIB中的GObject,QT中的 QObject等等。
D-BUS的底层接口,和libdbus API相关,是没有这些对象的概念的,它提供的是一种叫对象路径(object path),
用于让高层接口绑定到各个对象中去,允许远端应用程序指向它们。
object path就像是一个文件路径,可以叫做/org/kde/kspread/sheets/3/cells/4/5等。

5.Methods and Signals
每个对象都有一些成员,两种成员:方法(methods)和信号(signals),在对象中,方法可以被调用。信号会被广播,
感兴趣的对象可以处理这个信号,同时信号中也可以带有相关的数据。
每一个方法或者信号都可以用一个名字来命名,如”Frobate” 或者 “OnClicked”。

6.Interfaces
每个对象都有一个或者多个接口,一个接口就是多个方法和信号的集合。
dbus使用简单的命名空间字符串来表示接口,如org.freedesktop.Introspectable。可以说dbus接口相当于C++中的纯虚类。

7.Proxies
代理对象用于模拟在另外的进程中的远端对象,代理对象像是一个正常的普通对象。
d-bus的底层接口必须手动创建方法调用的消息,然后发送,同时必须手动接受和处理返回的消息。
高层接口可以使用代理来替换这些,当调用代理对象的方法时,代理内部会转换成dbus的方法调用,
等待消息返回,对返回结果解包,返回给相应的方法。可以看看下面的例子,使用dbus底层接口编写的代码:

 Message message = new Message(“/remote/object/path”, “MethodName”, arg1, arg2);

    Connection connection = getBusConnection();

    connection.send(message);

    Message reply = connection.waitForReply(message);

    if (reply.isError()) {

    } else {

    Object returnValue = reply.getReturnValue();

    }

使用代理对象编写的代码:

Proxy proxy = new Proxy(getBusConnection(),/remote/object/path”);

Object returnValue = proxy.MethodName(arg1, arg2);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章