OpenWrt開發必備軟體模組——ubus

語言: CN / TW / HK

作者|傅寬,單位:中國移動智慧家庭運營中心

​Labs 導讀

OpenWrt 提供了一個系統匯流排ubus,它類似於Linux桌面作業系統的d-Bus,目標是提供系統級的程序間通訊(IPC)功能。ubus在設計理念上與d-Bus基本保持一致,提供了系統級匯流排功能,與d-Bus相比減少了系統記憶體佔用空間,這樣可以適應於嵌入式Linux作業系統的低記憶體和低端CPU效能的特殊環境。

ubus為openwrt平臺開發中的程序間通訊提供了一個通用的框架。它讓程序間通訊的實現變得非常簡單。ubus實現的基礎是unix socket,即本地socket,它比用於網路通訊的inet socket更高效,更具可靠性。unix socket客戶端和伺服器的實現方式和網路socket類似。

Part 01  如何實現一個簡單的unix socket伺服器和客戶

首先,建立一個socket server端,繫結到一個本地socket檔案,並開啟對clients連線的監聽。其次,建立一個或多個socket client端,連線server。client和server相互發送訊息。client或server收到對方訊息後,針對具體訊息進行相應處理。

Part 02  ubus通訊框架

ubus同樣實現了上述元件,並對socket連線以及訊息傳輸和處理進行了封裝。

ubus提供了一個socket server:ubusd。因此開發者不需要自己實現server端。

ubus提供了建立socket client端的介面,並且提供了的客戶端供使用者直接使用。

ubus的內部框架大體如下圖:

其中的Ubus Daemon就是ubusd,它是一個服務管理的伺服器。上圖右下角的元件是一個Client,用於向ubusd請求服務。而左下角是一個服務提供者(相對於ubusd它其實也是個Client,這裡稱之為Server實際上是相對於服務請求者Client而言,不要搞混了)。上圖中Server和Client之間通訊的訊息採用json格式。

Part 03  ubus訊息格式及有效通訊的方式

ubus對client和server之間通訊的訊息為json格式。

ubus對client端的訊息處理抽象出“物件(object)”和“方法(method)”的概念。一個物件中包含多個方法,client需要向server註冊自己的處理方法。物件和方法都有自己的名字,請求方只需在訊息中指定要呼叫的物件和方法的名字即可。

Part 04  ubus引用的一些動態庫

libubus.so:建立socket,進行監聽和連線,傳送訊息等介面函式。

libubox.so:等待和讀取訊息。

libblobmsg.so,libjson.so:提供了封裝和解析json資料的介面,程式設計時不需要直接使用libjson.so,而是使用libblobmsg.so提供的更靈活的介面函式。

使用ubus進行程序間通訊不需要編寫大量程式碼,只需按照固定模式呼叫ubus提供的API介面即可。​