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()
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.
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.
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()
Keine Daten kommen an Python an.....
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.
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 )
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.