簡體   English   中英

Arduino:打開和關閉 ethe.net 服務器可用性

[英]Arduino: turn on and off ethernet server availability

我需要設置一個必須根據 Arduino UNO 上的某些條件打開和關閉的 ethe.net(網絡)服務器。

我在Ethe.net中閱讀了Server class 的文檔,似乎一旦啟動就沒有機會停止服務器,即沒有Ethe.netServer.begin()對應項。

然后我想在setup部分設置服務器並根據給定條件為傳入連接提供服務:

EthernetServer server = EthernetServer(80);

void setup() {
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop() {

  if (condition) {

    EthernetClient client = server.available();
    if (client == true) {
      // serve the client...
    }

  } else {
    // do something else
  }

}

這確實有效,但客戶沒有被正確拒絕:它只是懸而未決。 在瀏覽器中,可以看到 web 頁面無限加載,如果條件變為true ,客戶端最終將為條件為false時發出的請求提供服務。

我看不到拒絕請求的方法(沒有對應的Ethe.netServer.available() )。 我唯一想到的就是執行一個

server.available().stop();

在 else 塊的開頭。 這可以防止在條件為false時發出請求,但不會阻止客戶端和服務器之間的連接發生(這就像打開連接並立即關閉它一樣)。

當條件為false時,我怎樣才能完全避免建立連接?

我猜這里是因為我沒有方便的Arduino集合,但是從內存和閱讀參考中,您可以嘗試類似

void loop() 
{
    EthernetClient client = server.available();
    if ( !condition )
    {
        client.stop(); // break connection and do something else
    }
    else
    {
        // serve the client...
    }
}

希望至少可以在正確的方向上為您提供幫助。

干杯,

要禁用服務器時,是否可以僅返回404標頭?

if(!condition)
{
     client.println("HTTP/1.1 404 OK");
     client.println("Content-Type: text/html");
     client.println("Connnection: close");
     client.println();
     client.println("<!DOCTYPE HTML>");
     client.println("<html><body>404</body></html>");
}
else
{
     // serve client
}

我在這里寫下這個答案,因為它是唯一仍然活躍或尚未關閉的關於該主題的帖子。 盡管有無數關於能夠隨意打開或關閉 Ethe.netServer 的研究,但這是不可能的。 您唯一可以做的就是使用一些在 Ethe.net/W5100/W5200/W5500 庫的類中定義為“公共”的函數。 我注意到實際影響網卡可靠性的功能是:

#include <Ethernet.h>
#include <utility/w5100.h>
W5100.setRetransmissionTime(milliseconds);
W5100.setRetransmissionCount(number);

(有助於縮短Wi.net W5100/W5200/W5500.網卡超時時的等待時間)

EthernetClient::setConnectionTimeout(CONNECTION_TIMEOUT);
EthernetClient::setTimeout(CONNECTION_INPUT_STREAMING_TIMEOUT);

(它們有助於縮短連接到 Ethe.netServer 的客戶端超時時的等待時間)

更多提示:

  • Ethe.netServer::available()返回false時考慮使用Ethe.netServer::flush()刷新服務器緩沖區;
  • 使用Ethe.netClient::write()時也使用Ethe.netClient::flush()以確保所有數據已發送;
  • 在死機/無用客戶端上使用Ethe.netClient::close()輕松釋放 sockets。

考慮實現一個 function 到 force-close.network sockets,使用以下代碼:

#include <SPI.h>
#include <utility/w5100.h>
void closeAllSockets()
{
     for (int i = 0; i < MAX_SOCK_NUM; i++)
     {
         SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
         W5100.execCmdSn(i, Sock_CLOSE);
         SPI.endTransaction();
     }
}

void printAllSockets()
{
     for (int i = 0; i < MAX_SOCK_NUM; i++)
     {
         Serial.print(F("Socket #"));
         Serial.print(i);
         uint8_ts = W5100.readSnSR(i);
         Serial.print(F(": 0x"));
         Serial.print(s, 16);
         Serial.print(F(" "));
         Serial.print(W5100.readSnPORT(i));
         Serial.print(F(" D:"));
         uint8_t dip[4];
         W5100.readSnDIPR(i, dip);
         for (int j = 0; j < 4; j++)
         {
             Serial.print(dip[j], 10);
             if (j < 3)
                 Serial.print(".");
         }
         Serial.print(F("("));
         Serial.print(W5100.readSnDPORT(i));
         Serial.println(F(")"));
     }
}

MAX_SOCK_NUM根據網卡變化,Wi.net W5100最大為4個sockets,W5200和W5500最大為8個sockets。

希望這對某人有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM