私はイーサネットシールド付きArduino Unoを使用しています。多くのクライアントの印刷後にArduino(Uno)イーサネットクライアント接続が失敗する
多くのHTTP要求(、client.println(...)、)を送信した後、接続時にクライアントが失敗し始めます。故障までの時間はランダムであるように見え、ループからのシーケンス読み取り値は〜1000〜7000の間で変化することがあります。
エラーがここ
が失敗しているコードである(this advice後)オーバーフローイーサネット送信バッファに関係しない。
#include <Ethernet.h>
#include <SPI.h>
// Network constants
byte mac[] = {0x00, 0x23, 0xdf, 0x82, 0xd4, 0x01};
byte ip[] = {/*REDACTED*/};
byte server[] = {/*REDACTED*/};
int port = /*REDACTED*/;
Client client(server, port);
// State
int sequence;
void setup(){
Ethernet.begin(mac, ip);
Serial.begin(9600);
sequence = 0;
delay(1000);
}
void loop(){
httpPut("/topic/:test/publish?sessionId=SESenanhygrp");
Serial.println(sequence++);
}
void httpPut(char* url){
if (!client.connect()) {
Serial.println("EXCEPTION: during HTTP PUT. Could not connect");
return;
}
client.print("PUT");
client.print(" ");
client.print(url);
client.println(" HTTP/1.0");
client.println();
while(!client.available()){
delay(1);
}
while(client.available()) {
char c = client.read();
Serial.print(c);
}
while(client.connected()){
Serial.println("Waiting for server to disconnect");
}
client.stop();
}
エラーは、次のセグメントで発生
if (!client.connect()) {
Serial.println("EXCEPTION: during HTTP PUT. Could not connect");
return;
}
クライアントが接続に失敗した時点で、私は2つのことを行います:(1)サーバーログで何らかのエビデンスがないかチェックしてください障害の発生した接続要求を受信したサーバの名前。 (2)サーバー上で 'netstat'を使用して、以前の接続が閉じられているか、残っているかを確認します。 – NPE
上記に加えて、3)スタックがオーバーフローしているかどうかを確認します。 4)何千回ものサイクル後にメモリリークが発生していますか? – Jeff
サーバーログに問題はありませんでした。 Arduinosを使用しているときは常にメモリが問題になりますが、上記のコードはかなりメモリ保護されている必要があります – ChrisSSocha