Openwrt开发日志——完善一个界面

来源:互联网 发布:罗斯数据 编辑:程序博客网 时间:2024/06/16 03:35

Mission 3

                                                                                                        ——完善一个界面

Tools

      WinSCP

      Xshell

      OpenWRT

Reference

      http://m.blog.chinaunix.net/uid-26824563-id-4591418.html

Procedure

      从之前的Mission1中,我们在主界面中创建了一个菜单栏,下面我们对界面进行下一步得完善。

      从上面的程序可以看出,在“inner-Sao”选项卡下共有两个分选项,名称分别为“BoardType”“Control”。根据cbi指示的目录,在“/usr/lib/lua/luci/model/cbi/admin_Sao”目录下有sao.luacontrol.lua两个文件,两个界面类似,我们选取"Control"界面讲述。

 

        当点击上图中的"Control"选项时,即可进入如下界面:

 

Openwrt开发日志——完善一个界面
Openwrt开发日志——完善一个界面

     先讲在前面,在编辑好Control界面后,实际界面出现了打不开得问题,这时候在解决这个问题。

报错为:

/usr/lib/lua/luci/dispatcher.lua:433:

Failed to execute cbi dispatcher target for entry'/admin/sao/control'.
The called action terminated with an exception:
/usr/lib/lua/luci/cbi.lua:311: Unable to read UCI data: sao
stack traceback:
[C]: in function 'assert'
/usr/lib/lua/luci/dispatcher.lua:433: in function 'dispatch'
/usr/lib/lua/luci/dispatcher.lua:168: in function

dispatcher.lua:167>

解决方案:把文件中所有得Sao的大写换为小写字母。这样就可以避免此问题。大致原因应该有二:

1. 请认真读完这个界面的教程,包括后面的Config的配置,配置完成应该是正确的。

2.确保整个过程中,所有的名称都是对应的,我的名称就是因为有大写的S和小写的s不对应,后来我全部改成小写了。

 

 此界面对应的程序在“/usr/lib/lua/luci/model/cbi/admin_sao/control.lua”下,具体内容为:

1. require("luci.sys")

2. require("luci.sys.zoneinfo")

3. require("luci.tools.webadmin")

4. require("luci.fs")--这里说明一下,由于版本更新的原因,会出现luci.fs这个包找不到的error,把luci换成nixiook

5. require("luci.config")

6.  

7. localm, s, o

8.  

9. Map("loogson", translate("Control"), translate("Thisis design by Davied Huang, in order to control loogson board, suchas ledbeepand adc."))

10. m:chain("luci")

11.  

12. m:section(TypedSection, "controlboard", translate("ControlBoard"))

13. s.anonymous true

14. s.addremove false

15.  

16.  

17. s:tab("led", translate("ControlLED"))

18. s:tab("beep", translate("ControlBeep"))

19. --s:tab("adc", translate("ControlAdc"))

20.  

21. --

22. -- LED

23. --

24. s:taboption("led", ListValue, "lednum", translate("LEDNUM:"))

25. o.default 0

26. o.datatype "uinteger"

27. o:value(0, translate("LED0"))

28. o:value(1, translate("LED1"))

29. o:value(2, translate("LED2"))

30.  

31. s:taboption("led", ListValue, "ledstatus", translate("LEDSTATUS:"))

32. o.default    --offstatus

33. o.datatype "uinteger"

34. o:value(0, translate("LEDON"))

35. o:value(1, translate("LEDOFF"))

36.  

37.  

38. --

39. -- BEEP

40. --

41. s:taboption("beep", ListValue, "beepstatus", translate("BEEPSTATUS:"))

42. o.default    --offstatus

43. o.datatype "uinteger"

44. o:value(0, translate("ON"))

45. o:value(1, translate("OFF"))

46.  

47. s:taboption("beep", Value, "beepfreq", translate("BEEPFREQ:"))

48. o.datatype "uinteger"

49.  

50.  

51. localapply luci.http.formvalue("cbi.apply")

52. if apply then

53.     io.popen("/etc/init.d/loogsonrestart")

54. end

55.  

56.  

57. return m

说明:
       1)
此处我们使用UCI(UnifiedConfiguration Interface,统一配置接口)开发方式,第  行定义了三个局部变量:m,s,o
       2)
9行引用了一个“Map”调用,该调用的定义为:

1.    Map("配置文件文件名", "配置页面标题", "配置页面说明")

        第一个参数为配置文件存储的文件名,不包含路径,比如按上述创建的话,应该写为“sao”,配置文件的存储地址为:/etc/config。第二与第三个参数是用在来页面上显示的,如图所示。

 

Openwrt开发日志——完善一个界面

        3)
接下来需要创建与配置文件中对应的SectionSection分为两种,NamedSectionTypedSection,前者根据配置文件中的Section名,而后者根据配置文件中的Section类型,这里我们使用后者。我们设定不显示Section的名称(“s.anonymous = true),以及不允许增加或删除Section(“s.addremove = false”)controlboard即为1)中配置文件其中的一个配置。
       4)
接下来我们定义了两个选项卡,分别为Control LEDControl Beep。如上图所示。

 

Openwrt开发日志——完善一个界面

        5)
对于LED选项卡的程序为24-35行。首先创建LEDSection中不同内容的交互(创建Option),常见的有Value(文本框)ListValue(下拉框)Flag(选择框)等。创建Option的过程非常简单,而且创建后系统会无需考虑读取以及写入配置文件的问题,系统都会自动处理。25行定义了Option的默认值,26行定义了它的数据类型,此处为整形。2729定义了它的三个取值,比如如果你选“LED1”的话,实际写到配置文件中的值为1
       6)对于使用UCI的方式,首先需要创建对应的配置文件(如果配置文件不存在的话,访问配置页面将会报错),格式即为linux配置文件的格式,文件存储在文件系统“/etc/config”目录下,对于本文即在“/etc/config/sao”Openwrt开发日志——完善一个界面

内容如下:

1. config boardinfo

2.     option ipaddr1 '192.168.123.212'

3.     option netmask1 '255.0.0.0'

4.     option boardname '1'

5.  

6. config controlboard

7.     option beepfreq '100'

8.     option beepstatus '0'

9.     option lednum '2'

10.     option ledstatus '0'

        7)应用配置以后希望配置立即生效,51行到54行的代码就是判断是否点击了“应用”按钮,如果点击了“应用”按钮就执行默认的脚本程序。

随后即可验证程序,在界面更改control的值,可以看到config文件的值也在相应变化。

到此,对界面的建立就基本结束了。对选项卡进行编辑和设置等可以参考官方给出的reference:

http://luci.subsignal.org/trac/wiki/Documentation/CBI

 

原创粉丝点击