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)))


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章