ESP8266 NodeMCU kehabisan memori

Informasi NodeMCU

> Lua 5.1.4 
> SDK 2.2.1
> Memory Usage :
> Total : 3260490 bytes 
> Used  : 9287 bytes 
> Remain: 3251203 bytes

Kesalahan yang saya dapatkan saat mencoba mengirim respons HTTP dengan respons string json yang besar (json_response)

PANIC: unprotected error in call to Lua API (file.lua:5: out of memory)

Kode:

  -- a simple HTTP server
    srv = net.createServer(net.TCP)
    srv:listen(80, function(conn)
        conn:on("receive", function(sck, payload)
            sck:send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"..json_response)
        end)
        conn:on("sent", function(sck) sck:close() end)
    end)

person Mohamed Embaby    schedule 10.08.2018    source sumber
comment
Adakah masukan lebih lanjut yang diperlukan di sini?   -  person Marcel Stör    schedule 23.11.2018
comment
@MarcelStör Saya melihat apakah ada cara untuk menyesuaikan memori untuk menanganinya sekali, meskipun saya rasa itu belum mungkin.   -  person Mohamed Embaby    schedule 23.11.2018


Jawaban (1)


Ya, itu tidak akan berhasil jika Anda mencoba mengirim banyak data. Anda perlu mengirimkan ini sepotong demi sepotong. Dokumentasi API kami menunjukkan dua pendekatan (Anda akan menemukan lebih lanjut referensi di sini di SO) yang pertama adalah ini:

srv = net.createServer(net.TCP)

function receiver(sck, data)
  local response = {}

  -- if you're sending back HTML over HTTP you'll want something like this instead
  -- local response = {"HTTP/1.0 200 OK\r\nServer: NodeMCU on ESP8266\r\nContent-Type: text/html\r\n\r\n"}

  response[#response + 1] = "lots of data"
  response[#response + 1] = "even more data"
  response[#response + 1] = "e.g. content read from a file"

  -- sends and removes the first element from the 'response' table
  local function send(localSocket)
    if #response > 0 then
      localSocket:send(table.remove(response, 1))
    else
      localSocket:close()
      response = nil
    end
  end

  -- triggers the send() function again once the first chunk of data was sent
  sck:on("sent", send)

  send(sck)
end

srv:listen(80, function(conn)
  conn:on("receive", receiver)
end)
person Marcel Stör    schedule 10.08.2018