1 ubus
ubus
由三部分組成:精靈進程、接口庫和實用工具
- 精靈進程它提供一個總線層,在設備啟動時負責進程的消息路由和傳遞。其他進程注冊到
ubus
進程進行消息的發送和接收。這個消息是由linux
文件的socket
收發實現的。 - 接口庫名稱為
libubus.so
- 實用工具
ubus
是提供命令行的接口調試工具
2 ubusd
2.1 ubusd
ubusd
是在netifd
之前啟動的。該進程監聽一個文件套接字接口和其他應用程序通信。其他程序可基於libubus
提供的接口或者實用ubus
命令行程序來和ubusd
進行通信
- 提供注冊對象和方法供其他實體調用
- 提供其他應用程序注冊對象的控制接口、
- 在特定對象上注冊監聽事件
- 向特定對象發送事件消息
2.2 ubus
ubus
將消息處理抽象為對象和方法。
一個對象中包含多個方法。發送請求者需要在消息中指定要調用的對象和方法。
客戶端需要向服務器注冊收到特定消息時的處理方法。
ubus
是一個總線型消息服務器,任何消息均可通過ubus進程傳遞
netifd
模塊就是通過libubus
動態鏈接庫提供API
接口向ubus
總線注冊了多個對象和方法
2.3 libubus
常用接口
ubus_add_object : 將對象加入ubus空間,即客戶端可以訪問的對象
ubus_connect : 鏈接指定的路徑,創建並返回路徑所代表的ubus上下文
ubus_send_reply : 發送響應
ubus_notify : 給對象所有的訂閱者發送通知
ubus_lookup :查找對象。path為路徑,如果為空則查找所有對象。cb為回調函數,對查找結果進行處理
ubus_lookup_id : 查找對象的id
ubus_invoke : 調用對象的方法
ubus_send_event : 發送事件消息
ubus_register_event_handler : 注冊事件處理句柄
ubus_register_subscriber : 增加訂閱通知
3 ubus
命令行工具
3.1 list
輸出所有注冊到ubus RPC
服務器的對象。list
命令是通過調用ubus_lookup
接口函數來列出所有的服務器的對象。返回信息由傳入ubus_lookup
函數的第三個參數receive_list_result
處理。這個參數是一個回調函數,結果將輸出到屏幕上。
-v
參數指定對象
ubus list -v iwinfo
3.2 call
命令在指定對象里調用指定的方法並傳遞消息參數。
首先調用ubus_lookup_id
,找到指定對象的ID
,然后通過ubus_invoke
來請求服務器。返回結果使用receive_call_result_data
來處理。
ubus call iwinfo extralna '{"device":"ath0"}'
3.3 listen
設置一個監聽套接字來接收服務器發出的消息。listen
命令是通過ubus_register_event_handler
函數來注冊時間回調處理函數的
使用方法:
在一個終端中去啟動監聽ubus listen
在另一個終端中去執行down
和up
。然后第一窗口便可觀察到對象狀態的變化
ubus call network.interface.wan down
ubus call network.interface.wan up
3.4 send
發送一個通知事件。此事件可使用listen
進行監聽。send
是通過調用ubus_send_event
來實現。程序中調用blobmsg_add_json_from_string
第一個參數:指定對象
第二個參數:消息內容
ubus listen hello
ubus send hello '{ "book":"openwrt" }'