NodeMCU:可用堆大小下降,直到出现内存不足错误
NodeMCU : Available Heaps size falls until out of memory error
我的 NodeMCU 遇到了一些问题,运行在接入点模式下连接一个简单的服务器,使用 ESPlorer 在 LUA 中编程。
这是 LUA 脚本:
local SSID = "NodeMCU"
local SSID_PASSWORD = "12345678"
function connect (conn)
print ("Hello connect")
conn:on ("receive",
function (cn, req_data)
print(req_data)
print("Available memory :")
print(node.heap())
--local query_data = get_http_req (req_data)
local query_data = {}
cn:send("HTTP/1.1 200 OK\n\n",
function()
cn:close()
--collectgarbage()
end)
end)
end
-- Configure the ESP as a station (client)
wifi.setmode (wifi.SOFTAP)
cfg={}
cfg.ssid=SSID
cfg.pwd=SSID_PASSWORD
wifi.ap.config(cfg)
cfg={}
cfg.ip="192.168.1.1";
cfg.netmask="255.255.255.0";
cfg.gateway="192.168.1.1";
wifi.ap.setip(cfg)
print("Set up UART config")
uart.setup(1, 921600, 8, uart.PARITY_NONE, uart.STOPBITS_1, 1)
-- Create the httpd server
svr = net.createServer (net.TCP, 30)
-- Server listening on port 80, call connect function if a request is received
svr:listen (80, connect)
一旦这个程序在 NodeMCU 上 运行ning,我将我的 PC 通过 WiFi 连接到 NodeMCU,然后我用这段 Java 代码向它发送一些 http POST 请求:
public void sendPost(RGBWPixel[][] LedMatrix) throws Exception {
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
System.out.println("Sending post");
// add reuqest header
con.setRequestMethod("POST");
con.setRequestProperty("matrixValues", new String(convertTo1DCharArray(LedMatrix)));
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.flush();
wr.close();
con.getResponseCode();
}
obj是NodeMCU IP地址对应的URLconnection。
对应于 matrixValues 的字符串总是有 2050 长度。
请注意,我将 LUA 脚本缩减为导致问题发生的最少功能。更确切地说,它发生在我有 cn:send() 部分时,但我不知道是否有可能在不发送响应的情况下接收和处理请求,因为当我不发送请求时不会发送请求运行 来自 Java 程序的 con.getResponseCode()。我是http初学者,所以还不是很了解所有的协议。
在 ESPlorer 中,NodeMCU 端的输出如下所示:
> dofile("init.lua");
Set up UART config
> Hello connect
POST / HTTP/1.1
matrixValues:
Available memory :
38088
Available memory :
37032
Hello connect
POST / HTTP/1.1
matrixValues:
Available memory :
37688
Available memory :
36664
Hello connect
POST / HTTP/1.1
matrixValues:
Available memory :
37440
Available memory :
36264
经过几十次迭代后,发生了这种情况,NodeMCU 重新启动:
Hello connect
POST / HTTP/1.1
matrixValues:
Available memory :
4680
Available memory :
3600
E:M 1584
PANIC: unprotected error in call to Lua API (init.lua:19: out of memory)
ets Jan 8 2013,rst cause:2, boot mode:(3,6)
load 0x40100000, len 26704, room 16
tail 0
chksum 0x0c
load 0x3ffe8000, len 2184, room 8
tail 0
chksum 0x9a
load 0x3ffe8888, len 136, room 8
tail 0
chksum 0x44
csum 0x44
第19行对应cn:send()行。
我想我在 LUA 脚本中声明了一些变量、函数或回调函数时犯了错误,该堆栈直到没有更多内存...
另外,我不明白为什么只有 1 个 "Hello connect" 调用了 2 个 conn:on 回调函数(其中打印了 node.heap())。就像总是发送第二个无效的 http 请求...
非常感谢您抽出宝贵的时间和潜在的帮助,如果您看完了这篇文章 post!
保罗
sck:send(data, fn)
等价于 sck:send(data); sck:on("sent", fn)
.
传递给 :on()
的闭包必须 不能 直接引用对象 ()。
使用回调函数的第一个参数而不是引用上值。
cn:send(
"HTTP/1.1 200 OK\n\n",
function(s) -- s here has the same value as cn
s:close()
--collectgarbage()
end
)
发送header:
Connection: close
同时包含请求和响应。现代 http 服务器和客户端应用程序的默认值为 keep-alive。当此 header 存在时,另一方将在所有数据发送完毕后明确关闭连接。当连接关闭时,内存被释放。
我的 NodeMCU 遇到了一些问题,运行在接入点模式下连接一个简单的服务器,使用 ESPlorer 在 LUA 中编程。
这是 LUA 脚本:
local SSID = "NodeMCU"
local SSID_PASSWORD = "12345678"
function connect (conn)
print ("Hello connect")
conn:on ("receive",
function (cn, req_data)
print(req_data)
print("Available memory :")
print(node.heap())
--local query_data = get_http_req (req_data)
local query_data = {}
cn:send("HTTP/1.1 200 OK\n\n",
function()
cn:close()
--collectgarbage()
end)
end)
end
-- Configure the ESP as a station (client)
wifi.setmode (wifi.SOFTAP)
cfg={}
cfg.ssid=SSID
cfg.pwd=SSID_PASSWORD
wifi.ap.config(cfg)
cfg={}
cfg.ip="192.168.1.1";
cfg.netmask="255.255.255.0";
cfg.gateway="192.168.1.1";
wifi.ap.setip(cfg)
print("Set up UART config")
uart.setup(1, 921600, 8, uart.PARITY_NONE, uart.STOPBITS_1, 1)
-- Create the httpd server
svr = net.createServer (net.TCP, 30)
-- Server listening on port 80, call connect function if a request is received
svr:listen (80, connect)
一旦这个程序在 NodeMCU 上 运行ning,我将我的 PC 通过 WiFi 连接到 NodeMCU,然后我用这段 Java 代码向它发送一些 http POST 请求:
public void sendPost(RGBWPixel[][] LedMatrix) throws Exception {
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
System.out.println("Sending post");
// add reuqest header
con.setRequestMethod("POST");
con.setRequestProperty("matrixValues", new String(convertTo1DCharArray(LedMatrix)));
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.flush();
wr.close();
con.getResponseCode();
}
obj是NodeMCU IP地址对应的URLconnection。 对应于 matrixValues 的字符串总是有 2050 长度。
请注意,我将 LUA 脚本缩减为导致问题发生的最少功能。更确切地说,它发生在我有 cn:send() 部分时,但我不知道是否有可能在不发送响应的情况下接收和处理请求,因为当我不发送请求时不会发送请求运行 来自 Java 程序的 con.getResponseCode()。我是http初学者,所以还不是很了解所有的协议。
在 ESPlorer 中,NodeMCU 端的输出如下所示:
> dofile("init.lua");
Set up UART config
> Hello connect
POST / HTTP/1.1
matrixValues:
Available memory :
38088
Available memory :
37032
Hello connect
POST / HTTP/1.1
matrixValues:
Available memory :
37688
Available memory :
36664
Hello connect
POST / HTTP/1.1
matrixValues:
Available memory :
37440
Available memory :
36264
经过几十次迭代后,发生了这种情况,NodeMCU 重新启动:
Hello connect
POST / HTTP/1.1
matrixValues:
Available memory :
4680
Available memory :
3600
E:M 1584
PANIC: unprotected error in call to Lua API (init.lua:19: out of memory)
ets Jan 8 2013,rst cause:2, boot mode:(3,6)
load 0x40100000, len 26704, room 16
tail 0
chksum 0x0c
load 0x3ffe8000, len 2184, room 8
tail 0
chksum 0x9a
load 0x3ffe8888, len 136, room 8
tail 0
chksum 0x44
csum 0x44
第19行对应cn:send()行。 我想我在 LUA 脚本中声明了一些变量、函数或回调函数时犯了错误,该堆栈直到没有更多内存... 另外,我不明白为什么只有 1 个 "Hello connect" 调用了 2 个 conn:on 回调函数(其中打印了 node.heap())。就像总是发送第二个无效的 http 请求...
非常感谢您抽出宝贵的时间和潜在的帮助,如果您看完了这篇文章 post!
保罗
sck:send(data, fn)
等价于 sck:send(data); sck:on("sent", fn)
.
传递给 :on()
的闭包必须 不能 直接引用对象 (
使用回调函数的第一个参数而不是引用上值。
cn:send(
"HTTP/1.1 200 OK\n\n",
function(s) -- s here has the same value as cn
s:close()
--collectgarbage()
end
)
发送header:
Connection: close
同时包含请求和响应。现代 http 服务器和客户端应用程序的默认值为 keep-alive。当此 header 存在时,另一方将在所有数据发送完毕后明确关闭连接。当连接关闭时,内存被释放。