Forum: Mikrocontroller und Digitale Elektronik UDP an mehrere Clients macht Problem


von Asdf A. (eizi)


Lesenswert?

Hallo,


ich sende mit dem Arduino und einem Ethernetshield an zwei weitere 
Arduinos mit Ethernetshield Daten via UDP.

1
Udp.beginPacket(clientip, clientport);
2
      Serial.println("Client 1 versendet Daten");
3
      Udp.print("123");
4
      Udp.endPacket();
5
6
7
Udp.beginPacket(client2ip, clientport);
8
      Serial.println("Client 2 versendet Daten");
9
      Udp.print("456");   
10
      Udp.endPacket();

Dies funktioniert ohne Probleme, und beide Clients bekommen dass an sie 
adressierte Datenpaket.

Wenn ich nun jedoch eine IF-Abfrage einbaue
1
if(hashabgleich2==1) {
2
      
3
      Udp.beginPacket(client2ip, clientport);
4
      Serial.println("Client 2 versendet Daten");
5
      Udp.print("456");   
6
      Udp.endPacket();
7
     
8
}

klappt das ganze bei erfüllter Bedingung ebenfalls Problemlos.


Bei zwei IF-Abfragen hintereinander, passiert allerdings etwas 
merkwürdiges:
1
      if(hashabgleich==1) {
2
3
      Udp.beginPacket(clientip, clientport);
4
      Serial.println("Client 1 versendet Daten");
5
      Serial.println(serverzeitid);
6
      Udp.print("123");
7
      Udp.endPacket();
8
      hashabgleich=0;     
9
10
 
11
}
12
13
      if(hashabgleich2==1) {
14
      
15
16
      Udp.beginPacket(client2ip, clientport);
17
      Serial.println("Client 2 versendet Daten");
18
      Udp.print("456");   
19
      Udp.endPacket();    
20
      hashabgleich2=0;
21
22
      
23
  }  
24
}


der Arduino sendet beide Zahlen also 123 und 456 in einem Datenpaket an 
client2ip obwohl diese unterschiedliche Empfänger eingetragen haben 
(clientip & client2ip), ich kann mir das einfach nicht erklären und 
werde langsam nervös, da dieses Projekt für die Schule dient und bald 
fertig sein muss wenn ihr mir da helfen könntet wäre das Klasse.


Hier die void setup() und die Definitionen der Variablen.

1
//IP-Libary-Definitionen
2
3
//Server Adresse:
4
byte servermac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEC };
5
IPAddress serverip(192, 168, 3, 1);
6
IPAddress serversubnet(255, 255, 255, 0);
7
IPAddress servergateway(192, 168, 3, 1);
8
int serverport = 8001; //Lokaler Port
9
10
11
//Client Adressen:
12
IPAddress clientip(192, 168, 3, 2); // IP-Adresse des 1 Clients
13
IPAddress client2ip(192, 168, 3, 3); // IP-Adresse des 2 Clients
14
int clientport = 8002; //Port der beiden Clients
15
16
17
char packetbuffer[UDP_TX_PACKET_MAX_SIZE]; //Bufferspeicher um Empfangene Pakete bis zur Bearbeitung zu speichern.
18
EthernetUDP Udp; //Beginnt eine UDP-Instanz
19
20
21
22
void setup() {
23
24
  Serial.begin(115200);
25
  Ethernet.begin(servermac, serverip, servergateway);
26
  server.begin();
27
  Udp.begin(serverport);
}

Was ich bereits probiert habe:

--> Wartezeit zwischen den beiden Udp.print's (10 Sekunden)
--> Udp.println, Udp.write klappen ebenfalls nicht
--> Außerhalb des ursprünglichen Sourcecodes in einer neuen Datei,  in 
zwei IF-Abfragen welche die Daten versenden tritt der Fehler ebenfalls 
auf.
-->Wenn eine IF-Abfrage auskommentiert wird klappt es wieder, ich denke 
es gibt ein Problem mit zwei UDP-Empfängern.
-->MAC & IP-Adresskonflikte sind ebenfalls keine vorhanden.

Bitte helft mir

von Asdf A. (eizi)


Lesenswert?

Ok, ich habe nun nach stundenlangem Suchen & Probieren in Google einen 
Hinweis auf eine begrenze Anzahl von Sockets des Ethernetshields 
gefunden, es ist mir zwar nicht klar warum bei einer simplen 
UDP-Nachricht das Socket nach dem Versand von der Libary nicht 
geschlossen wird wenn das ganze Protokoll sowieso verbindungslos 
aufgebaut ist jedoch stellte es sich heraus das wenn nach dem Befehl 
udp.stop & vor der nächsten Übertragung UDP.begin(clientport) aufgerufen 
wird die Datenübertragung reibungslos klappt.

Die Website von Arduino etc. weisen darauf überhaupt nicht hin, generell 
ist die gesamte Arduino-Netzwerk Dokumentation sehr sehr schlecht ich 
werde nach diesem Projekt versuchen C zu lernen.

von Hans Ulli K. (Gast)


Lesenswert?

Max E. schrieb:
> Ok, ich habe nun nach stundenlangem Suchen & Probieren in Google einen
> Hinweis auf eine begrenze Anzahl von Sockets des Ethernetshields
> gefunden, es ist mir zwar nicht klar warum bei einer simplen
> UDP-Nachricht das Socket nach dem Versand von der Libary nicht
> geschlossen wird wenn das ganze Protokoll sowieso verbindungslos
> aufgebaut ist

-> ICMP

Du möchstest aber auf dem Weg wissen, ob ein Router/Host das Paket nicht 
verwirft.

http://en.wikipedia.org/wiki/Internet_Control_Message_Protocol

ICMP Type 3

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.