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接口即可。​