Qt D-Bus

介紹

D-Bus 是最初為 Linux 開發的 IPC (進程間通信) 和 RPC (遠程過程調用) 機製,采用 1 個統一協議替換現有的競爭 IPC 解決方案。它還被設計成允許在係統級進程 (譬如:打印機和硬件驅動程序服務) 和正常用戶進程之間,進行通信。

它使用很快的二進製消息傳遞協議,適於同機通信 (由於它的低延遲和低開銷)。目前,其規範的定義是通過 freedesktop.org 工程,且所有各方可用。

一般而言,通信是透過稱為 Bus (總綫,因此得名) 的中心服務器應用程序發生的,但應用程序直接到應用程序的通信也是可能的。當在 Bus (總綫) 中進行通信時,應用程序可以查詢哪些其它應用程序和服務是可用的,及按需激活它們之一。

總綫

D-Bus 總綫用於當期望多對多通信時。為達成這,需發起中心服務器在任何應用程序可以連接到總綫之前:此服務器負責跟蹤連接的應用程序,並將消息從源正確路由到其目的地。

此外,D-Bus 定義瞭 2 個知名總綫 (稱為係統總綫和會話總綫)。這些總綫的特殊意義是它們具有定義良好的語義:一些服務被定義成能在其中一個或兩個總綫中被找到。

例如,希望查詢附加到計算機硬件設備列錶的應用程序,可能與係統總綫中可用的服務進行通信,而提供打開用戶 Web 瀏覽器的服務則可能在會話總綫上被找到。

在係統總綫,還可以找到對各應用程序允許提供什麼服務的限定期望。因此,可閤理確定,若存在某種服務,則該服務是由受信任的應用程序提供的。

概念

消息

在較低級彆,應用程序通過 D-Bus 相互發送消息進行通信。使用消息能中繼遠程過程調用、及與它們關聯的迴復和錯誤。當通過總綫使用時,消息具有目的地,這意味著它們僅能路由到感興趣各方,避免由於蜂擁 (或廣播) 的擁塞。

一種特殊消息,稱為信號消息 (概念基於 Qt 的 信號和槽 機製),不管怎樣,沒有預定義目的地。由於其目的是在一對多上下文中使用,所以信號消息被設計成在選擇加入機製下工作。

Qt D-Bus 模塊將低級消息概念完全封裝成 Qt 開發者所熟悉的更簡單、麵嚮對象的方式。在大多數情況下,開發者無需擔心消息的發送或接收。

服務名稱

當通過總綫通信時,應用程序獲得所謂的服務名稱:這就是該應用程序選擇被同一總綫中,其它應用程序知道的方式。服務名稱由 D-Bus 總綫代理程序守護,用於將消息從一個應用程序路由到另一個應用程序。與服務名稱類似的概念是 IP 地址和主機名:根據計算機提供給網絡的服務,一颱計算機通常具有一個 IP 地址,且可能具有一個或多個與其關聯的主機名。

另一方麵,若不使用總綫,也不會使用服務名稱。若再將其與計算機網絡進行比較,這相當於點對點網絡:由於對等方是已知的,因此不需要使用主機名來查找它 (或其 IP 地址)。

D-Bus 服務名稱的格式事實上非常類似於主機名:它是由點分隔的字母和數字的序列。常見實踐甚至是根據定義該服務的組織的域名,來命名一服務名稱。

例如,D-Bus 服務的定義通過 freedesktop.org 且可以在總綫中找到以下服務名稱:

org.freedesktop.DBus
					

對象路徑

像網絡主機,應用程序通過導齣對象為其它應用程序提供特定服務。這些對象按層次組織,很像父子關係的類派生自 QObject 占有。不管怎樣,一種差異是存在 "根對象" 概念 (被所有對象作為最終父級擁有)。

若繼續與 Web 服務進行類比,對象路徑等同於 URL 的路徑部分:

像它們,D-Bus 對象路徑的形成類似文件係統路徑名:它們是以斜杠分隔的標簽,各標簽由字母、數字及 _ 下劃綫字符組成。它們必須始終以斜杠開頭,且不能以斜杠結尾。

接口

接口類似 C++ 抽象類和 Java 的 interface 關鍵詞和聲明在調用者和被調用者之間建立的契約。也就是說,它們建立的方法、信號及特性的名稱是可用的,及行為是雙方期望的當建立通信時。

Qt 使用非常類似的機製在其 插件係統 :C++ 中的基類關聯唯一標識符,通過方式 Q_DECLARE_INTERFACE () 宏。

事實上,D-Bus 接口名稱的命名方式與 Qt 插件係統的建議類似:標識符的構造通常來自定義該接口的實體的域名。

備忘單

為便於記住命名格式及其用途,可以使用下錶:

D-Bus 概念 類比 名稱格式
服務名稱 網絡主機名 點分隔 (看起來像主機名)
對象路徑 URL 路徑分量 斜杠分隔 (看起來像路徑)
接口 插件標識符 點分隔

調試

在使用 D-Bus 開發應用程序時,有時,能夠查看各應用程序跨總綫發送和接收的消息的相關信息是有用的。

可以在每個應用程序的基礎上啓用此特徵,通過設置 QDBUS_DEBUG 環境變量,在運行每個應用程序之前。例如,我們隻可以啓用調試,對於小車的 D-Bus 遠程控製車範例 通過以下方式運行控製器和車:

examples/dbus/remotecontrolledcar/controller/controller &
QDBUS_DEBUG=1 examples/dbus/remotecontrolledcar/car/car &
					

有關消息的信息會被寫入到發起應用程序的控製颱。

許可

Qt D-Bus 模塊在商業許可下是可用的來自 Qt 公司 。此外,它在自由軟件許可下也是可用的。從 Qt 5.4 起,這些自由軟件許可是 GNU LGPL (次一般公共許可) 第 3 版 ,或 GNU GPL (一般公共許可) 第 2 版 。見 Qt 許可 進一步瞭解細節。

延伸閱讀

以下文檔包含 Qt 的 D-Bus 集成特徵的有關信息,且提供通過總綫發送和接收類型信息的機製的有關細節: