openwrt ubus blob_buf结构体的使用

参考 libubus - tyheist - SegmentFault

还参考了openwrt软件包里的procd源代码


blob二进制对象



blob消息对象



定义blob变量时:

static struct blob_buf b;
void *c;
blob_buf_init(&b, 0);
blobmsg_add_u32(&b, "uptime", info.uptime); //或 blobmsg_add_string
c = blobmsg_open_array(&b, "load");
blobmsg_add_u32(&b, NULL, info.loads[0]);
blobmsg_add_u32(&b, NULL, info.loads[1]);
blobmsg_add_u32(&b, NULL, info.loads[2]);
blobmsg_close_array(&b, c);
c = blobmsg_open_table(&b, "memory");
blobmsg_add_u64(&b, "total",    info.mem_unit * info.totalram);
blobmsg_add_u64(&b, "free",     info.mem_unit * info.freeram);
blobmsg_add_u64(&b, "shared",   info.mem_unit * info.sharedram);
blobmsg_add_u64(&b, "buffered", info.mem_unit * info.bufferram);
blobmsg_close_table(&b, c);
ubus_send_reply(ctx, req, b.head); //发送json消息体

最后显示如下:

        "uptime": 434867,
        "load": [
                6560,
                11264,
                10272
        ],
        "memory": {
                "total": 129445888,
                "free": 47714304,
                "shared": 0,
                "buffered": 9179136
        },

	if (ubus_lookup_id(ctx, "system", &id)) {
		fprintf(stderr, "Failed to look up test object\n");
		return -1;
	}
	
	blob_buf_init(&b, 0);
	blobmsg_add_string(&b, "word", "hello");
	
	ubus_invoke_async(ctx, id, "info", b.head, &req);   //发起订阅


调用别人给的blob变量:

enum {
	HE_WORD,
	__HE_MAX
};

static const struct blobmsg_policy re_policy[__HE_MAX] = {
	[HE_WORD] = { .name = "word", .type = BLOBMSG_TYPE_STRING },
};

static int test_notify(struct ubus_context *ctx, struct ubus_object *obj,
			      struct ubus_request_data *req,
			      const char *method, struct blob_attr *msg)
{
	fprintf(stderr, "receive notify\n");

	struct blob_attr *tb[__HE_MAX];

	if (!msg)
		return UBUS_STATUS_INVALID_ARGUMENT;
	blobmsg_parse(re_policy, __HE_MAX, tb, blob_data(msg), blob_len(msg));
	
	fprintf(stderr, "we receive :%s\n", blobmsg_get_string(tb[HE_WORD]));
	
	return 0;
}




  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值