Daten von Arduino über Udp nach Python

Moin moin,

seit Tagen versuche ich Daten über Udp nach meinem Python Skript zu schicken. Das Python Skript wartet bei der Zeile auf ein Message, was das Arduino-Skript ständig in loop schickt:

data, addr = sock.recvfrom(1024)

Dem Arduino ist eine statische Ip-Adresse "192.168.137.30" zugewiesen. Habe sie manuell in IPv4 bei Ethernet-Einstellung reingeschrieben. Die Ip-Adresse "169.254.114.182" ist dann die Ethernet Ipv4 Adresse vom Ipconfig-Kommando.
Ich hoffe, jemand hat ein Tipp für mich.

Arduino :

#include <SPI.h>
#include <SD.h>
#include <Ethernet2.h>
#include <EthernetUdp2.h>         // UDP library from: bjoern@cs.stanford.edu 12/30/2008

byte mac[] = {
  0xA8, 0x61, 0x0A, 0xAE, 0x2A, 0x12
};
IPAddress ip(192.168.137.30);

IPAddress ethernet_ip(169.254.114.182);

unsigned int localPort = 8880;      // local port to listen on
unsigned int pythonPort= 8881;      // local port to listen on

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;


void setup()
{
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);
  Serial.begin(115200);
  }

void loop()
{
   char  ReplyBuffer[] = "acknowledged";    
    Udp.beginPacket(ethernet_ip, pythonPort);
    Udp.write(ReplyBuffer);
    Udp.endPacket();
}

Python :

import serial
import time 
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('169.254.114.182', 8881))
data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
sock.close()

Ich gehe davon aus, dass beide im gleichen Netz (=Heimnetz wegen ipconfig?) sein sollen?
Dann passen die IP-Adressen nicht zusammen.

Gruß Tommy

Tommy56:
Ich gehe davon aus, dass beide im gleichen Netz (=Heimnetz wegen ipconfig?) sein sollen?
Dann passen die IP-Adressen nicht zusammen.

Gruß Tommy

Hi Tommy, magst du mir dann einmal sagen, warum die nicht zusammenfassen? Die beide sollen im gleichen Netz sein.

Hi

Die 169er IP deutet darauf hin, daß Du eben KEINE IP zugewiesen bekommst.

MfG

192.168.137.30 der Arduino

169.254.114.182 der Rechner mit Python

Wenn der bei Dir im gleichen Netz hängt, wie der Arduino, müsste der auch eine IP 192.168.137.xxx haben.

Wenn die 169.254.114.182 stimmt (womit ich mir nicht sicher bin), müsste der Arduino eine 169.254.114.xxx bekommen. Da das aber keine privater Adressbereich ist, wirst Du da wohl nicht selbst eine IP daraus vergeben können.

An welchem Anbieter hängt Dein lokales Heimnetz, dass Du eine öffentliche IP hast?

Evtl. könntest Du dem PC eine weitere statische IP im Bereich 192.168.137.xxx geben. Da musst Du probieren.

Grob gesagt: IP-Adresse & Netzmaske (bitweises UND) müssen gleich sein.

Gruß Tommy

Edit: @postmaster-ino:

Die 169er IP deutet darauf hin, daß Du eben KEINE IP zugewiesen bekommst.

Kannst Du diese Aussage belegen?

Gruß Tommy

Hi

Die 169er IPs hängen mit Avahi / Bonjour zusammen, ein, meines Wissen von Apple entwickelte Art Geräte per Netzwerk zu verbinden (Bonjour), Linux kann Das ebenfalls (Avahi) und bei Windows treten bei nicht konfiguriertem Netzwerk die 169er IPs ebenfalls ans Tageslicht - wird hier wohl ähnliche Mechanismen benutzen.

Man kann (wenn man kann) So ohne Konfiguration des Netzwerk Daten austauschen - eine Zeit lang nutzte ich z.B. den Messenger Pidgin für eine Art Haus-Chat, um Daten einfach von A nach B zu schicken - ach ja, dieser IP-Bereich funktioniert NUR lokal, also weder Verbindungen von, noch nach Außen sind damit möglich.

Wie geschrieben Alles nur angelesen, hatte mich Mal eine Zeit lang damit beschäftigt.

MfG

Zu den offiziellen privaten IP-Bereichen gehört es jedenfalls nicht.

Das das ein Kennzeichen für keine Adresse per DHCP vergeben ist, war mir neu.
Wieder was gelernt. Danke.

Also muss der TO erst mal sein Heimnetz in Ordnung bringen.

Gruß Tommy

Habe noch alles von vorne angefangen:

  1. ipconfig in cmd liefert mir eine IPv4 Adresse "169.254.114.182" .

  2. Diese Adresse habe ich benutze ich weiter im Arduino Skript :

IPAddress ip(169, 254, 114, 182);
unsigned int localPort = 7476; 

void setup()
{
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);
  Serial.begin(115200);

  }

