Openwrt ubus server通讯

1. 导入头文件
#ifdef __cplusplus
extern "C"  {
#endif

#include "libubus.h"
#include <libubox/blobmsg_json.h>
#ifdef __cplusplus
}
#endif

#define __UBUS_METHOD__(_name, _handler, _policy) {_name,_handler,0,_policy,ARRAY_SIZE(_policy)}

#define __UBUS_OBJECT_TYPE(_name, _methods) {_name,0,_methods,ARRAY_SIZE(_methods)}
static struct blob_buf blob;
static struct ubus_context *ctx;
2,注册server监听:

enum {
	REQUEST,
	__REQUEST_MAX
};
static const struct blobmsg_policy request_policy[] = {
	{"Request",BLOBMSG_TYPE_TABLE}
};

enum {
	SETTINGS,
	__SETTINGS_MAX
};

const static struct blobmsg_policy settings_policy[] = {
	{"settings",BLOBMSG_TYPE_TABLE}
};

enum {
	SET_AVS_STATUS,
  BEHABIOR,
	__SET_AVS_STATUS_MAX
};

const static struct blobmsg_policy set_avs_status_policy[] = {
	{"status",BLOBMSG_TYPE_STRING},
  {"behavior",BLOBMSG_TYPE_STRING}
};

static int setStatusBehavior(struct ubus_context *ctx, struct ubus_object *obj,
                  struct ubus_request_data *req, const char *method,
                  struct blob_attr *msg){
  printf("call setAvsStatus : \n" );
	struct blob_attr *request[__REQUEST_MAX];
	struct blob_attr *settings[__SETTINGS_MAX];
	struct blob_attr *tb[__SET_AVS_STATUS_MAX];
	const char *status = "unknown";
  const char *behavior = "unknown";
	blobmsg_parse(request_policy, ARRAY_SIZE(request_policy), request, blob_data(msg), blob_len(msg));
	if(request[REQUEST]){
		blobmsg_parse(settings_policy, ARRAY_SIZE(settings_policy),
			settings, blobmsg_data(request[REQUEST]), blobmsg_len(request[REQUEST]));

		if(settings[SETTINGS]){
			blobmsg_parse(set_avs_status_policy, ARRAY_SIZE(set_avs_status_policy),
			tb, blobmsg_data(settings[SETTINGS]), blobmsg_len(settings[SETTINGS]));
			if(tb[SET_AVS_STATUS]){
				status = blobmsg_get_string(tb[SET_AVS_STATUS]);
			}
      if(tb[BEHABIOR]){
        behavior = blobmsg_get_string(tb[BEHABIOR]);
      }
		}

	}else {
    printf("getCurrentsettings : the request is empty\n");
  }
  printf("status:%s   led type :%s \n  ",status,behavior );

  //TODO something

	blob_buf_init(&blob,0);
	void * tbl1,*tbl2;
	tbl1 = blobmsg_open_table(&blob,"Response");
	tbl2 = blobmsg_open_table(&blob,"settings");
	blobmsg_add_string(&blob,"status","done");
	blobmsg_close_table(&blob,tbl2);
	blobmsg_close_table(&blob,tbl1);
	// send tohe blob message to luci
  ubus_send_reply(ctx,req,blob.head);
	return 0;
}


enum {
	MODE,
  AUDIO_PATH,
	__MODE_MAX
};

const static struct blobmsg_policy start_sensor_trigger_policy[] = {
	{"mode",BLOBMSG_TYPE_STRING},
	{"path",BLOBMSG_TYPE_STRING}
};

static int setModePath(struct ubus_context *ctx, struct ubus_object *obj,
                  struct ubus_request_data *req, const char *method,
                  struct blob_attr *msg){
  printf("call startSensorTrigger : \n" );
	struct blob_attr *request[__REQUEST_MAX];
	struct blob_attr *settings[__SETTINGS_MAX];
	struct blob_attr *tb[__MODE_MAX];
	const char *mode = "";
  const char *path = "";
	blobmsg_parse(request_policy, ARRAY_SIZE(request_policy), request, blob_data(msg), blob_len(msg));
	if(request[REQUEST]){
		blobmsg_parse(settings_policy, ARRAY_SIZE(settings_policy),
			settings, blobmsg_data(request[REQUEST]), blobmsg_len(request[REQUEST]));

		if(settings[SETTINGS]){
			blobmsg_parse(start_sensor_trigger_policy, ARRAY_SIZE(start_sensor_trigger_policy),
			tb, blobmsg_data(settings[SETTINGS]), blobmsg_len(settings[SETTINGS]));
			if(tb[MODE]){
				mode = blobmsg_get_string(tb[MODE]);
			}
      if(tb[AUDIO_PATH]){
        path = blobmsg_get_string(tb[AUDIO_PATH]);
      }
		}
	}else {
    printf("getCurrentsettings : the request is empty\n");
  }
  printf("mode: %s ,path: %s.\n  ",mode,path);

  //TODO something
  
	blob_buf_init(&blob,0);
	void * tbl1,*tbl2;
	tbl1 = blobmsg_open_table(&blob,"Response");
	tbl2 = blobmsg_open_table(&blob,"settings");
	blobmsg_add_string(&blob,"status",done.c_str());
	blobmsg_close_table(&blob,tbl2);
	blobmsg_close_table(&blob,tbl1);
	// send to the blob message to luci
  ubus_send_reply(ctx,req,blob.head);
	return 0;
}

static const struct ubus_method settings_methods[] = {
	__UBUS_METHOD__("setStatusBehavior", setStatusBehavior, request_policy),
  __UBUS_METHOD__("setModePath", setModePath, request_policy)
};

static struct ubus_object_type settings_object_type = __UBUS_OBJECT_TYPE("settings", settings_methods);

static struct ubus_object settings_object = {
  avl              : {},
  name             : "settings",
  id               : 0,
  path             : nullptr,
  type             : &settings_object_type,
  subscribe_cb     : NULL,
  has_subscribers  : false,
  methods          : settings_methods,
  n_methods        : ARRAY_SIZE(settings_methods)
};

static void server_main(void){

	int ret;
	ret = ubus_add_object(ctx, &settings_object);
	if (ret)
		fprintf(stderr, "Failed to add settings object: %s\n", ubus_strerror(ret));
	uloop_run();
}

void registerUbusServerReceiveCommand(){
    const char *ubus_socket = NULL;
    uloop_init();
    signal(SIGPIPE, SIG_IGN);
    ctx = ubus_connect(ubus_socket);

    if (!ctx) {
     fprintf(stderr, "Failed to connect to ubus\n");
     return;
    }
    ubus_add_uloop(ctx);

    server_main();

    ubus_free(ctx);
    uloop_done();
    printf("*********************after ubus setting**********************\n" );
}
3.编译时使用ubus ubox blobmsg库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值