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

NodeMCU информация

> 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)

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)
Другие вопросы по тегам