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" }'