如何区分 UBUS 交互中的客户端和服务端角色?

在 UBUS(OpenWrt 的微总线系统)中,客户端(Client) 和 服务器端(Server) 的角色区分主要基于它们的交互行为和服务注册机制。以下是具体的区分方法:


1. 服务器端(Server)的特征

服务器端是 服务的提供者,负责:

  • 注册对象和方法:向 UBUS 总线声明可调用的服务。
  • 处理请求:接收客户端调用并返回响应。
  • 主动通知事件:通过 UBUS 发送事件(如状态变化)。

识别方式

  • 命令行

通过 ubus list 列出的对象均为服务器端注册的服务:

ubus list -v # 显示对象及其方法

输出示例:

network.interface.lan @8f31a012 status: {} up: {} down: {}
    • network.interface.lan 是服务端注册的对象,提供 status、up 等方法。
  • 代码实现

服务端代码通常会调用以下 API:

// 注册对象和方法 
ubus_add_object(ctx, &obj); // 对象注册 
ubus_register_method(ctx, obj, "method_name", handler_func); // 方法注册

2. 客户端(Client)的特征

客户端是 服务的调用者,负责:

  • 查找服务:通过 UBUS 总线查询可用对象和方法。
  • 发起调用:向服务端发送请求并处理响应。
  • 监听事件:订阅服务端发布的通知。

识别方式

  • 命令行

使用 ubus call 或 ubus monitor 的是客户端:

ubus call network.interface.lan status # 调用服务端方法
ubus monitor network.interface # 监听服务端事件
  • 代码实现

客户端代码通常会调用以下 API:

// 调用远程方法

 ubus_invoke(ctx, obj_id, "method_name", req, &resp, timeout); 

// 订阅事件 

ubus_subscribe(ctx, &sub, "object_name");

3. 核心区分标准

特征

服务器端(Server)

客户端(Client)

角色

服务提供者

服务消费者

UBUS 操作

注册对象和方法(ubus_add_object)

调用方法(ubus_call)

数据流向

接收请求 → 返回响应

发送请求 → 接收响应/事件

典型工具

不直接使用命令行,由后台服务实现

ubus call、

ubus monitor

代码 API

ubus_register_method()

ubus_invoke()、

ubus_subscribe()


4. 实际场景示例

服务端(Server)示例

  • 服务:netifd(OpenWrt 网络管理守护进程)
    • 注册对象:network.interface.lan
    • 提供方法:up、down、status
    • 代码片段:

// 注册网络接口对象

static struct ubus_method netifd_methods[] = {

UBUS_METHOD("up", netifd_handle_up),

UBUS_METHOD("status", netifd_handle_status), 

};

ubus_add_object(ctx, &netifd_obj);

客户端(Client)示例

  • 脚本:通过命令行重启 WAN 接口
ubus call network.interface.wan down ubus call network.interface.wan up
  • 代码片段:

// 调用重启方法

uint32_t obj_id = ubus_lookup_id(ctx, "network.interface.wan"); 
ubus_invoke(ctx, obj_id, "down", NULL, NULL, 1000);

5. 特殊注意事项

         1.双向角色

一个进程可以同时是客户端和服务端(例如:A 进程调用 B 进程的方法,同时自身也注册了方法供其他进程调用)。

        2.匿名客户端

 通过 ubus call 直接调用的命令行工具是临时客户端,调用后立即退出。

        3.服务端生命周期

服务端崩溃后,其注册的对象会从 UBUS 总线自动移除,客户端调用将返回 "Object not found" 错误。


通过以上方法,可以清晰区分 UBUS 交互中的客户端和服务端角色。

你可能感兴趣的:(openwrt,C,ubus)