[英]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.