WIFI 技术从WIFI5 发展的 WIFI 6, 高通的QSDK 从SPF1 已经release SPF11.1 版本。当客户设置用WEB 页面配置wifi 工作的模式的时候,会发发现模式一直设置的不正确。做为高通AE 工程师,我们通常会建议客户使用uci 进行wifi 配置。但是web 设置的问题一直没有修正。
刚好有点时间抽空了解openwrt /qsdk的web 设置框架,修正了了这个设置显示问题。
目录
1.LUCI 概述
2 WIFI 设置的相关model和view
3 AC和AX配置模式支持
3.1增加对AC和AX信道的支持:
3.2 增加 hw模式的支持:
3.3 增加带宽模式的支持
3.4 增加band 模式配置的支持
4. 测试和功能验证:
1.LUCI 概述
目前OPENWRT的显示采用 luci 架构,Luci 框架内基于 lua + uci 库编写了 CBI 框架 – CBI 框架是 Luci 的子框架。
CBI 框架加载入 uci 配置文件相应的 lua 模块,对于 HTTP GET 能够以 CBI 框架的运行逻辑将 UCI 配置文件转化渲染成用于 Web 前端显示的 HTML 做 HTTP Response;同样对 HTTP POST 也以 CBI 框架运行的逻辑将 form 表单修改写入到 UCI 配置文件中(和生效)。
LuCI是OpenWrt上的Web管理界面,LuCI采用了MVC三层架构,使用Lua脚本开发,所以开发LuCI的配置界面不需要编辑任何的Html代码,除非想自己单独去创建网页(View层),否则我们基本上只需要修改Model层就可以了。
lucidir:/usr/lib/lua/luci
LuCI安装可通过您的网络服务器通过/cgi-bin/luci访问
可以参考 github:https://github.com/openwrt/luci/wiki/ModulesHowTo
或官方http://luci.subsignal.org/trac/wiki/Documentation/ModulesHowTo

2 WIFI 设置的相关model和view
WIFI 设置的相关逻辑 都是 wifi.lua 中实现的。
/usr/lib/lua/luci/model/cbi/admin_network/wifi.lua
/usr/lib/lua/luci/view/cbi/wireless_modefreq.htm
在wifi.lua 里 可以通过调用luci.log ,实现log的信息输出:
local log = require "luci.log"
log.print("hugo debug")
下面的两个函数 主要完成 get/set uci配置文件的内容
function ch.cfgvalue(self, section)
function ch.write(self, section ,value)
-
ch = s:taboption("general", Value, "_mode_freq", '<br />'..translate("Operating frequency"))
ch.hwmodes = iw_modes
ch.freqlist = iw.freqlist
ch.template = "cbi/wireless_modefreq"
function ch.cfgvalue(self, section)
log.print("cfgvalue")
log.print(section)
hw =m:get(section,"hwmode")
ch = m:get(section,"channel")
ht = m:get(section,"htmode")
log.print(hw)
log.print(ht)
log.print(ch)
return {
m:get(section, "hwmode") or "",
m:get(section, "channel") or "auto",
m:get(section, "htmode") or ""
}
end
function ch.formvalue(self, section)
log.print("ch.formvalue")
log.print("hw_modes:")
value1 = m:formvalue(self:cbid(section) .. ".channle")
log.print(value1)
value2 = m:formvalue(self:cbid(section) .. ".htmode")
log.print(value2)
log.print_r(hw_modes,5)
return {
(hw_modes.ad and "11ad") or (m:formvalue(self:cbid(section) .. ".band") or (hw_modes.g and "11g" or "11a")),
m:formvalue(self:cbid(section) .. ".channel") or "auto",
m:formvalue(self:cbid(section) .. ".htmode") or ""
}
end
function ch.write(self, section, value)
log.print("ch.write--->")
log.print(value[1],value[2],value[3])
m:set(section, "hwmode", value[1])
m:set(section, "channel", value[2])
m:set(section, "htmode", value[3])
end
taboption() 指定了该 Option 类在指定的 section->tab 下,并返回 option 实例。
option:write 方法重写定义了该方法的内容。write 方法在 post form 时被调用 。
m.uci:set, m.uci:delete 这些即使用 lua 的 uci 模块操作 。
在 wireless_modefreq.htm ,主要是通过 html 和 javascript 语言实现的。
调试方式 可以使用 firefox 浏览器 进入debug 模式(F12),可以进行常规的代码调试。
在代码添加 console.log 可以输出log
console.log( "cbi init wifi ")
console.log(id)
console.log( mode)
console.log(band)
console.log(chan)
console.log(bwdt)
简单的分析:
从wifi.lua 那里获得wifi band 的支持的 hwmode和 信道list。
<script type="text/javascript">//<![CDATA[
var freqlist = <%= luci.http.write_json(self.freqlist) %>;
var hwmodes = <%= luci.http.write_json(self.hwmodes) %>;
页面加载后会执行 cbi_init_wifi(id)
<script type="text/javascript">cbi_init_wifi('<%= cbid %>');</script>
点击mode 按钮,会执行 cbi_toggle_wifi_mode(),更新模式 的设置值
<%:Mode%><br />
<select style="width:auto" id="<%= cbid %>.mode" name="<%= cbid %>.mode" onchange="cbi_toggle_wifi_mode('<%= cbid %>')"></select>
点击 band list,会执行 cbi_toggle_wifi_band()更新band 的设置值
<%:Band%><br />
<select style="width:auto" id="<%= cbid %>.band" name="<%= cbid %>.band" onchange="cbi_toggle_wifi_band('<%= cbid %>')"></select>
点击 band list,会执行 cbi_toggle_wifi_band()更新band 的设置值
<%:Channel%><br />
<select style="width:auto" id="<%= cbid %>.channel" name="<%= cbid %>.channel"></select>
</label>
点击 htmode list,会执行 cbi_toggle_wifi_band()更新band 的设置值
<%:Width%><br />
<select style="width:auto" id="<%= cbid %>.htmode" name="<%= cbid %>.htmode"></select>
</label>
3 AC和AX配置模式支持
3.1增加对AC和AX信道的支持:
var channels = {
'11g': [
'auto', 'auto', true
],
'11a': [
'auto', 'auto', true
],
'11ac': [
'auto', 'auto', true
],
'11axa':[
'auto','auto',true
],
'11axg':[
'auto','auto',true
]
}
3.2 增加 hw模式的支持:
var modes = [
'', 'Legacy', true,
'n', 'N', hwmodes.n,
'ac', 'AC', hwmodes.ac,
'ax', 'AX', true
];

