我们在实际工作中,会开发自己的功能模块
对于 Openwrt来讲其方便就是可以像 ko 档一样随时进行安装与卸载
那么对于Openwrt来讲,也有一套”标准“的新增步骤:
1. 在 package 目录下新增模块目录: hello
2. 添加对应的文件,像这样
files:存放配置文件以及启动脚本
配置文件:定义的内容就是 uci 格式
config globals 'globe'
option agent 'openwrt'
option url 'http://192.168.100.115:8080'
option delay '10'
源码通过调用自定义API
将配置存放到
int read_conf( struct Hello *hello)
{
struct uci_context *ctx = uci_alloc_context();
if (!ctx)
{
fprintf(stderr, "No memory\n");
return 1;
}
getValue(ctx, "agent", hello->agent, sizeof(hello->agent));
getValue(ctx, "url", hello->url, sizeof(hello->url));
char delay[20];
getValue(ctx, "delay", delay, sizeof(delay));
hello->delay = atoi(delay);
uci_free_context(ctx);
return 0;
}
后续就可以通过结构体来操作
启动脚本:
#!/bin/sh /etc/rc.common
USE_PROCD=1
START=15
STOP=85
PROG=/bin/hello
validate_hello_section()
{
uci_validate_section hello globals globe \
'delay:range(1,200)'
}
start_service() {
echo "start HelloRoute!"
validate_hello_section || {
echo "hello validattion failed!"
return 1
}
procd_open_instance
procd_set_param command "$PROG" –f -w bjbook.net
procd_set_param respawn
procd_close_instance
}
service_triggers()
{
procd_add_reload_trigger "hello"
}
reload_service()
{
stop
start
}
START, STOP变量:决定了脚本执行的顺序
start(),stop():决定如何启动和停止服务。我们在这里直接调用了 hello 模块,所以开机就会启用 hello
custom():扩展命令使用,这里暂时不用
src:存放源码,以及对应 Makefile(仅用于编译源码)
all:
$(CC) $(CFLAGS) -luci hello.c -o hello
clean:
rm *.o hello
顶层 Makefile:包含编译及安装指令,控制代码在 openwrt 环境下的编译及生成安装包
1. mk 文件引入,定义软件包 名字,版本
include $(TOPDIR)/rules.mk
PKG_NAME:=hello
PKG_RELEASE:=1.0
2. 设置软件包分类,这样 make menuconfig 时我们可以在对应类别里找到
设置依赖变量 libuci,这样源码可以调用 UCI 接口
语法使用:+库名,表示如果选择软件包时,该库会被自动选择
define Package/$(PKG_NAME)
SECTION:=net
CATEGORY:=Network
TITLE:=Hello utility
DEPENDS:=+libuci
URL:=https://blog.csdn.net/mrbone9?spm=1008.2028.3001.5343
MAINTAINER:=31642407@qq.com
endef
3. 编译部分:创建编译目录,拷贝代码到该目录
build_dir/target-i386_pentium4_musl/hello
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
5. 安装部分:$(1) 表示传入的第一个参数
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_CONF) ./files/hello.conf $(1)/etc/config/hello
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/hello.init $(1)/etc/init.d/hello
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/hello $(1)/usr/sbin/hello
endef
6. 打包
$(eval $(call BuildPackage,$(PKG_NAME)))
编译:
各文件准备好了就可以开始编译了,记得我们设定了类别,那么通过菜单就可以选定该模块
$ make menuconfig
$ make package/hello/compile V=s
完成后可以看见生成的软件包
安装:
拷贝 ipk 到 Openwrt 运行的 OS
卸载:
安装的 ipk 可以通过下面命令查看实际名称
调用 opkg 来进行卸载
opkg 就是一个软件包管理工具,可以回车查看具体命令
通过上述步骤我们就构建出自己的软件包,操作部分简单到此
后续章节会来研究代码框架,UCI,ubus,procd等待内容