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

上一篇文章介绍了ubus的组件和实现原理,本文通过代码实例介绍使用ubus进行进程间通信的三种方式。

1. invoke的方式实现端对端通信

最简单的情景就是一个提供服务的server端,一个请求服务的client端,client请求server的服务。
下面的例子中,server注册了一个名为“scan_prog”的对象,该对象中提供一个“scan”方法:
ubus_invoke.h:
#ifndef __UBUS_INVOKE_H__
#define __UBUS_INVOKE_H__
#include <json/json.h>
#include <libubox/blobmsg_json.h>


struct prog_attr {
	char name[64];
	int chn_id;
};
#define PROG_MAX	8


#endif  /* __UBUS_INVOKE_H__ */

invoke_server.c:

#include <libubox/uloop.h>
#include <libubox/ustream.h>
#include <libubox/utils.h>
#include <libubus.h>
#include <json/json.h>
#include <libubox/blobmsg_json.h>
#include "ubus_invoke.h"

static struct ubus_context * ctx = NULL;
static struct blob_buf b;
static const char * sock_path;

static struct prog_attr uri_list[PROG_MAX] = 
{
	{"program_beijing", 1},
	{"program_guangzhou", 2},
	{"program_shanghai", 3},
	{"", -1},
};

enum
{
	SCAN_CHNID,
	SCAN_POLICY_MAX,
};

static const struct blobmsg_policy scan_policy[SCAN_POLICY_MAX] = {
	[SCAN_CHNID] = {.name = "chnID", .type = BLOBMSG_TYPE_INT32},
};

static int ubus_start_scan(struct ubus_context *ctx, struct ubus_object *obj,
		      struct ubus_request_data *req, const char *method,
		      struct blob_attr *msg)
{
	int ret = -1;
	void * json_list = NULL;
	void * json_uri = NULL;
	int idx;

	blob_buf_init(&b, 0);
	
	struct blob_attr *tb[SCAN_POLICY_MAX];
	blobmsg_parse(scan_policy, SCAN_POLICY_MAX, tb, blob_data(msg), blob_len(msg));

	/*
	本例子中,如果请求特定的节目号,返回节目名称。
	如果请求节目号是0,则返回所有节目列表。
	*/
	if (tb[SCAN_CHNID] != NULL)
	{
		int chnid = blobmsg_get_u32(tb[SCAN_CHNID]);

		if (chnid == 0)
		{
			json_uri = blobmsg_open_array(&b, "prog_list");
			for (idx = 0; idx < PROG_MAX; idx++)
			{
				if ('\0' != uri_list[idx].name[0])
				{
					json_list = blobmsg_open_table(&b, NULL);
					blobmsg_add_string(&b, "name", uri_list[idx].name);
					blobmsg_add_u32(&b, "channel", uri_list[idx].chn_id);
					blobmsg_close_table(&b, json_list);
				}
			}
			blobmsg_close_array(&b, json_uri);
			ret = 0;
		}
		else
		{
			for (idx = 0; idx < PROG_MAX; idx++)
			{
				if ('\0' != uri_list[idx].name[0] && uri_list[idx].chn_id == chnid)
				{
					blobmsg_add_string(&b, "name", uri_list[idx].name);
					ret = 0;
				}
			}
		}
	}
	
	blobmsg_add_u32(&b, "result", ret);
	ubus_send_reply(ctx, req, b.head);
	
	return 0;
}

/* 方法列表 */
static struct ubus_method scan_methods[] = 
{
	UBUS_METHOD("scan", ubus_start_scan, scan_policy),
};

/* type目前没有实际用处 */
static struct ubus_object_type scan_obj_type
= UBUS_OBJECT_TYPE("scan_prog", scan_methods);

static struct ubus_object scan_obj = 
{
	.name = "scan_prog", /* 对象的名字 */
	.type = &scan_obj_type,
	.methods = scan_methods,
	.n_methods = ARRAY_SIZE(scan_methods),
};

static void ubus_add_fd(void)
{
	ubus_add_uloop(ctx);

#ifdef FD_CLOEXEC
	fcntl(ctx->sock.fd, F_SE
  • 28
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值