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