mt7688 openwrt之lua初探
背景:需要通過iw獲取無線列表,並根據無線加密型別進行連線。參考openwrt原生介面:
1.安裝lua
官網預設映象居然沒有lua的支援,那麼安裝之:
opkg install luci
/etc/init.d/uhttpd start
2.lua目錄相關資訊;
/usr/lib/lua/luci/controller/ controller實現目錄
/usr/lib/lua/luci/model/cbi/admin_network/wifi_add.lua 這裡應該是操作iw的檔案
一些對應關係:
一番搜尋後發現此頁面的原始碼在系統的/usr/lib/lua/luci/view/admin_network/wifi_join.htm檔案裡,對應openwrt的原始碼路徑
為./feeds/luci/modules/admin-full/luasrc/view/admin_network/wifi_join.htm。
由local iw = luci.sys.wifi.getiwinfo(dev)找到sys.lua模組,路徑/usr/lib/lua/luci/sys.lua,對應openwrt原始碼位置./feeds/luci/modules/base/luasrc/sys.lua
view/admin_network/wifi_join.htm: function scanlist(times)
view/admin_network/wifi_join.htm: for k, v in ipairs(iw.scanlist or { }) do
view/admin_network/wifi_join.htm: <% for i, net in ipairs(scanlist(3)) do net.encryption = net.encryption or { } %>
[email protected]:/usr/lib/lua# grep "scanlist" * -r
iwinfo.so:scanlist
除錯思路:
https://my.oschina.net/osbin/blog/298526
目前openwrt具體實現:
function format_wifi_encryption(info)
if info.wep == true then
return "WEP"
elseif info.wpa > 0 then
return translatef("<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>",
table.concat(info.pair_ciphers, ", "),
table.concat(info.group_ciphers, ", "),
(info.wpa == 3) and translate("mixed WPA/WPA2")
or (info.wpa == 2 and "WPA2" or "WPA"),
table.concat(info.auth_suites, ", ")
)
elseif info.enabled then
return "<em>%s</em>" % translate("unknown")
else
return "<em>%s</em>" % translate("open")
end
end
網友板:
#!/usr/bin/lua
dev = arg[1]
local sys = require "luci.sys"
local utl = require "luci.util"
local iw = luci.sys.wifi.getiwinfo(dev)
function scanlist(times)
local i, k, v
local l = { }
local s = { }
for i = 1, times do
for k, v in ipairs(iw.scanlist or { }) do
if not s[v.bssid] then
l[#l+1] = v
s[v.bssid] = true
end
end
end
return l
end
function format_wifi_encryption(info)
if info.wep == true then
return "WEP"
elseif info.wpa > 0 then
return string.format("Pairwise: %s / Group: %s >%s - %s",
table.concat(info.pair_ciphers, ", "),
table.concat(info.group_ciphers, ", "),
(info.wpa == 3) and string.format("mixed WPA/WPA2")
or (info.wpa == 2 and "WPA2" or "WPA"),
table.concat(info.auth_suites, ", ")
)
elseif info.enabled then
return unknown
else
return open
end
end
for i, net in ipairs(scanlist(3)) do
net.encryption = net.encryption or { }
print("channel:",net.channel);
print("ssid:",net.ssid);
print("bssid:",net.bssid);
print("Mode:",net.mode);
wep=net.encryption.wep and 1 or 0
print("Encryption:",format_wifi_encryption(net.encryption));
print("");
end