12 ubus

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
在另一个终端中去执行downup。然后第一窗口便可观察到对象状态的变化

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" }'
上一篇:verilog 序列检测器 状态机 寄存器写法


下一篇:zigbee协议栈的系统相关函数的使用 仿照协议栈写事件