0

Wi-Fiに接続してサーバーを作成する、完全に機能するespチップがあります。OTA コマンドを送信すると、ソケット接続を使用してファイルをダウンロードする機能が実行されます。

これは私が使用している upgrader.lua です:

--------------------------------------
-- Upgrader module for NODEMCU
-- LICENCE: http://opensource.org/licenses/MIT
-- cloudzhou<wuyunzhou@espressif.com> - Heavily modified by aschmois
--------------------------------------

--[[
update('file.lua', 'http://IP.ADRESS/path/file.lua')
]]--

local header = ''
local isTruncated = false
local function save(filename, response)
    if isTruncated then
        file.write(response)
        return
    end
    header = header..response
    local i, j = string.find(header, '\r\n\r\n')
    if i == nil or j == nil then
        return
    end
    prefixBody = string.sub(header, j+1, -1)
    file.write(prefixBody)
    header = ''
    isTruncated = true
    return
end

----
function update(filename, url, cn)
    local tmpError = nil
    local running = true
    local error = nil
    local success = false
    print("Downloading from: " .. url)
    local ip, port, path = string.gmatch(url, 'http://([0-9.]+):?([0-9]*)(/.*)')()
    if ip == nil then
        return false
    end
    if port == nil or port == '' then
        port = 80
    end
    port = port + 0
    if path == nil or path == '' then
        path = '/'
    end
    print("-- Detailed Connection Info --")
    print("IP: ".. ip)
    print("Port: ".. port)
    print("Path: ".. path)
    print("-- END --")
    local function timeout() 
        error = tmpError
        file.remove(filename)
        conn:close()
        running = false
    end
    conn = net.createConnection(net.TCP, false)
    conn:on('connection', function(sck, response)
        tmr.stop(1)
        file.open(filename, 'w')
        conn:send('GET '..path..' HTTP/1.0\r\nHost: '..ip..'\r\n'..'Connection: close\r\nAccept: */*\r\n\r\n')
        tmpError = "READ TIMEOUT"
        tmr.alarm(1, 10000, 0, timeout)
    end)
    conn:on('receive', function(sck, response)
        tmr.stop(1)
        tmpError = "READ(2) TIMEOUT"
        tmr.alarm(1, 10000, 0, timeout)
        print(response)
        save(filename, response)
    end)
    conn:on('disconnection', function(sck, response)
        tmr.stop(1)
        local function reset()
            local list = file.list()
            for k,v in pairs(list) do
                if(filename == k) then
                    if(v == 0) then
                        success = false
                        file.close()
                        file.remove(filename)
                    else
                        file.close()
                        success = true
                    end
                end
            end
            print(header)
            header = ''
            isTruncated = false
            if(success) then
                print(filename..' saved')
            else
                print("Could not download `".. filename.."`")
            end
            running = false
        end
        tmr.alarm(0, 2000, 0, reset)
    end)
    conn:connect(port, ip)
    tmpError = "CONN TIMEOUT"
    tmr.alarm(1, 10000, 0, timeout)
    tmr.alarm(2, 1000, 1, function()
        if(running == false) then
            tmr.stop(2)
            local buf = ''
            if(success) then
                buf = buf.."HTTP/1.1 200 OK\r\nServer: WiFi Relay\r\nContent-Type: text/plain\r\n\r\n"
                buf = buf.."1"
            else
                buf = buf.."HTTP/1.1 500\r\nServer: WiFi Relay\r\nContent-Type: text/plain\r\n\r\n"
                buf = buf.."0"
                buf = buf.."\n"
                if(error ~= nil) then
                    buf = buf..error
                else
                    buf = buf.."UNKNOWN ERROR"
                end
            end
            cn:send(buf)
            cn:close()
        end
    end)
    return true
end

テストとして、ファイル名 = rz.lua および url = http://192.168.1.132/rz.luaを送信しています。cn 変数は、情報をクライアントに送り返すための接続です。

esp チップは次のように出力します。

Downloading from: http://192.168.1.132/rz.lua
-- Detailed Connection Info --
IP: 192.168.1.132
Ò_ÇRöfJSúfÊÃjêÐÿ (junk reset data)

問題は conn:send() コマンドに関連しているようです。オンコネクト機能内にある場合はリセットされます。外部にある場合は、読み取りタイムアウトが発生します (読み取り時に呼び出されることはないため)。他に何をすべきか本当にわかりません。

これは ESP ファームウェア情報です。

NodeMCU custom build by frightanic.com
    branch: master
    commit: 93421f2702fb02ce169f82f96be7f2a8865511e1
    SSL: false
    modules: node,file,gpio,wifi,net,tmr,uart
4

2 に答える 2