2016-05-01 9 views
1

NodeMCUで簡単なHTTPサーバーを作成しようとしています。私はnodeMCUを起動し、wifiに接続し、以下のプログラムを実行します。私はブラウザからサーバーに接続できます。ページをリロードし続けると永遠に動作しますが、1〜2分のリクエストの送信を停止すると、サーバーは何とか機能を停止します。つまり、ページをリロードすると、nodeMCUはデータを受信せず、データを返すこともできません。NodeMCU HTTPサーバーが応答を停止する

a=0 

function receive(conn,payload) 
    a=a+1 
    print(payload) 

    local content="<!DOCTYPE html><html><head><link rel='shortcut icon' href='/'></head><body><h1>Hello!</h1><p>Since the start of the server " .. a .. " connections were made</p></body></html>" 
    local contentLength=string.len(content) 

    conn:send("HTTP/1.1 200 OK\r\nContent-Length:" .. contentLength .. "\r\n\r\n" .. content) 
    conn:close() 
end 

function connection(conn) 
    conn:on("receive",receive) 
end 

srv=net.createServer(net.TCP,1) 
srv:listen(8080,connection) 

私はいくつかの事柄:

  • 私は何もへのリンクを追加することにより、ファビコンを要求してからブラウザを停止しました。
  • ブラウザが長時間読み込まれないように、非アクティブクライアントのタイムアウトを1に設定しました(ブラウザはタイムアウトまで読み込みを続けます)。
  • HTTPヘッダーを送信するようにコードを更新しました。
  • 接続ごとにサーバーを閉じて開こうとしました(いいえ、接続を続けるとこの修正がなくても動作を停止しないためです)。
  • 私はconn:close()をStackOverflowの答えとしてここに追加しました。

私はコンパイル済みのファームウェア0.9.6-dev_20150704整数を実行しています。

答えて

2

まず、古い0.9.xバイナリは使用しないでください。彼らはもはやサポートされておらず、たくさんのバグを含んでいます。 dev(1.5.1)またはmaster(1.4)ブランチ:http://nodemcu.readthedocs.io/en/dev/en/build/からカスタムファームウェアをビルドします。

SDKのバージョン> 1.0(これは現在のブランチからビルドした場合に得られます)conn:sendは完全に非同期です。つまり、複数回連続して呼び出すことはできません。また、send()が完了する前にソケットが閉じられる可能性があるので、conn:send()の直後にconn:close()を呼んではいけません。代わりに、sentイベントを聞き取り、そのコールバックでソケットを閉じることができます。これを考慮すると、あなたのコードは最新のファームウェアで正常に動作します。

非同期送信のより洗練された方法は、NodeMCU API docs for socket:send()に記載されています。ただし、この方法ではヒープを多く使用しているため、自分のようなデータが少ない単純なケースでは必要ありません。

したがって、完全な例はon("sent")です。私は外部リソースにfaviconを変更したことに注意してください。 "/"を使用すると、ブラウザは依然としてESP8266に対して追加の要求を発行します。

a = 0 

function receive(conn, payload) 
    print(payload) 
    a = a + 1 

    local content="<!DOCTYPE html><html><head><link rel='icon' type='image/png' href='http://nodemcu.com/favicon.png' /></head><body><h1>Hello!</h1><p>Since the start of the server " .. a .. " connections were made</p></body></html>" 
    local contentLength=string.len(content) 

    conn:on("sent", function(sck) sck:close() end) 
    conn:send("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length:" .. contentLength .. "\r\n\r\n" .. content) 
end 

function connection(conn) 
    conn:on("receive", receive) 
end 

srv=net.createServer(net.TCP, 1) 
srv:listen(8080, connection) 
+0

私はまだ試していませんが、あなたの答えは私の問題を完全にカバーしており、古いファームウェアがおそらく問題です。 – IsawU

+0

さて、新しいファームウェアを実行していて、サーバの応答が停止しているという問題がWiFi APによって発生していることがわかりました。定期的に切断するときにタブレットに問題が発生しました。今、私はWiFiから切断し、サーバーが応答を停止し、サーバーがそれ以降に再度実行されているときに再び接続しようとしました。 – IsawU

+0

それは実際に私の最初の推測だった...あなたがNodeMCU 0.9.6を実行しているのを見るまで。 –

関連する問題