本文参考:http://lib.csdn.net/article/embeddeddevelopment/21185
本篇文章一个简单的关系流程图:
在编译openWrt的目录的package创建一个目录:addModel
该目录下的关系树:files目录结构对应的openWRT的文件系统目录。(tmp目录下的addModel文件可以不用创建~~)
文件都创建好了。下面开始写代码了:
按照关系流程图步骤来写:
1、首先是usr/lib/lua/luci/controller/admin/addModel.lua
简单解释下:
第4行,alias(...."set"),最后一个参数为set,意思是点击这个名为test的主菜单会跳转到一级菜单set界面。
第13行,读取/tmp/addModel文件内容,保存在infoo中,是addModel_info.htm外部参数之一
第14行,lua文件中使用使用uci,所调用的uci接口,这一行代表argument指向/etc/config/目录(自己猜的)
第15行,argument:get("配置文件名",“类型名字”,“option的参数”),获取option参数的对应的value值
第16行,显示页面跳转到/usr/lib/lua/luci/view/addModel_info.htm。 传入两个参数。
2、配置文件/etc/config/addModel
Section开始语法: config '
类型' '名字'
参数定义语法: option '
键' '值'
列表定义语法: list '
集合名字' '值'
第1行,在做实验的时候没有加上‘名字’,导致一直获取不到参数值,传进addModel_info.htm的interval参数值一直为空。
3、进到set界面,/usr/lib/lua/luci/model/cbi/admin_addModel/addModel.lua
模板m = Map("
配置文件文件名","配置页面标题", "配置页面说明"),
第一个参数:上一步我们新建配置文件
/etc/config/addtest
.这里就是建立与配置文件的联系.
第2行,
在一个配置文件中可能有很多Section,所以我们需要创建与配置文件中我们想要的Section的联系.
有两种方式可以选择:NamedSection(name,type,title,description)和TypedSection(type,title,description),
前者根据配置文件中的Section名,而后者根据配置文件中的Section类型.
我们选用了第二种.
第6~8行,设置了,一个选择框,两个文本框。写好后系统会自动帮我们把值保存在/etc/config/addModel里面。
第一个参数:常见的交互形式有Value(文本框),ListValue(下拉框),Flag(选择框)。
第二个参数表示在配置文件中的option的键值
第三个参数表示,你希望在页面上呈现的名称.
第10~13行,
系统会为我们在页面上自动创建一些按钮Save&Apply,Save,Reset.我们仅仅将配置写入/etc/config下对应的文件是不够的,我们还希望可以根据这个配置进行一些操作.
这部分代码的作用是,当你按下页面的apply按钮后,相当于在串口shell下输入/etc/init.d/addModed restart
4、/etc/init.d/addModed
第1行,声明脚本解释器
从start函数开始讲:
config_load addModel :加载/etc/config/addModel配置文件
config_foreach run_addModel argument :在/etc/config/addModel中每查找到一个类型,就调用一次run_addModel函数,传入参数为argument(我们需要的类型名)
看run_addModel函数:
获取布尔值类型:config_get_bool 变量名 Section名 option参数名
获取变量值:config_get 变量名 Section名 option参数名
例子:
config aaa argument interval
将/etc/config/addModel中类型为argument 对应的interval值保存在aaa中。
第13行,addModel是一个可执行文件。
stop函数:关闭addModel进程
5、files/src目录下的addModel.c 和 Makefile,因为从外部传进来的参数都是以字符串形式传参的,所以如果是数字的话需要用atoi函数转换。
6、/usr/lib/lua/luci/view/addModel_info.htm
首先:
插入贴吧一个大神对openWRT中的htm文件的说明:http://tieba.baidu.com/p/4363817869
截取一小段:
正文:
第2行:自动刷新网页,刷新间隔由外部参数interval决定,就是/etc/config/addModel配置文件中类型为argumen的interval值
第4行,设置标题名为AddMoel Info
第7行:设置一个文本框,内容为外部参数info的值。这个似乎传入的是地址,所需需要调用pcdata()函数,获取地址内容~
7、最后一步,主Makefile。编译成模块:就是ipk文件
include $(TOPDIR)/rules.mk
PKG_NAME:=addModel
PKG_VERSION=1.0
PKG_RELEASE:=1
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/addModel
SECTION:=utils
CATEGORY:=Utilities
TITLE:=Addtest--print something to addModel_info.htm
endef
define Package/addModel/description
It's a test,print something to /var/addModel cyclicaliy
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./files/src/* $(PKG_BUILD_DIR)/
endef
define Package/addModel/postinst #在安装ipk的时候执行的
#!/bin/sh
rm -rf /tmp/luci*
chmod 755 /etc/init.d/addModed
endef
define Build/Configure
endef
define Build/Compile#不知道干哈的
$(call Build/Compile/Default)
endef
define Package/$(PKG_NAME)/install#安装时候做的操作,在这里面
$(CP) ./files/* $(1)/
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/addModel $(1)/bin
endef
$(eval $(call BuildPackage,$(PKG_NAME)))