root@LEDE:/# ubus call test_ubus helloworld '{"id":1,"msg":"hi","array":["a","b"]}'
{
"id": 1,
"msg": "hi",
"shuzu": [
"a",
"b"
]
}
文件目录
hello_ubus/
├── files
│ └── etc
│ └── init.d
│ └── hello_ubus
├── Makefile
└── src
├── hello_ubus.c
└── Makefile
hello_ubus/Makefile
include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=hello_ubus PKG_RELEASE:=1 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install define Package/$(PKG_NAME) SECTION:=utils CATEGORY:=Utilities TITLE:= ubus demo(hello work) DEPENDS:= +libubus +libubox +ubusd +libuci +libjson-c endef define Package/$(PKG_NAME)/description hello ubus endef define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ endef TARGET_CFLAGS += \ -I$(STAGING_DIR)/usr/include define Build/Compile $(MAKE) -C $(PKG_BUILD_DIR) \ CROSS_COMPILE="$(TARGET_CROSS)" \ CC="$(TARGET_CC)" \ AR="$(TARGET_CROSS)ar" \ LD="$(TARGET_CROSS)ld" \ CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \ LDFLAGS="$(TARGET_LDFLAGS) -L$(STAGING_DIR)/usr/lib" endef define Package/$(PKG_NAME)/install $(INSTALL_DIR) $(1)/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/hello_ubus $(1)/bin/ $(CP) files/* $(1)/ endef $(eval $(call BuildPackage,$(PKG_NAME)))
hello_ubus/src/hello_ubus.c
#include <stdio.h> #include <errno.h> #include <unistd.h> #include <pthread.h> #include <libubus.h> #include <libubox/uloop.h> #include <libubox/list.h> #include <libubox/blobmsg_json.h> #include <json-c/json.h> struct ubus_context *ctx; struct blob_buf b; enum { HELLO_ID, HELLO_MSG, HELLO_ARRAY, __HELLO_MAX, }; static const struct blobmsg_policy hello_policy[__HELLO_MAX] = { [HELLO_ID] = { .name = "id", .type = BLOBMSG_TYPE_INT32 }, [HELLO_MSG] = { .name = "msg", .type = BLOBMSG_TYPE_STRING }, [HELLO_ARRAY] = { .name = "array", .type = BLOBMSG_TYPE_ARRAY }, }; #if 0 // define struct json_object *jobj; json_object * jobj = json_object_new_object(); json_object *jstring = json_object_new_string("Joys of Programming"); json_object *jint = json_object_new_int(10); json_object *jboolean = json_object_new_boolean(1); json_object *jdouble = json_object_new_double(2.14); json_object *jarray = json_object_new_array(); // alloc jobj = json_object_new_object(); // fill in json_object *buf1 = json_object_new_string("c"); json_object *buf2 = json_object_new_string("c++"); json_object *buf3 = json_object_new_string("php"); json_object_array_add(object,buf1); json_object_array_add(object,buf2); json_object_array_add(object,buf3); // json_object_object_add(jobj, "answer", json_object_new_string(answer)); // free json_object_put(object); #endif // ubus call test_ubus helloworld '{"id":1,"msg":"test_msg_hello_world"}' static int test_hello(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) { struct blob_attr *tb[__HELLO_MAX]; int tmp_id; char *tmp_msg = NULL; char tmp_array[128]; int len; struct blob_attr *attr; void *arr; blobmsg_parse(hello_policy, __HELLO_MAX, tb, blob_data(msg), blob_len(msg)); blob_buf_init(&b, 0); if(tb[HELLO_ID]) { tmp_id = blobmsg_get_u32(tb[HELLO_ID]); blobmsg_add_u32(&b, "id", tmp_id); } if(tb[HELLO_MSG]) { tmp_msg = blobmsg_get_string(tb[HELLO_MSG]); blobmsg_add_string(&b, "msg", tmp_msg); } if(tb[HELLO_ARRAY] && blobmsg_type(tb[HELLO_ARRAY]) == BLOBMSG_TYPE_ARRAY) { arr=blobmsg_open_array(&b, "shuzu"); len = blobmsg_data_len(tb[HELLO_ARRAY]); __blob_for_each_attr(attr, blobmsg_data(tb[HELLO_ARRAY]), len) { if (blobmsg_type(attr) == BLOBMSG_TYPE_STRING) { char *tmp = blobmsg_get_string(attr); blobmsg_add_blob(&b, attr); printf("array1=%s\n", tmp); } } blobmsg_close_array(&b, arr); } printf("tmp_id=%d, tmp_msg=%s, tmp_array=%s\n",tmp_id,tmp_msg,tmp_array); /* { json_object_array_add(array, buf1); json_object_array_add(array, buf2); json_object_object_add(json_all, "shuzhu", array); } //blobmsg_add_json_element(&b, "", array); */ ubus_send_reply(ctx, req, b.head); return 0; } static const struct ubus_method test_methods[] = { UBUS_METHOD("helloworld", test_hello, hello_policy), }; static struct ubus_object_type test_object_type = UBUS_OBJECT_TYPE("test_ubus", test_methods); static struct ubus_object test_object = { .name = "test_ubus", .type = &test_object_type, .methods = test_methods, .n_methods = ARRAY_SIZE(test_methods) }; int ubus_doing() { int ret; ctx = ubus_connect(NULL); if (!ctx) { fprintf(stderr, "Failed to connect to ubus\n"); return -1; } ubus_add_uloop(ctx); ret = ubus_add_object(ctx, &test_object); if (ret) fprintf(stderr, "Failed to add object: %s\n", ubus_strerror(ret)); } int main() { int ret; uloop_init(); ubus_doing(); uloop_run(); ubus_free(ctx); uloop_done(); return 0; }
files/etc/init.d/hello_ubus
#!/bin/sh /etc/rc.common START=99 SERVICE_USE_PID=1 USE_PROCD=1 _BIN=/bin/hello_ubus #. /lib/functions.sh start_service() { procd_open_instance procd_set_param stdout 1 procd_set_param stderr 1 procd_set_param command $_BIN procd_set_param respawn procd_close_instance } reload_service() { restart }
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。