引言

利用Web页面做配置可以轻松适应用户的多种设备,如Android, IOS等。本文将介绍如何在NodeMCU中实现配置页面。

接线图请参考NodeMCU之旅(三):响应配置按钮

配置页面后端

HTTP服务

NodeMCU的可用运存大约只有32KB,非常小。

这里推荐一个轻量的HTTP服务库NodeMCU-HTTP-Server。下载httpServer.lua即可。

服务静态文件

init.lua的尾部添加:

dofile('httpServer.lua')

并在switchCfg()中启动和关闭监听:

function switchCfg()
if wifi.getmode() == wifi.STATION then
-- ...
httpServer:listen(80)
else
-- ...
httpServer:close()
end
end

测试HTTP服务

可以通过以下方法来测试服务器是否正常。

保存以下代码为index.html

<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>配置终端</title>
</head>
<body>
<p>这是我的配置页面。</p>
</body>
</html>

上传init.luahttpServer.lua以及index.html到NodeMCU。

按下RST按钮,按下配置按钮,用手机连入热点mymcu,在浏览器打开 http://192.168.4.1/

如果一切正常,你将能够看到这个页面。

GZIP压缩

为了节省空间,此HTTP服务库还支持GZIP。比如:index.html可以压缩为index.html.gz再上传。

更多细节,请参阅NodeMCU-HTTP-Server

设置IP地址

NodeMCU在自身开放的AP局域网中的默认IP地址是192.168.4.1,如果需要修改NodeMCU在本地局域网中的IP地址,请在开启AP后,使用此函数设置:

设置IP

wifi.ap.setip()

注意,该函数只有在开启AP后才有效。

后端接口

扫描附近热点

给httpServer添加中间件,当访问'/scanap'时:使用wifi.sta.getap()获取AP列表再转换到JSON格式返回。

httpServer:use('/scanap', function(req, res)
wifi.sta.getap(function(table)
local aptable = {}
for ssid,v in pairs(table) do
local authmode, rssi, bssid, channel = string.match(v, "([^,]+),([^,]+),([^,]+),([^,]+)")
aptable[ssid] = {
authmode = authmode,
rssi = rssi,
bssid = bssid,
channel = channel
}
end
res:type('application/json')
res:send(cjson.encode(aptable))
end)
end)

注意:由于NodeMCU内存很小,附近热点过多时,扫描热点会造成内存不足自动重启。此时请手动输入WIFI信息进行配置。

配置WIFI信息

同样添加一个中间件,当带参数访问'/config'时,配置WIFI信息,并返回连接结果。

TMR_WIFI = 4

httpServer:use('/config', function(req, res)
if req.query.ssid ~= nil and req.query.pwd ~= nil then
wifi.sta.config(req.query.ssid, req.query.pwd) status = 'STA_CONNECTING'
tmr.alarm(TMR_WIFI, 1000, tmr.ALARM_AUTO, function()
if status ~= 'STA_CONNECTING' then
res:type('application/json')
res:send('{"status":"' .. status .. '"}')
tmr.stop(TMR_WIFI)
end
end)
end
end)

配置页面前端

前端方面的选择就比较多了,我使用了轻量的Zepto.jsSpectre.css来搭建前端页面,通过AJAX来请求数据。

相比起后端,前端代码大都是一些界面交互的逻辑,就不贴在这里了。

相关资源

你可以在NodeMCU-Tutorial下载到本文的相关资源和代码。

最新文章

  1. (function(){...}())与(function(){...})()
  2. 【python】入门学习(三)
  3. 第三个Sprint冲刺第六天
  4. Dynamics AX 2012 R2 在增强入站端口中找不到自定义服务操作
  5. change the walltime for currently running PBS job (qalter pbs)
  6. async 和 await 以及Action Func
  7. android github
  8. Spring Richclient — 企业级富客户端开发框架介绍,第 1 部分
  9. Car immobilizer hacking
  10. Linux autoconf和automake使用
  11. Cookie的Domain
  12. SQL中条件放在on后与where后的区别
  13. avalonJS入门(一)
  14. 【转】gcc/g++ 如何支持c11 / c++11标准编译
  15. python3 树莓派 + usb摄像头 做颜色识别 二维码识别
  16. Linux mmc framework2:基本组件之block
  17. 使用@font-family时各浏览器对字体格式(format)的支持情况
  18. oracle 新建用户
  19. JavaServlet的文件上传和下载
  20. Android实践项目汇报总结(下)

热门文章

  1. 在linux下用tomcat部署java web项目的过程与注意事项
  2. UAC下的程序权限提升
  3. JavaScript 面向对象(一)
  4. Java枚举的3类语法
  5. windows下常用软件
  6. ecstore中kvstore之mongodb
  7. POJ 2482 Stars in Your Window
  8. 转 Could not create the view: An unexpected exception was thrown.问题解决
  9. HttpServletRequest.getServletContext()一直提示找不到,而引出的问题
  10. 防止多个UIAlertView重叠弹出