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 許可 進一步瞭解細節。
Furthermore, Qt D-Bus in Qt 5.12.12 may contain third party modules under following permissive licenses:
| libdus-1 headers, version 1.12 | 學術免費許可第 2.1 版,或 GNU GPL (一般公共許可) 第 2.0 版或更高版本 |
以下文檔包含 Qt 的 D-Bus 集成特徵的有關信息,且提供通過總綫發送和接收類型信息的機製的有關細節: