1. 新建虚拟机,百度文库有一篇《使用VMware安装OpenWrt》,地址:
装好后,复制下载的openwrt-x86-generic-combined-ext2.vmdk或者其他版本放到虚拟机目录下并修改成OpenWRT.vmdk的名字覆盖掉原来的。就可以开始使用openwrt系统了。
2. 虚拟机里应该有个LAN口网络地址为192.168.1.1, 为了从PC访问虚拟机,将PC下的网络连接里的VMware Network Adapter VMnet1的IP改为同虚拟机一个网段,比如192.168.1.2。然后从虚拟机里PING通PC就说明可以了。
3. 在PC 上打开浏览器,输入192.168.1.1, 应该就能进入到路由器的登录界面。用root和密码登录进去。linux下修改密码用passwd root。
4. 现在要做的是定制luci的界面,比如在一级目录下增加一个PIERO,PIERO下面有2个子标签,BoardType和Control。
首先进入到虚拟机的 /usr/lib/lua/luci/controller/admin/下,新建一个piero.lua文件,添加如下内容:
module("luci.controller.admin.piero", package.seeall)function index() entry({ "admin","piero"}, alias("admin","piero","piero"),_("PIERO"), 100).index = true entry({ "admin","piero","piero"},cbi("admin_piero/piero"),_("BoardType"),1) entry({ "admin", "piero", "control"},cbi("admin_piero/control"),_("Control"),2)end
这里相当于定义一个界面的入口,entry的参数一表示路径,参数二是target,表示动作,有alias表示直接链接到其他标签,cbi表示执行一个lua文件,template表示引用一个htm的模板,call 表示调用函数。参数三是表示显示的标题,加'_'表示国际化,最后一个表示显示的次序。后两个参数可省略。index=true不知道干吗的。
5. 程序中cbi("admin_piero/control")表示执行admin_piero下的control.lua文件,完整路径为/usr/lib/lua/luci/model/cbi/admin_piero/control.lua,admin_piero为自己新建的目录,建好后再新建control.lua文件,并写入如下代码:(注:linux中方便切换路径可以给一些常用的较长的路径取一个别名方便访问,方法是alias 'cdadmin=cd /usr/lib/lua/luci/controller/admin' ,这样定义之后就可以直接使用cdadmin命令进入admin目录了。)
require("luci.sys")require("luci.sys.zoneinfo")require("luci.tools.webadmin")require("luci.fs")require("luci.config")local m, s, om = Map("piero", translate("Control"), translate("This is design by Piero, in order to test for add a new page."))m:chain("luci")s = m:section(TypedSection, "controlboard", translate("Control Board"))s.anonymous = trues.addremove = falses:tab("led", translate("Control LED"))s:tab("beep", translate("Control Beep"))--s:tab("adc", translate("Control Adc"))---- LED--o = s:taboption("led", ListValue, "lednum", translate("LED NUM:"))o.default = 0o.datatype = "uinteger"o:value(0, translate("LED0"))o:value(1, translate("LED1"))o:value(2, translate("LED2"))o = s:taboption("led", ListValue, "ledstatus", translate("LED STATUS:"))o.default = 1 --off statuso.datatype = "uinteger"o:value(0, translate("LED ON"))o:value(1, translate("LED OFF"))---- BEEP--o = s:taboption("beep", ListValue, "beepstatus", translate("BEEP STATUS:"))o.default = 1 --off statuso.datatype = "uinteger"o:value(0, translate("ON"))o:value(1, translate("OFF"))o = s:taboption("beep", Value, "beepfreq", translate("BEEP FREQ:"))o.datatype = "uinteger"local apply = luci.http.formvalue("cbi.apply")if apply then io.popen("/etc/init.d/piero restart")endreturn m
Map的调用是: m = Map("配置文件名", "配置页面标题", "配置页面说明")
这里的配置文件名写的是piero,它有一个默认的目录是/etc/config/下,写完上面这些就需要去/etc/config/下新建文件piero,写入如下内容:
config boardinfo option ipaddr1 '192.168.123.212' option netmask1 '255.0.0.0' option boardname '1'config controlboard option beepfreq '100' option beepstatus '0' option lednum '2' option ledstatus '0
6. 写完这些后就可以重启虚拟机,然后再从PC上登入192.168.1.1查看,就能看到修改后的效果了。如图:
7. 现在讲界面的中文化。
首先找到luci-i18n-chinese_0.11+svn9769-1_x86.ipk 下好放电脑里,这个版本要注意,要跟自己的版本对上,要不然可能出现部分英文部分中文的样子,然后下一个WinSCP的工具,这个工具是用来跟openwrt传文件的,下好安装后登录,然后将luci-i18n-chinese_0.11+svn9769-1_x86.ipk上传到openwrt下/tmp/目录下,传好后进入虚拟机,进入/tmp目录,然后开始安装,输入opkg install luci-i18n-chinese_0.11+svn9769-1_x86.ipk,然后就可以装好。装好后用192.168.1.1登上去,在系统-语言界面 里选择chinese,然后提交保存。再刷新一下就可以看到中文界面了。
关于自定义界面的中文化,原来的想法是自己去编译汉化包,但是一直没有找到方法,已知的方法是在编译openwrt的时候可以修改po文件的方式,然后一起编译成固件,比较麻烦。后来使用了直接输入中文的办法,方法是先用winscp连接上板子,打开需要汉化的文件,首先点一下winscp上面工具栏的 编码 ,将编码方式修改成utf-8, 然后在文件里需要汉化的地方,直接写入中文。保存后,清缓存,界面上就可以看到汉字了。这种方法不好的是,当你选择界面为英文是,这些直接写中文的地方无法自动转换为英文。
8. 关于快捷路径的保存,之前直接用 alias会导致重启后失效,所以换一种方法,在/etc/profile文件中添加alias cdadmin='cd /usr/...'类似路径,保存退出。这样就可以了。
9. Luci是openwrt上使用较为广泛的一种Web管理界面框架,可以二次开发。
10. 文件修改完后直接在网页上打开常常结果跟自己期望差很多,大多数时候是缓存的影响,可以重启虚拟机,也可以直接删除三个文件,/tmp/luci-indexcache,/tmp/luci-modulecache/*, /tmp/luci-sessioncache/*。
11. OpenWrt有多个版本,Backfire发布于2010年3月。Attitude Adjustment发布于2013年4月25,是现在最稳定的版本。这里用的是Attitude Adjustment版本,版本号可以在192.168.1.1页面的顶部看到。
12. 相关版本下载,以及版本的软件下载,官网是,再按自己的版本选,比如我的是,这里面可以下载很多有用的ipk文件,比如中文包,useradd工具,theme等。下载好后按第7步安装。
13. 关于luci的资料国内的网站上搜到不到,尤其是一些比较偏的东西,可以去google.cn上搜搜,比如关于增加用户名的讨论帖,
14. 关于USB挂载摄像头功能,参考链接,按里面的步骤,首先是下载和配置好交叉编译工具,比如我这是mips-openwrt-linux-gcc, 然后在http://www.ijg.org/files/位置下载libjpeg源码包,并交叉编译。然后再下载https://sourceforge.net/projects/mjpg-streamer/的源码,并编译。生成的东西拷到板子上。
15. 网上最多的一般是call 方法,cbi方法,和template方法,关于call方法,虽然是调用函数,但是功能可以更强大,比如要实现删除时跳出一个确认框,就可以在index 里的entry里调用call("delete")方法,然后
function delete()
删除动作;
luci.template.render("admin_system/packages",{参数传递})
end
然后在view里的admin-system下写htm, packages.htm。
16. 待续