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库