void loop()
{
int packetSize = Udp.parsePacket();
Serial.println(packetSize);
}
  1. Mit Serial.println(packetSize); kann ich feststellen, dass eine Datenübertragung von Python nach Arduino möglich ist.

  2. Nun von Arduino nach Python :

IPAddress ip(169, 254, 114, 182);
unsigned int localPort = 7476; 

void setup()
{
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);
  Serial.begin(115200);

  }

void loop()
{
Udp.beginPacket(ip,localPort);

    Udp.print("hello");

    Udp.endPacket();
}

Python :

import serial
import time 
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('', 8881))
data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
sock.close()
  1. Keine Daten kommen an Python an.....

  2. Ipconfig liefert nun eine andere IPv4 Adresse : "169.254.94.133". Schalte ich Arduino aus, ist IPv4 wieder die Adresse : "169.254.114.182" . Router benutze ich nicht, sondern verbinde direkt mein Laptop mit dem Arduino über ein LAN-Kabel.

Dann lege doch den Arduino mal auf eine andere Adresse aus dem Bereich. Z.B.

IPAddress ip(169, 254, 114, 130);

Gruß Tommy

Edit: Müsste das nicht ein Crossover-Kabel sein? Ich glaube die PC-Karten können das richtig erkennen, der Arduino evtl. nicht. Das ist nur eine Vermutung, da ich mit solchen Konstellationen noch nie gearbeitet habe.

Tommy, mit

IPAddress ip(169, 254, 114, 130);

habe ich immer noch das selbe Problem. Datenübertragung von Python nach Arduino funktioniert, aber nicht anders rum.

Ich habe aber bis jetzt immer mit selben Ip Adresse die Daten empfangen und gesendet :

IPAddress ip(169, 254, 114, 130);
unsigned int localPort = 7476; 

void setup()
{
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);
  Serial.begin(115200);

  }

void loop()
{
    Udp.beginPacket(ip,localPort);
    Udp.print("hello");
    Udp.endPacket();
}

Die Ip-Adresse, wo Arduino seine Daten hinschickt habe ich mit der Ethernet IPv4 von ipconfig ersetzt.

IPAddress ip(169, 254, 114, 130);
IPAddress my_PC_ip(169, 254, 94, 133);
unsigned int localPort = 7476; 
unsigned int pythonPort= 7000; 

void setup()
{
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);
  Serial.begin(115200);

  }

void loop()
{
    Udp.beginPacket(my_PC_ip,pythonPort);
    Udp.print("hello");
    Udp.endPacket();
}

Die Daten kommen bei Python trotzdem nicht an.

Hi,

die 169.254.xxx.xxx-IPs werden bei Windows (MacOS/Linux?) nur gesetzt, wenn dem PC keine private IP zugewiesen werden konnte, was in deinem Fall durch den fehlenden Router zutrifft, oder keine Verbindung ins Netzwerk besteht. (Laienhaft ausgedrückt :wink: )

Versuch mal am Laptop eine feste IP zuzuweisen, z.B.
IP: 192.168.0.10
Subnetmask: 255.255.255.0
Standardgateway: Nach und nach testen, 1. leer lassen, 2. 192.168.0.10 oder 3. 192.168.0.1 (Fiktiv da nicht vorhanden).
DNS kannst du leer lassen.

Dann im Arduino-Sketch die z.B.
IP: 192.168.0.20
Subnetmask: 255.255.255.0
Standardgateway: leer lassen oder die 192.168.0.10 angeben.

Wie du Subnetmask und Gateway im Arduino festlegst, kann ich mir nicht sagen, dazu fehlt mir die dazugehörige Lib, aber wenn das mit den Libs möglich ist, solltest du das hinkriegen. Allerdings bin ich mir mit dem Crossover-Kabel auch nicht sicher, wie Tommy56 schon sagte:

Müsste das nicht ein Crossover-Kabel sein? Ich glaube die PC-Karten können das richtig erkennen, der Arduino evtl. nicht.

Eine Unschuldige Frage:

IPAddress ip(192.168.137.30);
...
IPAddress ip(169, 254, 114, 130);

kommen da jetzt Punkte oder Beistriche hin?

Grüße Uwe

Im Constructor Kommas (Beistriche?), weil es 4 Bytewerte sind. Mit Punkten müsste es eine Zeichenkette sein, die dann zerlegt wird.

Gruß Tommy

uwefed:
Eine Unschuldige Frage:

IPAddress ip(192.168.137.30);
...
IPAddress ip(169, 254, 114, 130);

kommen da jetzt Punkte oder Beistriche hin?

Grüße Uwe

Gute Frage - nächste Frage... Ohne die Lib des TOs zu kennen, wird es wohl keiner beantworten können :wink:

Gruß
Jörg

wapjoe:
Gute Frage - nächste Frage... Ohne die Lib des TOs zu kennen, wird es wohl keiner beantworten können :wink:

Gruß
Jörg

Aber sicher ist, daß eine der 2 Schreibweisen falsch ist, wenn es sich immer um die gleiche Lib handelt.
Grüße Uwe

Die Punktschreibweise ist falsch.

Gruß Tommy