3.3 增加带宽模式的支持
var htmodes = {
'': [
'', '-', true
],
'n': [
'HT20', '20 MHz', true,
'HT40', '40 MHz', true
],
'ac': [
'HT20', '20 MHz', true,
'HT40', '40 MHz', true,
'HT80', '80 MHz', true,
'HT160', '160 MHz', true
]
,
'ax': [
'HT80', '80 MHz', true,
'HT160', '160 MHz', true
]
};
3.4 增加band 模式配置的支持
var bands = {
'': [
'11g', '2.4 GHz', (channels['11g'].length > 3),
'11a', '5 GHz', (channels['11a'].length > 3)
],
'n': [
'11g', '2.4 GHz', (channels['11g'].length > 3),
'11a', '5 GHz', (channels['11a'].length > 3)
],
'ac': [
'11a', '5 Ghz ', (channels['11a'].length > 3),
'11ac','5 AC ', (channels['11ac'].length >3)
]
,
'ax': [
'11axg', '2.4 Ghz' , (channels['11axg'].length > 3),
'11axa', '5 Ghz' , (channels['11axa'].length > 3)
]
};
3.5 hw mode 的判断和初始化
var config_mode = <%= luci.http.write_json(self.map:get(section, "hwmode")) %>
if( /11axa|11axg/.test(config_mode))
mode.value = 'ax';
else if(/11ac/.test(config_mode))
mode.value = 'ac';
else if(/11a/.test(config_mode))
mode.value = 'a';
else if (/HT20|HT40|HT80|HT160/.test(<%= luci.http.write_json(self.map:get(section, "htmode")) %>))
mode.value = 'ac';
else if (/HT20|HT40/.test(<%= luci.http.write_json(self.map:get(section, "htmode")) %>))
mode.value = 'n';
else
mode.value = '';
测试和功能验证:
修改后,要删除 平台上的 rm -fr /tmp/luci-* 生成的index文件。
浏览器的进行刷新就可以了 修改后的效果。

uci的配置如下:
uci show wireless
wireless.wifi0=wifi-device
wireless.wifi0.type='qcawificfg80211'
wireless.wifi0.macaddr='00:03:7f:12:1b:07'
wireless.wifi0.channel='auto'
wireless.wifi0.hwmode='11axa'
wireless.wifi0.htmode='HT80'
wireless.@wifi-iface[0]=wifi-iface
wireless.@wifi-iface[0].device='wifi0'
wireless.@wifi-iface[0].network='lan'
wireless.@wifi-iface[0].mode='ap'
wireless.@wifi-iface[0].ssid='OpenWrt'
wireless.@wifi-iface[0].encryption='none'
wireless.wifi1=wifi-device
wireless.wifi1.type='qcawificfg80211'
wireless.wifi1.channel='auto'
wireless.wifi1.macaddr='00:03:7f:12:23:8f'
wireless.wifi1.hwmode='11axg'
wireless.wifi1.htmode='HT160'
wireless.@wifi-iface[1]=wifi-iface
wireless.@wifi-iface[1].device='wifi1'
wireless.@wifi-iface[1].network='lan'
wireless.@wifi-iface[1].mode='ap'
wireless.@wifi-iface[1].ssid='OpenWrt'
wireless.@wifi-iface[1].encryption='none'
欢迎下载配套代码。