openwrt中ubus的具体使用

本文介绍 OpenWRT 中的 ubus 机制,一种类似于 DBus 的守护进程与应用程序间通信方式。ubus 采用简化 API 和模型设计,适用于嵌入式路由器环境。文章详细解释了 ubus 的核心组件、工作原理及其提供的主要 API 函数。

转自: http://www.fx114.net/qa-26-169704.aspx#__RefHeading__28_50040687


openwrt ubus的wiki


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句柄


ubus调试有一个命令行工具叫ubus,ubus可以和ubusd服务器交互(和当前所有已经注册的服务).它对研究和调试注册的命名空间以及编写脚本非常有用。可以调用带参数和返回信息的方法,它使用友好的JSON格式。JSON(JavaScriptObjects Notation)是一种轻量级的数据交换方式,JSON是humannice type,有两种数据结构对象和数组。
对象: {“firstname”:“Brett”,“lastname”:“Mical”}
数组:[“aaa”,“bbb”, “ccc”]


下面是它的命令说明。
ubus Commands:


-list [<path>] List objects


-call <path> <method> [<message>] Call an objectmethod


-listen [<path>...] Listen for events


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


-wait_for <object> [<object>...] Wait for multipleobjects to appear on


ubuslist缺省列出所有向服务器注册的命名空间,如果调用时包含参数-v,将会显示指定命名空间更多方法参数等信息。
ubuscall 调用指定命名空间中指定的方法,并且通过消息传递给它,消息参数必须是有效的JSON字符串,并且携带函数所要求的键及值。
Ubuslisten 设置一个监听socket并观察进入的事件。
Ubussend 发送一个事件提醒。
root@uplink:~#ubus listen &



<think> 嗯,用户想了解OpenWrtubus的blob_buf结构体的相关信息。这个问题很明确,用户应该是OpenWrt开发者或嵌入式系统工程师,正在使用ubus进行进程间通信开发。 从提供的引用内容来看,引用[3]直接展示了blob_buf的使用样例,引用[1]提到了blob_buf用于构建回复数据,引用[2]涉及空间计算,这些都是关键信息点。用户可能正在调试ubus通信,需要理解如何正确初始化和使用这个结构体。 blob_buf是ubus消息传递的核心数据结构,用于封装消息负载。需要重点解释这几个方面:结构体定义(虽然具体字段未公开)、初始化函数blob_buf_init()、数据添加函数如blobmsg_add_string(),以及内存管理特点。 用户可能遇到的实际问题包括:如何添加不同类型的数据?为什么需要指定ID参数?消息构建后如何传递?因此回答要包含典型使用流程和注意事项。考虑到ubus不擅长传输大数据,这点也要特别提醒。 在示例代码选择上,引用[3]的片段很合适,但需要补充注释说明关键步骤。用户看起来有开发基础,所以可以适当深入blobmsg的嵌套机制,但避免过度讨论内部实现。 最后生成的问题要覆盖用户可能延伸的疑问:性能优化、调试方法和替代方案。特别是当用户遇到"空间不足"错误时(如引用[2]提到的计算),如何调整缓冲区大小会是关键痛点。 </think>在OpenWrt的`ubus`进程间通信框架中,**`blob_buf`结构体**是用于构建和解析二进制消息(BLOB)的核心工具。它封装了消息缓冲区的管理逻辑,简化了数据的序列化和反序列化过程。以下是关键要点: ### 核心功能与特性 1. **消息容器作用** `blob_buf`作为二进制数据的容器,用于存储`ubus`通信中的请求参数或响应结果。通过其关联的`blob_attr`链表结构组织数据(引用[^1])。 2. **初始化与内存管理** 使用前必须通过`blob_buf_init()`初始化,该函数自动分配内存并设置初始状态: ```c struct blob_buf b; blob_buf_init(&b, 0); // 第二个参数是内存分配标志(如0表示默认) ``` 内部动态管理缓冲区,开发者无需手动计算内存大小(引用[^2]涉及空间计算逻辑)。 3. **数据添加API** 提供类型安全的函数添加数据,自动处理内存扩展和数据结构对齐: ```c blobmsg_add_string(&b, "key", "value"); // 添加字符串 blobmsg_add_u32(&b, "count", 25); // 添加32位整数 blobmsg_add_table(&b, "config"); // 创建嵌套表 ``` 函数名中的`msg`表明这些API专为`ubus`消息格式设计(引用[^3])。 4. **消息传递流程** 构建完成后,通过`blob_buf`的`head`成员传递数据: ```c ubus_invoke_async(ctx, id, "method", b.head, &req); // b.head指向消息头部 ``` ### 典型使用场景 ```c // 示例:构造包含字符串和整数的消息 blob_buf_init(&b, 0); blobmsg_add_string(&b, "command", "reboot"); // 添加键值对 blobmsg_add_u32(&b, "delay", 5); // 添加整数参数 ubus_invoke(ctx, obj_id, "execute", b.head, ...); // 发送消息 ``` ### 注意事项 - **内存释放**:`blob_buf`不会自动释放内存,需手动调用`free(b.buf)`避免泄漏。 - **数据上限**:单条消息不宜超过128KB(受`ubusd`限制),大量数据传输建议改用其他机制(引用[^4])。 - **嵌套支持**:通过`blobmsg_open_table()`和`blobmsg_close_table()`实现多层结构化数据。 - **类型安全**:接收方需严格匹配数据类型,否则解析会失败(引用[^5]的"封装API"设计)。 ### 与底层结构的关系 `blob_buf`内部封装了`blob_attr`链表(二进制属性块),其结构如下: ```c struct blob_attr { uint32_t id_len; // 低16位为长度,高16位为ID char data[]; // 负载数据 }; ``` `blobmsg`函数族会自动处理`id_len`的编码,开发者只需关注业务数据(引用[^1]的解析过程)。 --- ### 常见问题场景 1. **缓冲区不足** 若添加数据时返回`NULL`,需检查是否因`buf->buflen`不足(引用[^2]),可通过增大`blob_buf_init`初始分配解决。 2. **跨进程解析** 接收方需用`blobmsg_parse()`解析: ```c struct blob_attr *msg[MY_MAX]; blobmsg_parse(my_policy, MY_MAX, msg, blob_data(attr), blob_len(attr)); ``` > 通过`blob_buf`,开发者无需直接操作原始内存块,显著降低了`ubus`通信的开发复杂度(引用[^5])。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值