WIFI+UDP+NTP keine Verbindung

Guten Abend

Ich betreibe das Wifi Shield (bereits firmwareupdate) hinter einer Fritzbox. Die Verbindung klappt. Ich möchte per UDP und NTP einen Zeitserver anrufen bekomme aber nur ein paket “Null” zurück.
hier der Code:

#include <SPI.h>
#include <WiFi.h>
#include <WiFiUdp.h>

int status = WL_IDLE_STATUS;
char ssid[] = "FRITZ!7390"; //  your network SSID (name)
char pass[] = "xxxxxxxxxxxx";        // your network password
int keyIndex = 0;                        // your network key Index number (needed only for WEP)

unsigned int localPort = 8888;         // local port to listen for UDP packets
IPAddress timeServer(165, 193, 126, 229); // 129, 143, 2, 23 time.nist.gov NTP server
const int NTP_PACKET_SIZE = 48;        // NTP time stamp is in the first 48 bytes of the message
byte packetBuffer[NTP_PACKET_SIZE];    //buffer to hold incoming and outgoing packets
WiFiUDP Udp;                           // A UDP instance to let us send and receive packets over UDP

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  String fv = WiFi.firmwareVersion();
  Serial.println(WiFi.firmwareVersion());
  if ( fv != "1.1.0" )
    Serial.println("Please upgrade the firmware");
    
  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    // don't continue:
    while (true);
  }



  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  }

  Serial.println("Connected to wifi");
  printWifiStatus();

  Serial.println("\nStarting connection to server...");
  Udp.begin(localPort);
}

void loop()
{
  Serial.println("Los...");
  sendNTPpacket(timeServer); // send an NTP packet to a time server
  // wait to see if a reply is available
  delay(10000);
  Serial.println( Udp.parsePacket() );
  if ( Udp.parsePacket() ) {
    Serial.println("packet received");
    // We've received a packet, read the data from it
    Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer
    //the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, esxtract the two words:
    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    Serial.print("Seconds since Jan 1 1900 = " );
    Serial.println(secsSince1900);

    // now convert NTP time into everyday time:
    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears;
    // print Unix time:
    Serial.println(epoch);


    // print the hour, minute and second:
    Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
    Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
    Serial.print(':');
    if ( ((epoch % 3600) / 60) < 10 ) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
    Serial.print(':');
    if ( (epoch % 60) < 10 ) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.println(epoch % 60); // print the second
  }
  // wait ten seconds before asking for the time again
  delay(10000);
}

// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address)
{
//Serial.println(address);
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
//Serial.println("2");
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;
//Serial.println("3");
  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  Udp.beginPacket(address, 123); //NTP requests are to port 123
//Serial.println("4");
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
//Serial.println("5");
  Udp.endPacket();
//Serial.println("6");
}


void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

Der Zeitserver lebt aber. Dh mit einem NTP toll gibt er Antwort.
Warum erhält dann der UNO per WIFI nur NULL? DAnke für jeden Hinweis.
Combo

Was ist ein "NULL" Paket? Kriegst Du gar kein Paket zurück? Oder eines, das mit Nullen gefüllt ist? Hast Du mal einen Sniffer (z.B. WireShark) mitlaufen lassen?

Hallo pylon
nach der zeile

 sendNTPpacket(timeServer); // send an NTP packet to a time server
  // wait to see if a reply is available
  delay(10000);
  Serial.println( Udp.parsePacket() );

kommt halt im Monitor "0".
Hmm. ein sniffer bringt nix weil alle Rechner über Lan angebunden sind. Ich habe sonst keinen Wlan Adapter.
Wie kann ich dann Testen was das Shield sendet?
An der Fritzbox ist es jedenfalls angemeldet.

VG Combo

Der Zeitserver lebt aber. Dh mit einem NTP toll gibt er Antwort.

Mit welchem Tool hast Du das geprüft? Viele Tools verwenden TCP, um zum NTP server zu connecten, wenn das Tool also durchkommt, heisst das noch nicht, dass der Arduino mit UDP auch freie Bahn hat.

kommt halt im Monitor "0".

Das heisst, dass keine Antwort kam. Dies kann genauso gut von einem Netzwerk-Problem verursacht sein (Firewall könnte z.B. UDP-Traffic blockieren).

Ich habe aber UDP-Kommunikation mit dem WiFi-Shield auch noch nie versucht, kann also nicht ausschliessen, dass dort noch ein Problem vorhanden ist.

ok. Danke. Den Zeitserver habe ich mit "NTPTool" angepingt und es kommt eine Antwort. Ob der jetzt TCP oder UDP nimmt, erkenne ich nicht. Firewall ist zu dem Zwecke aus und alle UDP ports zum Wifishild hin sind offen.

Falls UDP nicht geht, wie kann ich den Zeitserver per TCP abfragen? Gibt es einen Codeschnipsel?
Danke.
Combo

