OpenWrt開發必備軟件模塊——ubus
作者|傅寬,單位:中國移動智慧家庭運營中心
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接口即可。
- 每個開發人員都應該學習的5種編程語言(上)
- 我們一起聊聊包含min函數的棧
- iOS 16值不值得升級,正式版主要功能搶先看
- OpenHarmony3.0如何輕鬆連接華為雲IoT設備接入平台?
- 使用Python輕鬆獲取Binance歷史交易
- 良心推薦!Python爬蟲高手必備的8大技巧!
- 手摸手教你定製 Spring Security 表單登錄
- 為什麼啟動線程不直接調用run(),而要調用start(),如果調用兩次start()方法會有什麼後果
- 種草兩個可以畫 Flowable 流程圖的 Vue 庫!
- 15個提高 Javascript 開發的 技巧
- Spring 使用 Mypy 檢查 30 萬行代碼,總結出三大痛點與六個技巧
- 用Python製作我的核酸檢測日曆
- 前端模塊化的前世今生
- 對 Go2 錯誤處理提案的批判
- 如何使用AuraDB構建Java微服務
- 提升前端開發質量的十點經驗沉澱
- 在生產環境中使用 Linkerd
- 多圖剖析公式 Async=Promise Generator 自動執行器
- 談談ArrayList、Vector和LinkedList 的存儲性能及特性
- 機器學習區塊鏈:最重要的進步和你需要知道的