OpenWrt开发:12---UCI API编程接口(Libubox库、UCI库)

前言:

  • 前面一片文章我们介绍了UCI的脚本提供的命令接口,UCI还提供了C语言调用接口,就是本片文章介绍的
  • 下面在操作系统Ubuntu下来说明API的使用
  • 首先准备UCI编程接口的使用环境:UCI软件依赖Libubox,因此首先编译Libubox,Libubox库编译好之后,就可以再去编译UCI库了
  • 等到UCI库编译好之后,我们就可以在编写C语言程序时使用UCI库了

一、Libubox库

  • Libubox库介绍:Libubox是OpenWrt的一个必备的基础库,包含大小端转换、链表、MD5等实用工具基础库,采用Cmake来编译

安装Cmake

  • Cmake是跨平台的产生Makefile的命令行工具,它应用于在脚本文件中配置工程
    • -D选项:设置工程选项
    • -i选项:打开交互提示来进行设置
  • CmakeLists.txt:Cmake是一个跨平台的编译系统生成工具。通过平台独立Cmake的listfiles文件来指定构建过程。这个文件在每一个源码目录树目录下均有一个,文件名为CmakeLists.txt
  • 安装Cmake命令如下:
sudo apt-get install cmake

编译、安装Libubox

  • 第一步:下载Libubox的软件包
got clone https://github.com/yubo/libubox.git

OpenWrt开发:12---UCI API编程接口(Libubox库、UCI库)_第1张图片

  • 第二步:使用cmake生成Makefile
    • 命令最后的一个点,代表当前路径
    • 设置了两个编译开关(BUILD_LUA:BOOL、BUILD_EXAMPLES:BOLL)为 OFF,这两个分别是lua和使用示例,我们不进行编译,因此把编译选项关闭
cmake -D BUILD_LUA:BOOL=OFF -D BUILD_EXAMPLES:BOLL=OFF .

OpenWrt开发:12---UCI API编程接口(Libubox库、UCI库)_第2张图片

  • 第三步: 进行编译(make)、安装(make install)
    • 在进行编译时,编译过程中会输出编译进度百分比
    • 编译完成之后进行安装,安装到系统目录中,需要使用管理员权限并输入密码,因此会加上sudo命令
make;
sudo make install;

OpenWrt开发:12---UCI API编程接口(Libubox库、UCI库)_第3张图片

OpenWrt开发:12---UCI API编程接口(Libubox库、UCI库)_第4张图片

  • 安装内容包含头文件和动态链接库文件。头文件默认安装在/usr/local/include/libubox目录下,动态链接库libubox.so和 libubox.a安装在/usr/local/lib/目录下

二、UCI库

  • Libubox安装完成后就可以编译安装UCI软件了

编译、安装UCI库

  • 第一步:下载UCI软件包
git clone https://github.com/jkjuopperi/uci.git

OpenWrt开发:12---UCI API编程接口(Libubox库、UCI库)_第5张图片

  • 第二步:使用cmake生成Makefile
cmake -D BUILD_LUA:BOOL=OFF .

OpenWrt开发:12---UCI API编程接口(Libubox库、UCI库)_第6张图片

  • 第三步:编译、安装UCI
make

sudo make install

OpenWrt开发:12---UCI API编程接口(Libubox库、UCI库)_第7张图片

OpenWrt开发:12---UCI API编程接口(Libubox库、UCI库)_第8张图片

  • UCI库的头文件安装在/usr/local/include目录下,动态链接库安装在/usr/local/lib/ libuci.so,可执行程序为/usr/local/bin/uci

  • 第四步:因为系统还不知道动态链接库已经安装,运行该命令会告诉系统重新加载动态链接库,这样UCI动态链接库就可以使用了

  • UCI库编译好之后,就可以在C语言程序中使用UCI库了(-luci),例如下面使用gcc编译一个带有与UCI库的C程序
gcc test.c -o test -luci

三、UCI API接口

  • UCI接口命名非常规范,统一以小写的uci开头并放在uci.h头文件中
  • 大多数函数的第一个参数均为uci_context的指针变量。这个变量在程序初始化时调用uci_alloc_context函数分配空间并设置初始值。在程序执行结束时调用uci_free_context函数释放空间
  • UCI接口有设置函数uci_set,但没有相应的获取函数uci_get,UCI使用uci_lookup_ptr来提供查询功能,如果查到则通过获取ptr变量的值来获取配置的值
函 数 含 义
uci_alloc_context 分配UCI上下文环境对象
uci_free_context 释放UCI上下文环境对象
uci_load 解析UCI配置文件,并存储到UCI对象中。@name:配置文件名,相对于配置目录。@package:在这个变量中存储装载的配置包
uci_unload 从UCI上下文环境对象中unload配置文件
uci_lookup_ptr 分割字符串并查找。@ptr:查找的结果。@str:待查找的字符串,但 str 不能为常量, 因为将被修改赋值,在 ptr 变量内部会被使用到,因此 str 的寿命必须至少和 ptr 一样长。@extended 是否允许扩展查找
uci_set 设置元素值,如果必要将创建一个元素。更新或创建的元素将存储在ptr-> last中
uci_delete 删除一个元素,配置节或选项
uci_save 保存一个package修改的delta
uci_commit 提交更改package,提交将重新加载整个uci_package
uci_set_confdir 修改UCI配置文件的存储位置,默认为/etc/config

四、演示案例

  • UCI API的使用案例,见文章:https://blog.csdn.net/qq_41453285/article/details/102545618

你可能感兴趣的:(OpenWrt开发)