Mit der Fritzbox kannst Du den Traffic mitschneiden und danach im WireShark anschauen:

http://www.nwlab.net/netzwerk-forum/Netzwerktechnik/Tools/Frage-netwerk-traffic-bei-Anschlusz-an-Fritzbox-einsehbar-1196.html

Versuche das mal, wenn Du Dein NTPTool einsetzt und wenn Du den Arduino machen lässt. Wenn Du beim NTPTool Pakete siehst (seien das nun UDP oder TCP), beim Arduino aber nicht, so haben wir das Problem erfolgreich eingegrenzt. Andernfalls kannst Du den Mitschnitt vielleicht posten (vorher schauen, dass keine heiklen Informationen enthalten sind).

Hallo Pylon
Danke erstmal.

ok das mitloggen klappt. Ich sehe im Protokoll das Shield wenn es sich anmeldet. Aber dann ist ruhe. kein Paket mehr.
Im Serial Monitor läuft der code aber weiter.

Wie weiter?

Combo

Wenn Du mit dem NTPTool einen Anfrage absetzt, siehst Du dann UDP-Pakete auf der FritzBox?

Ich sehe im Protokoll das Shield wenn es sich anmeldet.

Das wäre dann? DHCP-Anfrage und Antwort. Noch mehr?

Erweitere mal Deinen Code, so dass die Rückgabewerte auf die serielle Schnittstelle ausgegeben werden (v.a. von Udp.endPacket()).

Hi Pylon

  1. Frage : nein sehe ich garnicht von udp Protokoll

  2. Frage:
    Im PAcket ist zu sehen
    Fritzbox an WIFI DHCP Offer
    Fritzbox an WIFI DHCP ACK

uns dann eben nix mehr unter der IP vom Shield.

  1. Frage: Udp.endPacket() liefert an seriellen Schnittstelle den Wert "0"

Was tun?
Danke
Combo

  1. Frage : nein sehe ich garnicht von udp Protokoll

Siehst Du denn dort wenigstens mindestens ein Paket, das den Zielport 123 hat? Wurde das mit TCP geschickt?

  1. Frage: Udp.endPacket() liefert an seriellen Schnittstelle den Wert "0"

Das heisst zumindest, dass das WiFi-Shield auch der Meinung ist, dass das Paket nicht verschickt wurde. Deshalb mal eine grundlegende Frage: hast Du mal versucht, mit dem WiFi-Shield einen Server per TCP zu erreichen, also z.B. eine Webseite abzurufen? Damit wäre zumindest grundsätzlich geklärt, ob die Netzwerkparameter richtig eingestellt wurden.

Hi und guten Abend
zu1. Nein sehe ich nichts.
zu 2. ich bekomme auch kein TCP hin. Nix ist erreichbar. Nur in meinem Netztwerk ist das shield sichtbar. Auch wenn ich das Shield als Webserver laufen lasse, ist die IP des Shields aus meinem netzwerk nicht erreichbar.
Es schein als ob Fritz alles sperrt. Alle Port zum Shield sind aber offen. Sogar als expended Host ist das shield eingestellt.

Ich probiers über Ostern mal mit einem anderen Router.
Ich weiss nicht weiter..
VG
Combo

zu1. Nein sehe ich nichts.

Dann bezweifle ich, dass die Verbindung über die Fritzbox geht. Wenn das Tool funktioniert und einen Zeitwert liefert, aber auf der Fritzbox keine Pakete durchgehen, dann hast Du womöglich eine falsche Vorstellung, wie Dein Netzwerk aufgebaut ist.

zu 2. ich bekomme auch kein TCP hin. Nix ist erreichbar. Nur in meinem Netztwerk ist das shield sichtbar. Auch wenn ich das Shield als Webserver laufen lasse, ist die IP des Shields aus meinem netzwerk nicht erreichbar.

Was heisst sichtbar? Kannst Du den Arduino anpingen? Ich fürchte, wenn sowohl TCP als auch UDP nicht gehen, liegt das Problem komplett anderswo und so aus der Ferne würde ich auch auf die Fritzbox tippen, allerdings sind das im Normalfall sehr zuverlässige und einfach zu konfigurierende Geräte. Wenn Du das Teil also nicht komplett verkonfiguriert hast, sollte das schon hinzukriegen sein.
Versuche ein Notebook mit WiFi aufzutreiben, damit Du dort direkt den WLAN-Verkehr sniffen kannst und sehen kannst, was die Fritzbox auf die Anfragen des Arduinos zurückgibt.

Hallo

Ja mein Netzwerk stimmt schon.

Ich hab nen Router von Linksys probiert. Verbindung zum Shield klappt aber auch hier keine eingehenden Pakete vom Shield zu sehen. :0
Ich geb auf uns steig auf LAN um .
Danke für das mitdenken..
combo