ubus c语言例子,openwrt之ubus例子

好一个ic

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/Makefile

OUTPUT = hello_ubus

OBJ = hello_ubus.o

LIBS = -lm -lubus -lubox -lpthread -luci -ljson-c

all: $(OUTPUT)

$(OUTPUT): $(OBJ)

@echo "...................................."

@echo "CC = " $(CC)

@echo "CFLAGS = " $(CFLAGS)

@echo "LDFLAGS = " $(LDFLAGS)

@echo "...................................."

$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS) $(LDLIBS)

%.o: %.c

$(CC) $(CFLAGS) $(LDFLAGS) -o $@ -c $^ $(LDLIBS) $(LIBS)

clean:

-rm $(OUTPUT) *.o

hello_ubus/src/hello_ubus.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

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

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南

1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库。本文介绍使用Spring Data MongoDB来访问mongodb数据库的几种方法: 使用Query和Criteria类JPA自动生成的查询方法使用Query 注解基于JSON查询在开始前&#…

mysqldump导出备份数据库报Table ‘performance_schema.session_variables‘ doesn‘t exist

今天在bash进行本地数据库往云端数据库导数据的时候,在本地导出.sql文件这第一步就出现了错误问题,导出sql文件的命令: 1 mysqldump -u 用户名 -p 数据库名 > xxx.sql 在做这一步将数据导出的时候报了这么一个错误, 1 mysqldu…

在Identity框架中使用RoleBasedAuthorization

本文将介绍在 Identity 框架中如何使用 Sang.AspNetCore.RoleBasedAuthorization[1] 库。核心介绍Identity 和 jwt 的基本配置我们在这里不再赘述,可以参考最后的项目样例。核心的代码主要为 IRolePermission 的实现。internal class MyRolePermission : IRolePermi…

2016年印度公有云服务市场将达13亿美元

根据IT咨询公司Gartner最新调查数据显示,2016年印度公有云服务市场预计将增长35.9%,达到13亿美元。 增长最快的是云系统基础设施即服务(IaaS),2016年预计将增长45.5%;其次是平台即服务(PaaS&…

PAT 1042. 字符统计

1042. 字符统计 请编写程序,找出一段给定文字中出现最频繁的那个英文字母。 输入格式: 输入在一行中给出一个长度不超过1000的字符串。字符串由ASCII码表中任意可见字符及空格组成,至少包含1个英文字母,以回车结束(回车…

Magicodes.IE 2.7.0-beta发布

2.7.0-beta2022.10.27使用SixLabors.ImageSharp替代System.Drawing,感谢linch90 (见pr#454)2.6.92022.10.26fix: 动态数据源导出到多个sheet的问题 (见#449)2.6.82022.10.18Excel模板导出添加API,以支持通过…

光伏逆变器“领跑”:不止于技术

从无到有,从效率比拼到突破99%,在跟进速度上没话说的国内光伏逆变器企业难免深陷“价格战”、同质化的泥潭。随着“领跑者”计划跃居光伏主流,嗅到市场红利的企业再次蜂拥而至。 目前,鉴衡认证发布的第一批光伏并网逆变器“领跑者…

Ubuntu 18.04上Qmmp安装教程

Qmmp,一个开源的基于Qt的多媒体播放器。它具有多种音频文件格式支持,DSP效果,视觉效果;输出系统支持(OSS4(FreeBSD),ALSA(Linux),Pulse Audio,JAC…

android自动跑马灯,Android-最强跑马灯

Android--最强跑马灯Android 跑马灯已经有很多版本,从最基本的TextView,到重写TextView使TextView取消焦点限制,还有重写TextView利用ScrollTo方法写的,基本都能满足一般需要。然而在使用过程中,发现一些意外---有时会…

python:软件目录结构规范

为什么要设计好目录结构? “设计项目目录结构”,就和“代码编码风格”一样,属于个人风格问题。对于这种风格上的规范,一直都存在两种态度: 1.一种认为,这种个人风格问题“无关紧要”。理由是能让程序work就…

开启智能生活新时代 河北省智慧社区建设从各个击破

智慧社区作为智慧城市的重要组成部分,是城市智慧落地的触点,是城市管理、政务服务和市场服务的载体。随着智慧城市的推广以及新一代技术的普及,智慧社区的项目必将迎来新一轮的快速发展。2016年智慧社区成为企业业务落地的承载点,…

C# WPF 表格控件的前后台数据交互?

概述GridControl控件使用我们已经进行了实例讲解,这节内容我们列举一个特殊的应用场景:表格中有一列CheckBox,默认都处于勾选状态,当用户通过界面操作后,我们要确保用户至少选择了一项,相当于一次数据验证&…

Java(C#)基础差异-语法

1、long类型 Java long类型,若赋值大于int型的最大值,或小于int型的最小值,则需要在数字后加L或者l,表示该数值为长整数,如long num2147483650L。 举例如下: public static void main(String[] args) {/** …

android防止左向右滑出程序,Android——ViewPager禁止左右滑动的实现

目录1 背景用ViewPagerBottomNavigationView多个Fragment快速搭建的页面切换架构,一个有四个页面,因为测试需要,需要屏蔽掉中间的两个,做法是:设置不可点击选择:xml布局文件中,BottomNavigation…

Yii2 的快速配置 api 服务 yii2-fast-api

yii2-fast-api yii2-fast-api是一个Yii2框架的扩展,用于配置完善Yii2,以实现api的快速开发。 此扩展默认的场景是APP的后端接口开发,因此偏向于实用主义,并未完全采用restfull的标准,方便前端开发处理接口数据以及各种…

.NET6打包部署到Windows Service

1.安装Nuget包安装以下nuget包支持windows service<PackageReference Include"Microsoft.AspNetCore.Hosting.WindowsServices" Version"6.0.10" /> <PackageReference Include"Microsoft.Extensions.Hosting.WindowsServices" Version…

传统家电在智能家居变革的五大优势

而在众多向智能家居领域转型变革的企业中&#xff0c;看似落后的传统家电企业&#xff0c;却占据着一定的优势。 产品优势 传统家电企业在产品上的优势主要体现在企业拥有产品本身的设计、技术、生产、制造和营销渠道&#xff0c;其产品不论是从外观设计、零件制造还是零件组装…

《Apache Kafka实战》读书笔记-调优Kafka集群

《Apache Kafka实战》读书笔记-调优Kafka集群 作者&#xff1a;尹正杰 版权声明&#xff1a;原创作品&#xff0c;谢绝转载&#xff01;否则将追究法律责任。 一.确定调优目标 1>.常见的非功能性要求 一.性能&#xff08;performance&#xff09;最重要的非功能性需求之一。…

android emoji unicode编码表,unicode编码

unicode编码app是一款字符查找客户端应用&#xff0c;通过unicode编码可以方便寻找特定字符&#xff0c;查看字符表情详细的描述&#xff0c;并且利用unicode编码就可以快捷复制任意unicode编码&#xff0c;提高开发效率&#xff0c;非常的实用&#xff0c;快来下载unicode编码…

物联网商机诱人 芯片商大力搭建生态系统

应用需求变化多端的物联网&#xff0c;虽具备庞大的发展潜力及应用商机&#xff0c;但由于市场过于分散&#xff0c;几乎没有杀手应用可言&#xff0c;因此对有意耕耘相关市场的半导体业者而言&#xff0c;如何借力使力&#xff0c;寻找盟友共同搭建出的生态系统&#xff0c;遂…