赞
踩
WIFI 技术从WIFI5 发展的 WIFI 6, 高通的QSDK 从SPF1 已经release SPF11.1 版本。当客户设置用WEB 页面配置wifi 工作的模式的时候,会发发现模式一直设置的不正确。做为高通AE 工程师,我们通常会建议客户使用uci 进行wifi 配置。但是web 设置的问题一直没有修正。
刚好有点时间抽空了解openwrt /qsdk的web 设置框架,修正了了这个设置显示问题。
目录
4. 测试和功能验证:
目前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:ModulesHowTo · openwrt/luci Wiki · GitHub
或官方http://luci.subsignal.org/trac/wiki/Documentation/ModulesHowTo
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")
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 模块操作 。
调试方式 可以使用 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>
- var channels = {
- '11g': [
- 'auto', 'auto', true
- ],
- '11a': [
- 'auto', 'auto', true
- ],
- '11ac': [
- 'auto', 'auto', true
- ],
-
- '11axa':[
- 'auto','auto',true
- ],
- '11axg':[
- 'auto','auto',true
- ]
-
- }
- var modes = [
- '', 'Legacy', true,
- 'n', 'N', hwmodes.n,
- 'ac', 'AC', hwmodes.ac,
- 'ax', 'AX', true
- ];
- 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
- ]
- };
- 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'
欢迎下载配套代码。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。