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下面的代码有时候能触发,有时候触发不了。各位如果能有解决方法的麻烦告知一下,谢谢。



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



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



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



  • 目前这个问题已经解决,首先我弄了个脚本获取当前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两个文件中,然后后面再调用脚本去实现联网的功能。



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