本教程基于NodeMcu Lua 固件工具:
一个可以通过HTTP访问的空间(服务器啊,阿里的OSS的都可以)
固件中需要有HTTP组件

PS:更新模式为覆盖更新,函数覆盖函数,变量覆盖变量。所以无法删除原代码中存在,新代码中不存在的

首先需要把自己的脚本拆开,拆分为(WIFI连接模块,加载远程脚本的模块) + (核心逻辑模块)

例:

WIFI连接模块,加载远程脚本的模块:

  1. print('Wait link to wifi')
  2. wifi.setmode(wifi.STATION)
  3. wifi.sta.config('SSID', 'PASSWORD')
  4. wifi.sta.connect()
  5. function GetWiFiStage()
  6. if wifi.sta.getip() == nil then
  7. print('Waiting for IP ...')
  8. else
  9. print('IP is ' .. wifi.sta.getip())
  10. print('WIFI LINK OK')
  11. tmr.stop(1)
  12. --当连接上WIFI后,直接调用HTTPGET来加载远程脚本
  13. HttpGet_Script()
  14. end
  15. end
  16. function HttpGet_Script()
  17. http.get("http://10.0.0.104/Lua/init_Server.lua", nil, function(code, data)
  18. if (code < 0) then
  19. print("HTTP request failed")
  20. else
  21. print("Code:" .. code)
  22. --加载远程脚本,注意,后面的"()"很重要
  23. loadstring(data)()
  24. --调用init_Server.lua 中的 Main 函数
  25. Main()
  26. end
  27. end)
  28. end
  29. tmr.alarm(1, 1000, 1, GetWiFiStage)

核心逻辑模块

  1. --这个很重要,标志本脚本的版本号
  2. local local_var = 1
  3. function CHECK_FOR_UPDATES()
  4. http.get("http://10.0.0.104/lua/var.txt", nil, function(code, data)
  5. if (code < 0) then
  6. print("HTTP request failed")
  7. else
  8. print("Code:" .. code)
  9. --开始检查服务器上的脚本版本,如果大于本地版本号,则开始更新
  10. if tonumber(data) > local_var then
  11. --注意:更新前需要将正在运行的逻辑代码全部停止
  12. tmr.stop(3) tmr.stop(6)
  13. --再次调用init中的获取远程代码函数
  14. HttpGet_Script()
  15. end
  16. end
  17. end)
  18. end
  19. function Main()
  20. --这边是你需要的脚本逻辑代码
  21. tmr.alarm(3, 5*1000, 1, MQTT_EVENT)
  22. --结束
  23. --这边是定时检查脚本是否需要更新的代码
  24. tmr.alarm(6, 60*1000, 1, CHECK_FOR_UPDATES)
  25. end

结束

文档更新时间: 2017-09-10 04:19   作者:Tristan