本片文章主要對D-Bus的基礎做些講解,在後續的文章中會持續輸出更深入的學習内容
官方學習資料
入門指南
- D-Bus官方網站 - D-Bus入門指引
- Python D-Bus 強烈推薦,Python這邊對于D-Bus的概念講解更好了解.
D-Bus API
- D-Bus 底層接口 - API
- gio提供的D-Bus API - GDBus
D-Bus 基礎概念
D-Bus是一個總線系統,用于Linux程序間的通信
D-Bus不僅可以當作守護進行,用于多個應用間的通信,也可以直接用于兩個應用的直接通信而不是通過D-Bus守護程序的方式
D-Bus 主要是用于傳遞Message,支援publish/subscribe的通信方式
D-Bus 中傳遞的資料會指出其資料類型,二不僅僅是原始的資料,另外一個特性是”RPC mechanism” - Remote Procedure Calls (RPC)
GLib 提供了C和D-Bus binding的接口.
D-Bus主要由以下兩個部分構成:
- dbus library, 用于兩個(多個)application通信的接口,d
- dbus daemon, 其它的application可以基于它建立通信,是個橋梁
D-Bus的配置通常在/etc/dbus-1/ 目錄下
D-Bus 常用名詞解釋
-
Address
每一個bus都有一個位址來描述,通常是一個檔案名 例如Unix-domain socket-”/tmp/.hiddensocket”, 這取決與你用了什麼dbus library,用到的底層通信協定不同
-
Connections
bus name是指,建立在dbus上連接配接的名字,而不是bus 的名字.
命名規則: 已.隔開 例如: “com.acme.Foo” , 另外需要兩個或者以上的. 隔開元素. 當連接配接建立起來是bus會配置設定隊唯一的bus name.
-
Object
總線上任何交換資訊的一端總是一個端點,再D-Bus中被叫做object. 一個Object總是由client發起建立的,并存在于該client到bus的連接配接的上下文中. object 是client在總線上提供它能力的方式. 一個clinet可以建立多個object.
dbus 提供了以下三總消息類型:
- client發送到object的請求
- 響應請求,從一個object傳回
- 從object發出一個單向消息廣播到任何連接配接到總線的clent(已經監聽該object).
-
Proxies
Object 可以通過一個引用進行通路,稱之為proxies(代理),是對通路Object做了些封裝. proxiy 是存在于Client的.
-
Methods
當client發送一個請求到一個object,它将這個請求看作調用對象中的方法, object 被要求執行一個特定的、有名稱的操作. 通常當一個client調用一個object上的method,但object未提供時,一般是會報錯的.
-
Signals
Signal 是由object發起的. Client可以注冊一個需要接收的signal指定特定的名字. 當object發起Signal,所有注冊了的client都會收到對應的Signal. 沒有ack.
-
properties
properties (variables other processes can read/write from/to). 也可也直接了解為類中的成員變量
-
Interfaces
可以了解為C++中的命名空間
總結
以上内容隻是對D-Bus做了簡單介紹,後續的文章會補充實際例子和相關的資料類型轉換.
對于實際的例子主要會以自己熟悉的Bluez進行展開,Bluez正是基于D-Bus進行跨程序的通信
另外對于D-Bus的學習,建議以Python-DBus入門,更加簡單.