Luci的web界面做了wifi帐号密码功能遇到问题

  我想在web界面添加一个功能,显示可用wifi列表,同时在wifi名称后面的输入框中输入密码,点击保存按钮则将帐号密码保存到/usr/wifisave文件中。界面如图所示。

0_1478506110782_QQ截图20161107155414.jpg
0_1478506126454_QQ截图20161107155425.jpg
保存在/model/cbi下的代码如下所示:
m=Map(“wifikey”,translate(“Good Friend ECG Recorder”),nil)

luci.sys.call(“wifilist start”)

local inits={}
f1=io.lines("/usr/wifinote2","*l")
f2=io.lines("/usr/wifinote1","*n")
f3=io.lines("/usr/wifinote3","*l")
for line in io.lines("/usr/wifinote") do
inits[line]={}
inits[line].intensity=f2()
inits[line].name=f1()
inits[line].key=f3()
end
form=SimpleForm(“wifilist”,translate(“Available network”),nil)
tb=form:section(Table,inits)
–it=tb:option(DummyValue,“intensity”,translate(“Intensity(%)”))
na=tb:option(DummyValue,“name”,translate(“SSID”))
en=tb:option(Value,“key”,translate(“Key”))
en.render=function(self,section,value)
– self.rmempty=true
self.default=nil
Value.render(self,section,value)
end
en.write=function(self,section,value)
if value~=nil then
luci.sys.call(“setLED start”)
local file=io.open("/usr/wifisave",“a”)
file:write(inits[section].name)
file:write(" “)
file:write(value)
file:write(”\n")
file:close()
end
– ts:option(DummyValue,“adblock”,translate(“Changes have been saved. Please Reflash the page.”))
end

ts=form:section(SimpleSection)
sa=ts:option(Button,“save”)
sa.inputtitle=translate(“Save”)
sa.inputsytle=“apply”
sa.write=function(self)
luci.sys.call(“duplicate start”)
end
return m,form

目前存在的问题是,,输入密码点击保存之后,有时还能够将帐号密码保存,有时候没有保存,也就是en.write下面的代码有时候能触发,有时候触发不了。各位如果能有解决方法的麻烦告知一下,谢谢。

实现效果如下图所示
0_1479091167596_QQ截图20161114103616.jpg

目前这个问题已经解决,首先我弄了个脚本获取当前wifi名称列表
iwpriv ra0 set SiteSurvey=0
sleep 1
iwpriv ra0 get_site_survey |awk ‘{if($6>=20)print $6,$2}’ |sort -n -r -k1| grep ‘^[0-9]’ > /usr/wifinote
awk ‘{print $2}’ /usr/wifinote > /usr/wifinote2
然后就是修改luci的内容,具体代码如下:
local fs=require “nixio.fs”
–local x=luci.model.uci.cursor()

m=Map(“wifikey”,translate(“Good Friend ECG Recorder”),nil)

luci.sys.call(“wifilist start”)

local inits={}
f1=io.lines("/usr/wifinote2","*l")
–f2=io.lines("/usr/wifinote1","*n")
–f3=io.lines("/usr/wifinote3","*l")
for line in io.lines("/usr/wifinote") do
inits[line]={}
inits[line].name=f1()
–inits[line].intensity=f2()
–inits[line].key=f3()
end
–x:delete(“wifikey”,“keys”,“ssid”)
s=m:section(TypedSection,“keys”,translate(“Choose the network”))
s.anoymous=true
s.addremove=false
o=s:option(ListValue,“ssid”,translate(“SSID”))
–f=function(x,y) return x.intensity > y.intensity end
–table.sort(inits,f)
for i, zone in pairs(inits) do
o:value(inits[i].name)
end
function o.write(self,section,value)
– local function lookup_zone(title)
– for i, zone in pairs(inits) do
– if inits[i].name==title then return inits[i].name end
– end
– end
AbstractValue.write(self,section,value)
–local SSID=lookup_zone(value)
local SSID=value
– self.map.uci:set(“wifikey”,section,“ssid”,SSID)
self.map.uci:delete(“wifikey”,section,“ssid”)
fs.writefile("/usr/wifiname",SSID … “\n”)
end
p=s:option(Value,“key”,translate(“Key”))
p.password=true
–p.default=“nil”
function p.write(self,section,value)
– AbstractValue.write(self,section,value)
local KEY=value
– self.map.uci:set(“wifikey”,section,“key”,KEY)
fs.writefile("/usr/wifikey",KEY … “\n”)
luci.sys.exec(“duplicate start”)
end
return m
这部分代码做了个下拉列表用于显示wifi帐号,有一个value的框用于输入密码,然后将帐号保存到wifiname和wifikey两个文件中,然后后面再调用脚本去实现联网的功能。

谢谢,我先根据你的提示摸索下

我的luci程序一开始调用了一个wifilist的脚本,这个脚本就是获取当前可用wifi的列表并保存到wifinote命名的文件当中。具体命令是从connect2ap这个脚本里面发现的,具体如下
iwpriv ra0 set SiteSurvey=0
sleep1
iwpriv ra0 get_site_survey | grep ‘^[0-9]’
可以在调试窗口输入最后一条命令,就可以看到关于当前wifi的一个列表,然后再用awk命令提取所需要的信息,保存到相应的文件,就可以在luci中调用处理。

@Cola 最近也再研究这个方面,还不知道LUCI的WEB怎么枚举可用的WIFI表,LZ有介绍性的文档或代码参考??