[轉載請註明出處] http://kezeodsnx.pixnet.net/blog

譯者: kezeodsnx

原文: Connect desktop apps using D-BUS

DBUS基本上是一個IPC的實作。然而,因其特色使DBUS不止是另一個IPC的實作。為了解決特定的IPC問題,已有數種實作。CORBA解決OOP複雜的IPC,DCOP是較輕薄的IPC framework,power沒那麼強大,但已整合至KDE。SOAP和XML-RPC則是用在web service,因此使用HTTP為其傳輸協定。而DBUS是為了桌面應用程式與OS之間的通訊。

Desktop application communication

一般桌面都有數個應用程式在執行,且其間常常需要傳遞訊息。DCOP是KDE的solution,但跟KDE綁在一起,無法與其他桌面環境共用。Bonobo則是Gnome的solution。因其基於CORBA,因此相當的笨重。同時也跟kobject綁在一起,因此也無法與其他桌面環境共用。DBUS則是想要同時取代DCOP與Bonobo並與KDE和Gnome整合。DBUS的dependence也盡量保特最小,因此應用程式在使用DBUS時不需擔心一大堆dependence的問題。

Desktop/Operating System communication

本篇所指的operation system不只是kernel,還包括daemon。例如udev,當device插入時,會產生signal (至DBUS)。這考慮到了桌面環境與硬體的緊密結合,使得user有更好的user experience。

D-BUS features

DBUS有幾個有趣的特點,讓它看來更吸引人。

1.protocol是low-latency且low-overhead,在設計時,便著重小而有效率以使訊息來回時間最小化。

2.protocol是binary的,而非文字的,因此不需序列化的流程 (譯註1)。使用上是在本機上處理,因此若DBUS message在網路上傳遞至遠端主機,仍然可被正確地分析。

對開發者來說DBUS是易用的。其連接協定是簡單易懂的,且client library用直覺的方式打包 (wrap)它。library也為其他系統打包:預期Gnome會有GObject的wrapper,而KDE則會有Qt的wrapper。Python的wrapper則已經有了。

最後,DBUS是freedesktop.org的一部份,因此有KDE,Gnome和其他參與者進行設計及實作。

 

The inner workings of D-BUS

DBUS的設定是由數條bus組成。永久存在的system bus是在開機時便啟動。此bus是OS和daemon所使用,且非常安全,因此不是隨便的應用程式就可以唬嚨系統,亂發event。還有數條session bus,當user登入後啟動,對該user來說是私有的。該user的應用程式也是用session bus通訊。應用程式需要接收訊息可連上system bus,但要送訊息到system bus則是有限制的。

當應用程式連上bus,需用matcher聲明要接受哪種訊息。matcher利用interface,object path和method (如下述)來指定要訊息接收的規則。這使用應用程式得以專注於其該處理的事,達到有效的訊息轉發, 且讓參與該訊息的相關人等免於應用程式的效能像在地上爬。

Objects

本質上,DBUS是peer to peer的協定。每個訊息都有來源和目的地。這些位址就是object path。概念上,使用 dbus的應用程式都有一組object,且訊息是在這些object間傳遞,而非在應用程式(譯註2)。

此外,object可support一個或多個interface。這些interface類似於java或C++ virtual class的interface。然而,並沒有檢查object是否實作其宣稱有實作的option,且也沒有方法由obect本身列出其支援的interface。interface是用來給method name的命名空間(譯註3),因此,一個object可有相同名字但不同interface的method,

(譯註4)

Messages

DBUS有4種message:method calls,method returns,signals和errors。執行一個DBUS object的method的方法為送一個method call給該object。該method處理完後,便回傳message return或error。signal是不同的,因為它不能回傳任何東西。並沒有signal return message,也沒有任何其他類型的error訊息。

訊息可以任意的參數 (argument)。參數是強型別(strongly-typed,譯註5),其型別從基本的(booleans,bytes,integers)到結構化的(strings,arrays,和dictionaries)都有

 

Services

Serice是DBUS中最高層的抽像化,且使實作正在增加中。應用程式可在bus上註冊service。成功後,該應用程式即取得該service。其他應用程式可檢查特定service是否存在且要求bus啟動該service。

Use cases

如前述,udev可將DBUS build進去,因此當裝置插入後,udev便可發signal。其他的應用程式可監聽這些event並做相對的處理。例如,gnome-volume-manager可偵測usb插入並自動mount起來,或當相機插入後,自動下載照片。

 

譯註1:這應該是指binary的執行效率較佳,在處理訊息時的overhead低。

譯注2: 應用程式可任意註冊多個obect。

譯注3:interface的目的是讓同樣的method name被不只一次被使用,只要指定到底哪些method是有參與的。如:org.freedesktop.DBus 是一個interface。

譯註4: 可將object想成程式裡的object,只是其指向object path而非memory address。object path就像linux的檔案路徑,如/org/freedesktop/DBus是一個object。

譯註5. 指參數都要的型別(type),避免未知的錯誤。

 

只想了解DBUS,沒有要實作,到這邊就夠了。

Reference:

Get on D-BUS

 

 

 

 

 

 

 



kezeodsnx 發表在 痞客邦 PIXNET 留言(0) 人氣()