2017-09-17 5 views
-1

自動更新機能を備えたLua Webサーバーをテストしています。 HTMLコードは毎秒Webサーバー自体にリダイレクトされています。したがって、クライアントのWebブラウザは、ブラウザのキャッシュを使用して、 の代わりに常に新しいデータをサーバから取得します。NodeMCU自動更新機能付き超小型Webサーバーでメモリ不足になる

このメッセージで、私はいくつかの時間後でも、1つのクライアントのみ(私のPCまたはスマートフォン)で接続した場合NodeMCUボードのクラッシュ:

PANIC:LuaのAPIへの呼び出しで保護されていないエラー(SO-WEBSRV -Test.lua:27:メモリのうち)

私はquestion「メモリ不足」と類似に答えマルセルStoerから、このコードを使用していました。

私はMarcelのLuaコードを修正しましたが、このコードはまだ時間の経過とともにすべてのヒープメモリを使い果たします。

私は少し問題を絞りました.HTMLコードのリフレッシュ頻度が30秒未満の場合、コードはヒープメモリを使い果たします。

したがって、一定のヒープメモリ使用量を達成するには、このコードをどのように変更する必要がありますか?

よろしくお願いいたします。

ステファン

tmr.alarm(0, 1000, 1, function() 
    if wifi.sta.getip() == nil then 
     print("trying to connect to AccessPoint...") 
    else 
     own_ip, netmask, gateway=wifi.sta.getip() 
     print("connected to AccessPoint:") 
     print("IP Info: \nIP Address of this device: ",own_ip) 
     print("Netmask: ",netmask) 
     print("Gateway Addr: ",gateway,"\n") 
     print("type IP-Address "..own_ip.." into your browser to display SHT-31-website") 
     tmr.stop(0) 
    end 
end) 

counter = 0 
srv = net.createServer(net.TCP, 28800) 
print("Server created... \n") 

srv:listen(80, function(conn) 
    conn:on("receive", function(sck, request) 
     local message = {} 
     counter = counter + 1 
     message[#message + 1] = "<head> <meta http-equiv=refresh content=1; URL=http://"..own_ip.."> </head>" 
     message[#message + 1] = "<h1> ESP8266 SHT-31 Web Server Ver 003</h1>" 
     message[#message + 1] = "<h2>some more text blabla blub"..counter.."</h2>" 
     local function send(sk) 
      if #message > 0 then 
       sk:send(table.remove(message, 1)) 
      else 
       sk:close() 
       message = nil 
       print("Heap Available:" .. node.heap()) 
      end 
     end 
     sck:on("sent", send) 
     send(sck) 
    end) 
end) 
+0

根本原因が何であるか考えています。しかし、まずは説明の中の履歴を削除し、あなたが現在作業している(そしてAFAIUに失敗した)コードが何であるかを説明することをお勧めします。 –

答えて

1

あなたが使用しているもののファームウェアバージョンを教えていませんでした。 Chromiumブラウザで最近のバージョンをテストしたところ、メモリに関する問題はありませんでした。私は700 +リロードサイクル後にテストを中止しました。ヒープ消費は絶対に安定していました。

今年の早い段階では、タイムスタンバイ状態のまま放置されているソケットが多すぎるためにメモリが枯渇していたため、reduce the TCP TIME_WAIT parameter valueにしていました。説明:

TIME-WAIT

は(サーバーまたはクライアント)リモートTCPはその コネクション終了要求の承認を受けたことを確認するために渡すのに十分な時間 を待って表します。 [RFC 793によれば、接続は 2 MSL (最大セグメント寿命)として知られている4分の最大のためのTIME-WAITにとどまることができる]

出典:https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Protocol_operation

詳細:https://tools.ietf.org/html/rfc7230#section-6.6

しかし:

  • あなたが戻ってあなたのクライアントにHTTP上でHTMLを送信しようとするように見えるが、それはそれを好まないかもしれない、それを教えていませんお使いのクライアント(ブラウザは?)時間に古いソケットを閉じない場合
  • あなたはまた、両方のように明示的

行う適切なHTTPヘッダを追加し、それを修正伝えることがあります。Connection: closeContent-Type: text/html

local message = { "HTTP/1.0 200 OK\r\nServer: NodeMCU on ESP8266\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n" } 

counter = counter + 1 

message[#message + 1] = "<html><head> <meta http-equiv=refresh content=1; URL=http://" .. own_ip .. "> </head>" 
message[#message + 1] = "<body><h1> ESP8266 SHT-31 Web Server Ver 003</h1>" 
message[#message + 1] = "<h2>some more text blabla blub" .. counter .. "</h2></body></html>" 

をメモだけでなく、適切に構造化されたHTMLマークアップ:そのため、メッセージの一部は次のようにする必要があります。

関連する問題