- Ubus介绍
OpenWrt 提供了一个系统总线ubus ,它是为了OpenWrt中守护进程和应用程序之间通讯开发的,类似桌面的DBus,目标是提供系统级的进程间通信(IPC)功能。设计理念上与DBus基本保持一致,提供了系统级总线功能。与d-Bus相比减少了系统内存占用空间,可适应于嵌入式Linux操作系统的低内存和低端CPU性能的特殊环境。与DBus一样也是使用socket实现。
通俗点说,ubus就是一个用于进程间通信的通用框架。ubus具有很强的可移植性,可以很方便的移植到其他Linux平台上使用。
ubus模块被设计用于提供守护进程(daemons)和应用程序(applications)间的通讯,包含了守护进程ubusd、库以及一些例子。ubusd可以认为是一个消息管理服务器(Server),需要通信的进程可以通过提供的libubus使用ubus,而ubus又依赖于ubox
- Ubus 模块的组成
Ubus 模块由3 部分组成
- Ubusd守护进程
- ubus接口库(libubus.so)
- ubus命令行工具
ubus的内部框架大致如下图1所示:
图1 ubus内部框架
ubus提供的功能主要有以下4个方面
- 提供注册对象和方法供其他实体调用。
- 调用其他应用程序提供的注册对象的控制接口。
- 在特定对象上注册监听事件。
- 向特定对象发送事件消息。
-
- ubusd 守护进程
ubus模块的核心是ubusd精灵进程,它提供了一个总线层,在系统启动时运行,负责进程间的消息路由和传递。其他进程注册到 ubusd进程进行消息的发送和接收。这个接口是用Linux文件socket和TLV(类型-长度-值)收发消息来实现的。每一个进程在指定命名空间下注册自己的路径。每一个路径都可以提供带有各种参数的多个函数处理过程,函数处理过程程序可以在完成处理后返回消息。
/etc/init.d/ubus:ubusd精灵进程是由/etc/init.d/ubus启动的,ubusd精灵进程在系统进程启动完成之后立即启动。它是在网络进程 netifd之前启动的,该进程监听一个文件套接字接口和其他应用程序通信。
当ubusd精灵进程启动之后:其他应用程序可基于libubus提供的接口或使用ubus命令行程序来和ubusd进程进行通信。
ubus是为进程间发送消息而设计的,不适合传输大量数据(进程间传输大量数据应采用共享内存)。
-
- ubus接口库(libubus.so)
ubus接口库libubus.so 通过提供下面的API接口,来体现对外实现的功能
函数 |
含义 |
ubus_add_object |
将对象加入的ubus空间中,即客户端可以访问对象。 |
ubus_register_subscriber |
增加订阅通知。 |
ubus_connect |
连接指定的路径,创建并返回路径所代表的ubus上下文。 |
ubus_send_reply |
执行完成方法调用后发送响应。 |
ubus_notify |
给对象所有的订阅者发送通知。 |
ubus_lookup |
查找对象,参数path为对象的路径,如果为空则查找所有的对象。 cb为回调函数,对查找结果进行处理。 |
ubus_lookup_id |
查找对象的id,并将id参数在指针中返回。 |