天天看點

Qt D-Bus原理剖析D-Bus介紹The BusesConceptsDebugging

@[TOC](Qt D-Bus原理剖析

  • D-Bus介紹
  • The Buses
  • Concepts
    • Messages
    • Service Names
    • Object Paths
    • Interfaces
  • Debugging

D-Bus介紹

D-Bus是一種程序間通信(IPC)和遠端過程調用(RPC)機制,最初是為Linux開發的,目的是用一個統一的協定替代現有的和競争的IPC解決方案。它還被設計成允許系統級程序(例如列印機和硬體驅動程式服務)和普通使用者程序之間進行通信。

它使用了一種快速的二進制消息傳遞協定,由于其低延遲和低開銷,該協定适用于同機通信。它的規範目前由freedesktop.org項目定義,所有各方都可以使用。

通信通常通過稱為“總線(bus)”(是以得名)的中央伺服器應用程式進行,但是也可以直接進行應用程式到應用程式的通信。當在總線上通信時,應用程式可以查詢哪些其他應用程式和服務可用,以及按需激活一個。

The Buses

D-Bus總線用于需要多對多通信時。為了實作這一點,在任何應用程式可以連接配接到總線之前啟動一個中央伺服器:該伺服器負責跟蹤已連接配接的應用程式,并正确地将消息從源路由到目的地。

此外,D-Bus定義了兩個著名的總線,稱為系統總線和會話總線。這些總線的特殊之處在于它們具有定義良好的語義:一些服務被定義在這些總線中的一個或兩個中。

例如,希望查詢附加到計算機上的硬體裝置清單的應用程式可能會與系統總線上可用的服務通信,而提供打開使用者web浏覽器的服務可能會在會話總線上找到。

在系統總線上,還可以期望找到每個應用程式允許提供的服務的限制。是以,可以合理地确定,如果存在某種服務,那麼它是由受信任的應用程式提供的。

Concepts

Messages

在底層,應用程式通過D-Bus互相發送消息進行通信。Messages用于中繼遠端過程調用以及與之相關的應答和錯誤。當在Bus上使用時,消息有目的地,這意味着它們隻被路由到相關方,避免了由于“群集”或廣播而造成的擁塞。

但是,一種稱為“signal message”的特殊類型的消息(基于Qt的信号和插槽機制的概念)沒有預定義的目的地。因為它的目的是在一對多的上下文中使用,是以signal message被設計成通過“選擇加入”機制工作。

Qt D-Bus子產品将消息的低級概念完全封裝為Qt開發人員熟悉的更簡單、面向對象的方法。在大多數情況下,開發人員不必擔心發送或接收消息。

Service Names

當通過總線通信時,應用程式獲得所謂的“Service Names”:這是該應用程式選擇由同一總線上的其他應用程式知道的方式。Service Names由D-Bus總線守護程序代理,用于将消息從一個應用程式路由到另一個應用程式。與服務名類似的概念是IP位址和主機名:一台計算機通常有一個IP位址,它可能有一個或多個主機名,根據它向網絡提供的服務。

另一方面,如果不使用總線,也不使用服務名稱。如果我們再次将其與計算機網絡進行比較,這将等同于點到點網絡:由于對等點是已知的,是以不需要使用主機名或它的IP位址來查找它。

D-Bus服務名稱的格式實際上非常類似于主機名稱:它是由字母和數字組成的點分隔序列。通常的做法甚至是根據定義該服務的組織的域名來命名服務名稱。

例如,D-Bus服務由freedesktop.org定義,可以在bus上找到服務名稱:

org.freedesktop.DBus
           

Object Paths

與網絡主機一樣,應用程式通過導出對象向其他應用程式提供特定的服務。這些對象是分層組織的,很像從QObject派生的類所擁有的父子關系。然而,有一個差別是存在“root object”的概念,所有對象都具有最終的父對象。

如果我們繼續與Web服務進行類比,則Object Paths等同于URL的路徑部分:

Qt D-Bus原理剖析D-Bus介紹The BusesConceptsDebugging

與它們類似,D-Bus中的Object Paths也類似于檔案系統中的路徑名:它們是斜杠分隔的标簽,每個标簽由字母、數字和下劃線字元(“_”)組成。它們必須以斜杠開始,而不能以斜杠結束.

Interfaces

Interfaces類似于c++抽象類和Java的接口關鍵字,聲明調用者和被調用者之間建立的“契約”。也就是說,它們建立了可用的方法、信号和屬性的名稱,以及通信建立時雙方期望的行為。

Qt在其插件系統中使用了非常類似的機制:c++中的基類通過Q_DECLARE_INTERFACE()宏與惟一辨別符相關聯。

實際上,D-Bus接口名的命名方式與Qt插件系統所建議的類似:辨別符通常由定義該接口的實體的域名建構。

為便于記住命名格式,可使用如下對比表:

Qt D-Bus原理剖析D-Bus介紹The BusesConceptsDebugging

Debugging

在開發使用D-Bus的應用程式時,有時能夠看到關于每個應用程式通過總線發送和接收的消息的資訊是很有用的。

通過在運作每個應用程式之前設定QDBUS_DEBUG環境變量,可以在每個應用程式的基礎上啟用該特性。例如,在 D-Bus Remote Controlled Car Example 的例子中,我們隻能對小車進行調試,通過控制器和小車的運作方式如下:

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

有關消息的資訊将寫到應用程式啟動時所在的控制台。

繼續閱讀