您的位置:首页 > 其它

ubus介绍

2020-01-15 08:28 3183 查看

1.简介

  openWRT提供了一个系统总线ubus,提供系统级的进程间通信(IPC)功能。

2.ubus命令使用说明

  ubus list [-v] 该命令用于显示当前ubus中注册的接口,其中-v参数用以显示各个接口的详细信息。

  ubus call 该命令用于调用ubus中当前注册的接口。

  bus listen 用于监听ubus相关事件,如果不指定事件名则监听所有事件。

  ubus send 用于发送事件。

  ubus wait_for 用于等待指定项的注册到ubus中。

3.实现框架

  ubus实现的基础是unix socket,建立一个unix socket服务器和客户端一般需要4步:creat server bind socket -> creat client to connect -> send msg -> handle msg.

  ubus实现上这个框架并对msg传输和处理进行了封装:

  1.ubus提供了一个socket server:ubusd

  2. ubus提供了创建socket client端的接口(提供了C、Shell、LUA三种现成的客户端)

  3.消息必须封装位json格式

  4.Client对消息的处理为{对象}{方法}的结构,发送请求方只需在消息中指定要调用的对象和方法的名字即可

  使用ubus时需要引用一些动态库,主要包括:

    1.libubus.so(例如创建socket,进行监听和连接,发送消息等接口函数)

    2.libubox.so(ubus向外部提供的编程接口,例如等待和读取消息)

    3.libblobmsg.so(提供了封装和解析json数据的接口)

4.实现原理

  先举个例子:

1. client1向ubusd注册了两个对象:“interface”和“dotalk”,其中“interface”对象中注册了两个method:“getlanip”和“setlanip”,对应的处理函数分别为func1()和func2()。“dotalk”对象中注册了两个method:“sayhi”和“saybye”,对应的处理函数分别为func3()和func4()。

2. 接着创建一个client2用来与client1通信,注意,两个client之间不能直接通信,需要经ubusd(server)中转。

3. client2就是在前面讲到的shell/lua/C客户端。假设这里使用shell客户端,在终端输入以下命令:

ubus call interface setlanip ‘{“ip”:“10.0.0.1”, “mask”:24}’

ubus的call命令带三个参数:请求的对象名,需要调用的方法名,要传给方法的参数。

4. 消息发到server后,server根据对象名找到应该将请求转发给client1,然后将消息发送到client1,client1进而调用func2()接受参数并处理,如果处理完成后需要回复client2,则发送回复消息。

5.ubus的应用场景和局限性

  ubus可用于两个进程之间的通信,并以类似json格式进行数据交互。ubus的常见场景为:

    1.“客户端--服务器”形式的交互,即进程A注册一系列的服务,进程B去调用这些服务。

    2.ubus支持以“订阅 -- 通知”的方式进行进程通信,即进程A提供订阅服务,其他进程可以选择订阅或退订该服务,进程A可以向所有订阅者发送消息。

  由于ubus实现方式的限制,在一些场景中不适宜使用ubus:

    1.ubus用于少量数据的传输,如果数据量很大或是数据交互很频繁,则不宜用ubus。经过测试,当ubus一次传输数据量超过60KB,就不能正常工作了。

    2.ubus对多线程支持的不好,例如在多个线程中去请求同一个服务,就有可能出现不可预知的结果。

    3.不建议递归调用ubus,例如进程A去调用进程B的服务,而B的该服务需要调用进程C的服务,之后C将结果返回给B,然后B将结果返回给A。如果不得不这样做,需要在调用过程中避免全局变量的重用问题。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
ultra seven 发布了9 篇原创文章 · 获赞 8 · 访问量 3038 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: