摘自:https://blog.csdn.net/jasonchen_gbd/article/details/46055885
上一篇文章介绍了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:
1 #include <libubox/uloop.h> 2 #include <libubox/ustream.h> 3 #include <libubox/utils.h> 4 #include <libubus.h> 5 #include <json/json.h> 6 #include <libubox/blobmsg_json.h> 7 #include "ubus_invoke.h" 8 9 static struct ubus_context * ctx = NULL; 10 static struct blob_buf b; 11 static const char * sock_path; 12 13 static struct prog_attr uri_list[PROG_MAX] = 14 { 15 {"program_beijing", 1}, 16 {"program_guangzhou", 2}, 17 {"program_shanghai", 3}, 18 {"", -1}, 19 }; 20 21 enum 22 { 23 SCAN_CHNID, 24 SCAN_POLICY_MAX, 25 }; 26 27 static const struct blobmsg_policy scan_policy[SCAN_POLICY_MAX] = { 28 [SCAN_CHNID] = {.name = "chnID", .type = BLOBMSG_TYPE_INT32}, 29 }; 30 31 static int ubus_start_scan(struct ubus_context *ctx, struct ubus_object *obj, 32 struct ubus_request_data *req, const char *method, 33 struct blob_attr *msg) 34 { 35 int ret = -1; 36 void * json_list = NULL; 37 void * json_uri = NULL; 38 int idx; 39 40 blob_buf_init(&b, 0); 41 42 struct blob_attr *tb[SCAN_POLICY_MAX]; 43 blobmsg_parse(scan_policy, SCAN_POLICY_MAX, tb, blob_data(msg), blob_len(msg)); 44 45 /* 46 本例子中,如果请求特定的节目号,返回节目名称。 47 如果请求节目号是0,则返回所有节目列表。 48 */ 49 if (tb[SCAN_CHNID] != NULL) 50 { 51 int chnid = blobmsg_get_u32(tb[SCAN_CHNID]); 52 53 if (chnid == 0) 54 { 55 json_uri = blobmsg_open_array(&b, "prog_list"); 56 for (idx = 0; idx < PROG_MAX; idx++) 57 { 58 if ('