ESP8266 NodeMCU не хватает памяти

Информация о узлеMCU

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

Ошибка, которую я получаю, когда пытаюсь отправить ответ HTTP с ответом большой строки json (json_response)

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

Код:

  -- 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 источник
comment
Здесь требуется дополнительная обратная связь?   -  person Marcel Stör    schedule 23.11.2018
comment
@MarcelStör Я искал способ настроить память, чтобы справиться с ней один раз, хотя, думаю, это пока невозможно.   -  person Mohamed Embaby    schedule 23.11.2018


Ответы (1)


Да, это не сработает, если вы пытаетесь отправить много данных. Вы должны отправить это по частям. Наша документация по API демонстрирует два подхода (вы можете найти дополнительные ссылки здесь на SO) первое из них:

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