NodeMCU远程升级(OTA)

邮差的信 提交于 2020-03-09 08:10:05

那么今天来讲一下远程升级。
像平常使用的手机和电脑都会时不时提醒我们更新,那他们不可能派手机或电脑的维护人员亲自跑到我们面前当场写代码更新。所以就可以用到远程升级。

这次我们使用http访问来远程更新。
因这次属于http访问,无加密,所以仅用于体验。

1.大概步骤

①. NodeMCU连网
②. 获取NodeMCU里的version.txt文件并读取版本号
③. 获取服务器version.txt里的版本号并替换
④. 通过版本号判断是否获取服务器的新程序

2.前期准备

①. 准备一个hfs(http文件服务器)用于模拟远端服务器。
②. 一块NodeMCU开发板或ESP8266最小系统都可。

3.开始实施

先新建一个a.lua程序,并保存到ESP8266中,如下图:
在这里插入图片描述

①. 连网(此处直接上代码,不会的看视频教程):

--------------------------------
---  name: Cattle_L
---  date: 2020/03/07
---  project: OTA
---  email: 1033878279@qq.com
--------------------------------

wifi.setmode(wifi.STATION)
cfg = {}
cfg.ssid = "xxxxxx"     --change your Wi-Fi ssid
cfg.pwd = "xxxxxxxx"    --change your Wi-Fi password
wifi.sta.config(cfg)
wifi.sta.connect()

timer = tmr.create()

function Reconn()
    if wifi.sta.getip() == nil then
        print("waiting...")
    else
        timer:stop()
        print("ip is: "..wifi.sta.getip())
    end
end

timer:alarm(500, tmr.ALARM_AUTO, Reconn)

②. 定义一个读取version.txt的函数并调用

--------------------------------
---  name: Cattle_L
---  date: 2020/03/07
---  project: OTA
---  email: 1033878279@qq.com
--------------------------------

wifi.setmode(wifi.STATION)
cfg = {}
cfg.ssid = "xxxxxx"     --change your Wi-Fi ssid
cfg.pwd = "xxxxxxxx"    --change your Wi-Fi password
wifi.sta.config(cfg)
wifi.sta.connect()

timer = tmr.create()

function readfile()
    Version = '1'                           --set Version number
    if file.open("version.txt") then        
        Version = file.readline()
        Version = tonumber(Version)         
        print("old version is:"..Version)
        print("read version.txt success")
    else
        print("not found version.txt")
    end
end

function Reconn()
    if wifi.sta.getip() == nil then
        print("waiting...")
    else
        timer:stop()
        print("ip is: "..wifi.sta.getip())
    end
end

readfile()
timer:alarm(500, tmr.ALARM_AUTO, Reconn)

③. 打开事先准备好的hfs,确保电脑和NodeMCU处于同一个局域网,如下图:
在这里插入图片描述

④. 新建一个version.txt, 里面用于存放版本号,并将此文件拖入hfs中,如下图:
在这里插入图片描述
⑤. 先获取版本号,若获取到的版本号大于本地版本号则更新本地版本号

--------------------------------
---  name: Cattle_L
---  date: 2020/03/07
---  project: OTA
---  email: 1033878279@qq.com
--------------------------------

wifi.setmode(wifi.STATION)
cfg = {}
cfg.ssid = "xxxxxx"
cfg.pwd = "xxxxxxxx"
wifi.sta.config(cfg)
wifi.sta.connect()

timer = tmr.create()

function readfile()
    Version = '1'                               --set Version number
    if file.open("version.txt") then
        Version = file.readline()
        Version = tonumber(Version)
        print("old version is:"..Version)
        print("read version.txt success")
    else
        print("not found version.txt")
    end
end


function Reconn()
    if wifi.sta.getip() == nil then
        print("waiting...")
    else
        timer:stop()
        print("ip is: "..wifi.sta.getip())

        --change your ip address here
        http.get('http://192.168.1.103/version.txt',nil,
            function(code, data)
                if code < 0 then
                    print("http error")
                else
                    data = tonumber(data)
                    if data > Version then              --如果读取回来的版本号大于本地的
                        print(data)
                        file.open("version.txt",'w+')   --则打开version.txt(若一开始没有则会创建一个)
                        file.writeline(data)            --清空version.txt并替换里面版本号
                        file.close()                    --关闭文件

                    else                                --若版本号无更新则继续执行以前的代码文件
                        print("not new version")        
                        dofile("a.lua")               --继续执行 led.lua
                    end
                end
            end)
        
    end
end

readfile()
timer:alarm(500, tmr.ALARM_AUTO, Reconn)

⑥. 新建.lua文件做为新程序,用于测试,并拖入hfs中,如下图:
在这里插入图片描述

⑦. 若获取到新的版本号则继续获取新的代码文件,并将新的文件内容替换到本地的文件,也就替换到a.lua

--------------------------------
---  name: Cattle_L
---  date: 2020/03/07
---  project: OTA
---  email: 1033878279@qq.com
--------------------------------

wifi.setmode(wifi.STATION)
cfg = {}
cfg.ssid = "xxxxxx"
cfg.pwd = "xxxxxxxx"
wifi.sta.config(cfg)
wifi.sta.connect()

timer = tmr.create()

function readfile()
    Version = '1'                               --set Version number
    if file.open("version.txt") then
        Version = file.readline()
        Version = tonumber(Version)
        print("old version is:"..Version)
        print("read version.txt success")
    else
        print("not found version.txt")
    end
end


function Reconn()
    if wifi.sta.getip() == nil then
        print("waiting...")
    else
        timer:stop()
        print("ip is: "..wifi.sta.getip())

        --change your ip address here
        http.get('http://xxxx.xxxx.xxxx.xxxx/version.txt',nil,
            function(code, data)
                if code < 0 then
                    print("http error")
                else
                    data = tonumber(data)
                    if data > Version then              --如果读取回来的版本号大于本地的
                        print(data)
                        file.open("version.txt",'w+')   --则打开version.txt(若一开始没有则会创建一个)
                        file.writeline(data)            --清空version.txt并替换里面版本号
                        file.close()                    --关闭文件

                        --change your ip address here
                        http.get('http://192.168.1.103/program.lua',nil,
                            function(codes, datas)
                                if codes < 0 then
                                    print("http error")
                                else
                                    file.open("a.lua",'w+')   --打开本地led.lua
                                    file.writeline(datas)       --清空并写入新代码
                                    file.close()                --关闭文件
                                    dofile("a.lua")           --执行led.lua
                                end
                            end)
                            
                    else                                --若版本号无更新则继续执行以前的代码文件
                        print("not new version")        
                        dofile("a.lua")               --继续执行 led.lua
                    end
                end
            end)
        
    end
end

readfile()
timer:alarm(500, tmr.ALARM_AUTO, Reconn)

4. 总结

好的,差不多到这就结束了,大家也可以换成自己真正的服务器,对数据进行加密后再传输,另外应该考虑更多的细节,若内存不够怎么办?传输中途断网?传输超时?等等。
相信单单文章大家可能看的不是很懂,所以在这里又有视频教程,跟前面的链接不一样哦。
另外自建交流Q群:612683349
欢迎大家一起交流哦~

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!