2017-05-06 37 views
0

我正嘗試在lua上使用NodeMCU自定義構建由frightanic.com在ESP8266上創建本地http服務器。PANIC:調用Lua API中的未受保護的錯誤(wificonfig.lua:33:地址正在使用)

當我創建一個本地http服務器以及已經在端口80上偵聽並從我的服務器站點獲取數據的連接時,它給我一個PANIC錯誤。

這裏是我的代碼:

wifi.setmode(wifi.STATION) 
wifi.sta.config("SSID","password") 
wifi.sta.connect() 

tmr.alarm(1,10000, 1, function() 
    if (wifi.sta.getip() == nil) then 
     print("IP unavaiable, Waiting...") 
    else 
     foo() 
     local_server() 
    end 
end) 


function foo() 
     conn = nil 
     conn=net.createConnection(net.TCP,0) 
     conn:on("receive", function(conn, payload) 
      print("payload : "..#payload); 
     end) 
     conn:connect(80,"server.co.in") 
     conn:on("connection", function(conn, payload) 
      conn:send("GET /mypage?id=deadbeef HTTP/1.0\r\nHost: server.co.in\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n") end) 

     conn:on("sent",function(conn) 
       print("Closing server connection") 
       conn:close() 
      end) 
end 

function local_server() 
    srv=net.createServer(net.TCP) 
    srv:listen(80,function(conn) 
     conn:on("receive", function(client,request) 
      local buf = "Hello world"; 
      client:send('HTTP/1.0\n\n') 
      client:send('<!DOCTYPE HTML>\n') 
      client:send('<html>\n') 
      client:send('<head><meta content="text/html; charset=utf-8">\n') 
      client:send('<title>Local server</title></head>\n') 
      client:send('<style>body{ background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }</style>\n";') 
      client:send(buf); 

      conn:on("sent",function(conn) 
       srv:close() -- Even tried with client:close() 
      end) 
     end) 
    end) 

end 

是沒可能做到這一點?如果是,比我怎麼做呢?

如果我在定時器內部創建服務器一次,比它不創建任何本地服務器ie。我無法打開我的本地服務器192.168.x.y.

這裏是我修改後的代碼:

wifi.setmode(wifi.STATION) 
wifi.sta.config("SSID","password") 
wifi.sta.connect() 

tmr.alarm(1,10000, 1, function() 
    if (wifi.sta.getip() == nil) then 
     print("IP unavaiable, Waiting...") 
    else 
     print("Creating a server"); 
     srv=net.createServer(net.TCP,0) 
     srv:listen(80,function(conn) 
     end) 
     tmr.stop(1) 
     tmr.alarm(1,10000, 1, function() 
       foo() 
       local_server() 
     end) 
    end 
end) 


function foo() 
     conn = nil 
     conn=net.createConnection(net.TCP,0) 
     conn:on("receive", function(conn, payload) 
      print("payload : "..#payload); 
     end) 
     conn:connect(80,"server.co.in") 
     conn:on("connection", function(conn, payload) 
      conn:send("GET /mypage?id=deadbeef HTTP/1.0\r\nHost: server.co.in\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n") end) 

     conn:on("sent",function(conn) 
       print("Closing server connection") 
       conn:close() 
      end) 
end 

function local_server() 
     conn:on("receive", function(client,request) 
      local buf = "Hello world"; 
      client:send('HTTP/1.0\n\n') 
      client:send('<!DOCTYPE HTML>\n') 
      client:send('<html>\n') 
      client:send('<head><meta content="text/html; charset=utf-8">\n') 
      client:send('<title>Local server</title></head>\n') 
      client:send('<style>body{ background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }</style>\n";') 
      client:send(buf); 

      conn:on("sent",function(conn) 
       srv:close() -- Even tried with client:close() 
      end) 
     end) 
end 

回答

0
 client:send('HTTP/1.0\n\n') 

這不是一個有效的HTTP響應。最低服務於HTML頁面的響應應該是這樣的

HTTP/1.0 200 ok\r\n 
Content-type: text/html\r\n 
\r\n 
here comes the HTML body 

但這可能不是混亂的原因,因爲它抱怨在使用中的地址。我不知道在ESP8266上運行的操作系統,但通常這個錯誤意味着已經有一個套接字綁定到這個地址和端口,並且你不能在同一個位置有另一個套接字。因此,如果已經有一個Web服務器在這個系統上運行,那麼你不能在同一地址啓動另一個Web服務器。

如果您一旦成功啓動服務器,無法通信(由於服務器的HTTP響應不正確),然後嘗試重新啓動服務器,也會發生此類錯誤:重新啓動服務器需要一段時間一旦連接建立到這個套接字,同一套接字,所以你可能需要等待幾分鐘才能再次啓動服務器(或重新啓動系統)。

以你的代碼仔細看可以看到服務器從計時器裏開始:

tmr.alarm(1,10000, 1, function() 
... 
     local_server() 

從快看看the documentation of tmr它看起來像你正在呼籲與tmr.ALARM_AUTO定時器,使其會一再重複。這意味着在您已經設置了服務器之後,計時器會重複,因此會嘗試再次設置服務器 - 在同一個端口上。這會導致使用中的地址錯誤。

+0

我最初使用HTTP/1.0 200自己確定,但是當它不能比使用HTTP/1.0嘗試時,因爲我對這些東西沒有太多的知識。 錯誤所指的地址是我的WiFi模塊的IP地址(作爲連接到接入點的站)還是其他地址? 正如你可以在我的代碼中看到我打開了端口80上的客戶端連接到一些服務器,然後我close.conn:連接(80,「server.co.in」) – aditgupta100

+0

我甚至試着聽其他端口說9999但我得到了同樣的錯誤。 – aditgupta100

+0

錯誤消息指的是您的WiFi模塊本地。我建議你先簡化你的代碼,即只實現一個服務器,而不是別的。 –

相關問題