用 ubus 实现进程间通信

0. 概述

ubus 是 openwrt 平台开发的,基于 unix socket 的进程间通信框架,包含守护进程、命令行工具和链接库,守护进程 ubusd 作为 socket server ,用户可用 lua 或者 C 语言的 API 实现 socket client ,client 和 server 之间用 json 格式进行通信,client 端的消息处理抽象处理对象(object)和方法(method)。ubus 通过对 socket 的封装,简化了进程间通信的步骤,只需按照固定模式调用 ubus 提供的API即可。有两种常见的应用场景:

  1. 服务器-客户端的形式,进程 A 注册一系列服务,进程 B 调用这些服务
  2. 订阅-通知的形式,进程 A 提供订阅服务,其他进程可用订阅或者退订这些服务,进程 A 可用向所有订阅者发布消息

1. 安装

ubus 是用 cmake ,依赖 libubox ,libubox 需要 libjson 和 lua ,依次安装:

sudo apt-get install cmake
sudo apt-get install libjson0-dev libjson0
sudo apt-get install lua5.1-dev
git clone http://git.openwrt.org/project/libubox.git
cd libubox
mkdir build
cmake ../
make
sudo make install

然后编译安装 ubus :

git clone http://git.openwrt.org/project/ubus.git
cd libubox
mkdir build
cmake ../
make
sudo make install

2. libubox

libubox 是一个工具库,主要提供以下功能:

  1. 提供一套基于事件驱动的机制
  2. 提供多种开发接口,如链表、平衡查找二叉树、md5、json 等

2.1. list.h

这个文件实现了链表结构,并提供了很多操作方法,被其他文件引用。链表结构:

struct list_head {
    struct list_head *next;   //下一个节点
    struct list_head *prev;   //上一个节点
};

2.2. utils.h

2.2.1. ARRAY_SIZE(arr)

这是一个宏,返回数组 arr 的元素格式

B64_ENCODE_LEN(_len)

B64_DECODE_LEN(_len)

calloc_a(len, ...)

int b64_encode(const void *src, size_t src_len, void *dest, size_t dest_len)

base64 编码函数,将原信息 src 按 base64 格式编码,存放到 dest 中。

int b64_decode(const void *src, void *dest, size_t dest_len)

base64 解码函数,将 base64 编码格式的数据 src 解码后存放到 dest 中。

Li Shaocheng. Published under BY-NC-SA
Comments
Write a Comment