luci模块练习,详细步骤。。

本文参考: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)))


展开阅读全文

没有更多推荐了,返回首页