天天看點

【嵌入式開發基礎】 D-Bus入門 - 基礎概念

本片文章主要對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 提供了以下三總消息類型:

    1. client發送到object的請求
    2. 響應請求,從一個object傳回
    3. 從object發出一個單向消息廣播到任何連接配接到總線的clent(已經監聽該object).
    另外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入門,更加簡單.

繼續閱讀