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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章