2016-06-01 13 views
2

私はESP8266で作業していますが、私はLuaでプログラムしようとしています。私はTCPサーバーを作成しようとしましたが、私は以下のサンプルコードを書いたときにエラーメッセージ名 "ただ1つのTCPサーバーを許可"を受け取ります。私はサーバーを作成し、私は閉じることができません。LuaでESP8266を1台しか使用できません

どうすれば修正できますか?

print("ESP8266 mode is: " .. wifi.getmode()); 

cfg = {}; 
-- Set the SSID of the module in AP mode and access password 
cfg.ssid = "SSID"; 
cfg.pwd = "password"; 
if ssid and password then 
    print("ESP8266 SSID is: " .. cfg.ssid .. " and PASSWORD is: " .. 
      cfg.password) 
end; 
-- Now you should see an SSID wireless router named ESP_STATION when you scan for available WIFI networks 
-- Lets connect to the module from a computer of mobile device. So, find the SSID and connect using the password selected 
wifi.ap.config(cfg); 
ap_mac = wifi.ap.getmac(); 
-- create a server on port 80 and wait for a connection, when a connection is coming in function c will be executed 
sv = net.createServer(net.TCP, 30); 
sv:listen(80, function(c) 
    c:on("receive", function(c, pl) 
     -- print the payload pl received from the connection 
     print(pl); 
     print(string.len(pl)); 
     -- wait until SSID comes back and parse the SSID and the password 
     print(string.match(pl, "GET")); 
     ssid_start, ssid_end = string.find(pl, "SSID="); 
     if ssid_start and ssid_end then 
      amper1_start, amper1_end = string.find(pl, "&", ssid_end + 1); 
      if amper1_start and amper1_end then 
       http_start, http_end = string.find(pl, "HTTP/1.1", ssid_end + 1); 
       if http_start and http_end then 
        ssid = string.sub(pl, ssid_end + 1, amper1_start - 1); 
        password = string.sub(pl, amper1_end + 10, http_start - 2); 
        print("ESP8266 connecting to SSID: " .. ssid .. " with PASSWORD: " .. password); 
        if ssid and password then 
         sv:close(); 

         -- close the server and set the module to STATION mode 
         wifi.setmode(wifi.STATION); 
         tmr.stop(2) 



         print("ESP8266 mode now is: " .. wifi.getmode()); 
         -- configure the module wso it can connect to the network using the received SSID and password 
         wifi.sta.config(ssid, password); 
         print("Setting up ESP8266 for station mode…"); 
         print("Please restart your device"); 
         tmr.delay(10000000); 
         print("Mode is " .. wifi.getmode()); 
         print("Heap:" .. node.heap()) 
         print(""); 
        end; 
       end; 
      end; 
     end; 
     -- this is the web page that requests the SSID and password from the user 
     c:send("<!DOCTYPE html> ") 
     c:send("<html> ") 
     c:send("<body> ") 
     c:send("<h1>ESP8266 Wireless control setup</h1>") 
     mac_mess1 = "The module MAC address is: " .. ap_mac 
     mac_mess2 = "You will need this MAC address to find the IP address of the module, please take note of it." 
     c:send("<h2>" .. mac_mess1 .. "</h2>") 
     c:send("<h2>" .. mac_mess2 .. "</h2>") 
     c:send("<h2>Enter SSID and Password for your WIFI router</h2>") 
     c:send("</form> </html>") 
     c:send("<form action='' method='get'>") 
     c:send("SSID:") 
     c:send("<input type='text' name='SSID' value='' maxlength='100'/>") 
     c:send("<br/>") 
     c:send("Password:") 
     c:send("<input type='text' name='Password' value='' maxlength='100'/>") 
     c:send("<input type='submit' value='Submit' />") 
    end); 
end); 
+0

を開き、これら二つの問題のためのように、ここで二つの質問。 –

+0

あなたは2つの異なる新しいトピック権の下で2つの質問を意味しますか? – ahmd14

+0

はい。 SOは質疑応答サイトなので、質問は「話題」です(BBSの類推かもしれません)。 –

答えて

2

Nodemcuでは1台のtcpサーバしか使用できません。 init.luaファイルを保存してesplorer ideを使用しようとすると、これが起こります。

  1. nodemcuに既に存在するinitファイルが削除されます。
  2. 新しいinit.luaファイルが書き込まれます。
  3. dofile("init.lua")は、init.luaファイルを実行するnodemcuで実行されます。

3番目の手順を実行すると、もう1つは作成できないnodemcuで実行されているtcpサーバーが既に存在します。

解決方法: - nodemcuをリセットするだけです。最新のinit.luaが実行され、tcpサーバが起動しているはずです。

+0

おそらくこれは "純粋な"回答です –

13

すでにESP8266上で動作しているTCPサーバーを閉じる必要があります。はい、それを閉じて、新しいものを作成した場合、サーバーがすでに開始されているかどうかをサーバーチェックを作成する前に ...

if srv~=nil then 
    srv:close() 
end 

srv=net.createServer(net.TCP) 
srv:listen(80,function(conn) 
    conn:on("receive",function(conn,payload) 
    print(payload) 
    conn:send("<h1> Hello, World.</h1>") 
    end) 
end) 
+1

私はこの答えに同意します。 – ambassallo

関連する問題