zoukankan      html  css  js  c++  java
  • 【转】openwrt中ubus

    摘自:https://www.nps.ink/202460.html

    参考链接:

    openwrt中ubus的具体使用

    openwrt ubus的wiki

    [openwrt] 使用ubus实现进程通信

    [openwrt] ubus实现进程间通信举例

    openwrt ubus简介以及libubus开发说明

    ubus [1] – ubusd

    ubus [2] – libubus

    ubus [3] – cli

    libubox组件(1)——usock

    libubox组件(2)——blob/blobmsg

    libubox组件(3)——uloop

    ubus数据结构和接口介绍

    ubus简介

    ubus是为了OpenWrt中守护进程和应用程序之间通讯开发的,类似桌面的DBus,设计理念上与DBus基本保持一致,区别是简化的API和简练的模型,以适应embeddedrouter的特殊环境。与DBus一样也是使用socket实现。

    核心部分是ubusd守护进程,它提供了其他守护进程将自己注册以及发送消息的接口。因为这个,接口通过使用Unixsocket来实现,并使用TLV(type-length-value)消息,ubus内部使用Blob_buf,Blob_attr等结构来表示。

    ubus有两种调用,一个是method调用,一个是notification,其中method包括等待函数返回和不用等待返回,notification是广播和DBus的signal类似。ubus使用是先建立连接,然后把连接加入epollset中。

    下面是它的一些调用API。
    uloop_init(); 创建epoll句柄,最多监听32个fd
    ubus_connect(); 创建ubus连接
    ubus_add_uloop(); 把创建的ubus连接注册到epoll中。
    ubus_add_object(); 注册对象到的ubus连接。
    uloop_run(); 等待I/O事件发生,调用相对应的对象的功能函数。
    ubus_free(); 关闭ubus连接
    uloop_done(); 关闭epoll句柄

    ubusd启动

    属于procd启动的一项:

    /etc/preinit –> /sbin/init –> /sbin/procd –> /sbin/ubusd

    注册ubus服务的应用

    pathDescriptionPackage
    dhcp dhcp server odhcpd
    file file rpcd
    hostapd acesspoints wpad/hostapd
    iwinfo wireless informations rpcd iwinfo
    log logging procd
    mdns mdns avahi replacement mdnsd
    network network netifd
    service init/service procd
    session Session management rpcd
    system system misc procd
    uci Unified Configuration Interface rpcd

    ubus客户端

    ubus调试有一个命令行工具叫ubus,ubus可以和ubusd服务器交互(和当前所有已经注册的服务).它对研究和调试注册的命名空间以及编写脚本非常有用。

    可以调用带参数和返回信息的方法,它使用友好的JSON格式。

    ubus命令使用说明

        ubus命令用于控制调试相关ubus接口,主要命令说明如下:

         – list [<path>]                        List objects

         – call <path> <method> [<message>]     Call an object method

         – listen [<path>…]                   Listen for events

         – send <type> [<message>]              Send an event

         – wait_for <object> [<object>…]      Wait for multiple objects to appear on ubus

      

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

    root@uplink:~# ubus list
    network
    network.device
    network.interface.lan
    network.interface.loopback
    network.interface.wan

    root@uplink:~# ubus -v list network.interface.lan
    'network.interface.lan' @099f0c8b
    	"up": {  }
    	"down": {  }
    	"status": {  }
    	"prepare": {  }
    	"add_device": { "name": "String" }
    	"remove_device": { "name": "String" }
    	"notify_proto": {  }
    	"remove": {  }
    	"set_data": {  }

        ubus call 该命令用于调用ubus中当前注册的接口。示例如下:

    调用无参方法
    root@uplink:~# ubus call network.interface.wan status { "up": true, "pending": false, "available": true, "autostart": true, "uptime": 86017, "l3_device": "eth1", "device": "eth1", "address": [ { "address": "178.25.65.236", "mask": 21 } ], "route": [ { "target": "0.0.0.0", "mask": 0, "nexthop": "178.25.71.254" } ], "data": { } }

     调用有参方法

    root@uplink:~# ubus call network.device status '{ "name": "eth0" }'
    {
    	"type": "Network device",
    	"up": true,
    	"link": true,
    	"mtu": 1500,
    	"macaddr": "c6:3d:c7:90:aa:da",
    	"txqueuelen": 1000,
    	"statistics": {
    		"collisions": 0,
    		"rx_frame_errors": 0,
    		"tx_compressed": 0,
    		"multicast": 0,
    		"rx_length_errors": 0,
    		"tx_dropped": 0,
    		"rx_bytes": 0,
    		"rx_missed_errors": 0,
    		"tx_errors": 0,
    		"rx_compressed": 0,
    		"rx_over_errors": 0,
    		"tx_fifo_errors": 0,
    		"rx_crc_errors": 0,
    		"rx_packets": 0,
    		"tx_heartbeat_errors": 0,
    		"rx_dropped": 0,
    		"tx_aborted_errors": 0,
    		"tx_packets": 184546,
    		"rx_errors": 0,
    		"tx_bytes": 17409452,
    		"tx_window_errors": 0,
    		"rx_fifo_errors": 0,
    		"tx_carrier_errors": 0
    	}
    }

        ubus listen 用于监听ubus相关事件,如果不指定事件名则监听所有事件。(支持通配符*)

    root@uplink:~# ubus listen &
    root@uplink:~# ubus call network.interface.wan down
    { "network.interface": { "action": "ifdown", "interface": "wan" } }
    root@uplink:~# ubus call network.interface.wan up
    { "network.interface": { "action": "ifup", "interface": "wan" } }
    { "network.interface": { "action": "ifdown", "interface": "he" } }
    { "network.interface": { "action": "ifdown", "interface": "v6" } }
    { "network.interface": { "action": "ifup", "interface": "he" } }
    { "network.interface": { "action": "ifup", "interface": "v6" } }

        ubus send 用于发送事件

    root@uplink:~# ubus listen &
    root@uplink:~# ubus send foo '{ "bar": "baz" }'
    { "foo": { "bar": "baz" } }

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

    libubus使用

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

    libubus.so:ubus向外部提供的编程接口,例如创建socket,进行监听和连接,发送消息等接口函数。
    libubox.so:ubus向外部提供的编程接口,例如等待和读取消息。
    libblobmsg_json.so,libjson.so:提供了封装和解析json数据的接口,编程时使用libblobmsg_json.so提供的更灵活的接口函数。

    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。如果不得不这样做,需要在调用过程中避免全局变量的重用问题。

  • 相关阅读:
    实现图片旋转木马3D浏览效果
    !important的用法
    css中!important的作用
    js深拷贝和浅拷贝
    Javascript 数组循环遍历之forEach
    javascript高级选择器querySelector和querySelectorAll
    CSS3系列教程:HSL 和HSL
    linux 静态库、共享库
    UNIX网络编程之旅-配置unp.h头文件环境
    apue2e unp安装
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/14241818.html
Copyright © 2011-2022 走看看