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)

Здесь требуется дополнительная обратная связь?

Marcel Stör 23.11.2018 15:50

@ MarcelStör Я искал, есть ли способ настроить память, чтобы справиться с этим один раз, хотя я думаю, что это пока невозможно.

Mohamed Embaby 23.11.2018 17:45
0
2
433
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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)

Другие вопросы по теме