hallo,
ich möchte zwei PCs mit meinem Arduino Uno übers LAN starten lassen.
Die PCs sprechen beide über WOL an, ich kann diese über die FritzBox
einwandfrei starten.
Wenn ich Sie aber über den Arduino starten lasse, startet nur ein PC.
Warum?
Hier der Code:
Hm ... ohne jetzt tiefer in den Code eingestiegen zu sein, muss da
irgendwas fehlen. Vlt. solltest du dich mal mit dem Prinzip von WOL
vertraut machen.
- eine schlafende Netzwerkkarte hat keine IP-Adresse, man muss die
WOL-Pakete per Broadcast ins Netz blasen, egal ob TCP oder UDP
- innerhalb der "magic packet" muss die MAC-Adresse der Netzwerkkarte
des zu weckenden PC enthalten sein
Beides kann ich in dem obenstehenden Code nicht sehen. Ich habe hier mal
etwas BASIC-Code (RealBasic für Mac, funktioniert 100%ig), vlt. kannst
du den lesen und adaptieren:
1
dim usock as UDPSocket
2
dim macbin, mac16, pref as string
3
dim i as integer
4
5
macbin="00f83d2200de" //mac address without extra chars, no ':' or '-'
noch ein Nachtrag: Im obenstehenden Code muss muss die Mac-Adresse DOCH
mit ':' angegeben werden. In der For-Schleife darunter werden die
einzelnen Bytes separiert ...
Also, ich habe gerade mal die mac adressen der zwei PCs in meinem
Programm getauscht.
Jetzt startet der PC der zuvor nicht startete und der PC der startete
startet nichtmehr ^^
Ich nehme mal an, dass pc_mac_2 der startende PC war, da für diesen
aufgrund der fehlenden Klammer keine if-Bedingung galt und das WOL-Paket
somit in jedem Schleifenlauf gesendet wurde.
Also mal probieren, WOL() mehrfach für beide PCs auszuführen.
Z.B.
Sönke Peters schrieb:> Ich nehme mal an, dass pc_mac_2 der startende PC war, da für> diesen
Richtig.
Leider funktioniert es mit deinem Beispiel auch nicht.
heinzz schrieb:> Sönke Peters schrieb:>> Ich nehme mal an, dass pc_mac_2 der startende PC war, da für>> diesen> Richtig.>> Leider funktioniert es mit deinem Beispiel auch nicht.
Mal Wireshark angeworfen und geschaut was da genau gesendet wird und ob
sich WOL 1 von WOL2 irgendwie unterscheidet?
Oder lass es und werd Gärtner. Wer Code abtippt (auch noch falsch), nix
selber kann und wenns dann nicht sofort geht, doof dreinschaut und
keinerlei Debugging betreiben will oder kann, der sollte es einfach
lassen.
Hallo,
ist es richtig, dass immer nur der PC startet, der als zweites
angesprochen wird? Falls ja, würde ich mal tippen, dass es am Anfang zu
schnell geht und deshalb die erst angesprochenen Netzwerkkarte nicht
reagiert. Versuche mal vorher noch eine "DUMMY" WOL durchzuführen, oder
die erste Karte zweimal zu wecken. Eventuell ein Timingproblem?
Jochen
ne geht auch nicht
Jochen S. schrieb:> Hallo,>> ist es richtig, dass immer nur der PC startet, der als zweites> angesprochen wird? Falls ja, würde ich mal tippen, dass es am Anfang zu> schnell geht und deshalb die erst angesprochenen Netzwerkkarte nicht> reagiert. Versuche mal vorher noch eine "DUMMY" WOL durchzuführen, oder> die erste Karte zweimal zu wecken. Eventuell ein Timingproblem?>> Jochen
geht leider auch nicht.
Daniel A. schrieb:> Vileicht geht es wenn du zwichen den WOL ein delay einbaust. Das wäre> dann aber nicht die Lösung, sondern nur ein workarround.
Oder vielleicht um Mitternacht nochmal probieren und vorher nen Hahn
schlachten.
Lieber blindes rumgestocher und trial&error statt mal zielführende
Fehlersuche.
Was mir mal direkt auffällt:
heinzz schrieb:> char WOL_done = 0;> ...> void loop() {> if (! WOL_done)> WOL(pc_mac);> WOL(pc_mac_2);> WOL_done = 1;> }
Es ist nur WOL(pc_mac) vom if(...) betroffen, nicht aber WOL(pc_mac_2),
weil die { } bei dem if fehlen. vom Prinziep steht da halt:
1
voidloop()
2
{
3
if(!WOL_done)
4
{
5
WOL(pc_mac);
6
}
7
WOL(pc_mac_2);
8
WOL_done=1;
9
}
Das heißt WOL(pc_mac) wir maximal ein einziges mal ausgeführt, wenn das
nicht klappt, naja, dann hat es halt nicht geklappt und wird nie wieder
aufgerufen.
Es sollte wohl eher
1
voidloop()
2
{
3
if(!WOL_done)
4
{
5
WOL(pc_mac);
6
WOL(pc_mac_2);
7
}
8
WOL_done=1;
9
}
heißen. Wo genau du da jetzt dein WOL_done = 1 hin sortieren musst,
überlasse ich dir. Denn in dem if-Block oder hinter dem if-Block hat
beides den selben effekt: der if-Block wird nur einmal aufgerufen, dann
nie wieder, und wenn das WOL bei einmaligem aufrufen nicht geklappt hat,
naja, dann haste halt pech gehabt.
heinzz schrieb:> Die PCs sprechen beide über WOL an, ich kann diese über die FritzBox> einwandfrei starten.> Wenn ich Sie aber über den Arduino starten lasse, startet nur ein PC.> Warum?
Offensichtlich macht die Fritzbox etwas anderes als der Arduino. Das
könnte z.B. daran liegen, daß WOL kein Standard ist, sondern nur ein
"Standard". Soll heißen daß jeder Hersteller sein eigenes Süppchen kocht
und daß was auf einem System funktioniert, nicht notwendig auch auf dem
anderen funktionieren muß.
Ich könnte mir gut vorstellen, daß die Fritzbox mehrere WOL Methoden
implementiert (nicht nur das magic packet von oben).
Wirf also den Netzwerk-Sniffer an (Wireshark oder womit auch immer du
klar kommst) und analysiere, was die Fritzbox sendet. Sieh es als
Chance, etwas über Ethernet und IP zu lernen.
XL
heinzz schrieb:> alles klar, nur welche informationen aus Wireshark braucht ihr?> Ich komm mit dem Programm null klar
GRMPF wer großartig fürs Netzwerk entwickeln will, der sollte mit
Netzwerk-Sniffern klarkommen. Wireshark zeichnet einfach den
Netzwerkverkehr auf und zeigt dir alle Infos zu jedem Paket an (inkl.
Aufdröselung aller Schichten darin).
Als 1. Musst du aber sicherstellen, das dein WOL Paket überhaupt bei
deinem sniffenden PC ankommt. Ein Switch leitet das Paket anhand seiner
MAC Zieladresse nur aus dem Port raus, wo auch das Zielgerät häng (wenn
der Switch die MAC Adresse bereits gelernt hat). In diesem Fall einfach
WOL-Sender direkt an Netzwerkkarte von sniffendem PC ran. Alternative:
Managed Switch wo man einen Port als "Monitoring" einstellen kann oder
dummen Hub nutzen.
Dann kannst du in Wireshark z.B. nach Protokoll filtern oder nach Ziel
bzw. Absender MAC-Adresse. Du kannst sogar direkt nach WOL Paketen
filtern. Ja und dann schaust dir mal an OB da 2 WOL Pakete rausgehen und
WAS da drin steht (Ziel-MAC Adresse korrekt, Inhalt korrekt usw.)
Und ICH will gar keine Infos aus Wireshark. Aber ich sage, wenn man Zeug
fürs Netzwerk programmiert, dann ist es sehr sinnvoll, zu schauen OB und
WAS aus meinem Gerät denn wirklich ins Netzwerk raus geht. Alles andere
ist im Fehlerfall nämlich Kaffeesatzlesen.
Und JA, Grundlagen im Bereich Netzwerk (d.h. die wichtigsten Protokolle
und Schichten) sollten schon da sein. Dann wird auch Wireshark auf
einmal logisch.
gruß cyblord
cyblord ---- schrieb:> Als 1. Musst du aber sicherstellen, das dein WOL Paket überhaupt bei> deinem sniffenden PC ankommt. Ein Switch leitet das Paket anhand seiner> MAC Zieladresse nur aus dem Port raus, wo auch das Zielgerät häng (wenn> der Switch die MAC Adresse bereits gelernt hat). In diesem Fall einfach> WOL-Sender direkt an Netzwerkkarte von sniffendem PC ran. Alternative:> Managed Switch wo man einen Port als "Monitoring" einstellen kann oder> dummen Hub nutzen.
Dürfte in diesem Fall ja egal sein, da das WOL-Paket ja eine Broadcast
Nachricht ist.
heinzz schrieb:> Also, ich habe gerade mal die mac adressen der zwei PCs in meinem> Programm getauscht. Jetzt startet der PC der zuvor nicht startete und> der PC der startete startet nichtmehr ^^
Na dann! einfach einen zweiten Arduino aufstellen und jeweils anders
konfigurieren - fertsch.
X2 schrieb:> Dürfte in diesem Fall ja egal sein, da das WOL-Paket ja eine Broadcast> Nachricht ist.
War auch eher als allgemeiner Tip gedacht. Aber auch WOL kann und wird
meist direkt an die Ziel-MAC Adressiert. Die ist ja bekannt.
gruß cyblord
Zunächst einmal den Code ausräumen:
Warum wird in setup() ein Udp.begin(7) aufgerufen? Du willst Doch nicht
selbst UDP-Pakete empfangen? Unter Umständen kommt hier der TCP-Stack
des Shields durcheinander, wenn er eigene Pakete empfängt, die nicht
verarbeitet werden?
Das Einzige, was in setup() aufgerufen werden muss, ist
Ethernet.begin(...)!
Wo kommt die MAC des Arduino-Shields her? Ist die im Netzwerk wirklich
eindeutig?
Sind die MAC-Adressen der Empfänger eindeutig?
Ggf. Ethernet.begin(..) inkl. Subnet-Mask aufrufen, ggf. ist der
ARP-Resolver des Shields unsauber. Leider gibt es da keinen Zugriff
drauf.
Weiterhin ggf. auch mal den UDP-Zielport 9 auswählen, dieser ist meiner
Kenntnis nach sogar weiter verbreitet.
http://wiki.wireshark.org/WakeOnLAN
Und dann ruhig die Pakete mal im Endlos-Loop schicken, begrenzen kannst
Du dann immer noch.
Um das sinnvoll zu debuggen, kann ein Linux-Rechner mit an den Switch,
der KEINE IP-Adresse auf dem Interface gebunden hat, das im WOL-LAN
hängt. Darauf dann einen "tcpdump -i interface-name -s0 -w
dateiname.cap" laufen lassen, das Ganze dann in Wireshark ansehen.
Es muss sichergestellt sein, dass der Arduino die MAC-Adresse des
Testrechners NICHT in seinem ARP-Cache hat. Ggf. ist die
Implementierung des Sendens an die Broadcast-Adresse im Shield daneben
und sendet nur an MAC-Adressen, die im ARP-Cache sind. Das solltest Du
aber dann im Dump sehen!
Ich würde das Programm zunächst mal so abändern:
1
#include<SPI.h>
2
#include<Ethernet.h>
3
#include<EthernetUdp.h>
4
5
// ETHERNET CONFIGURATION
6
bytemac[]={0x90,0xA2,0xDA,0x0D,0xB1,0xAC};// Arduino's MAC address
7
byteip[]={192,168,178,21};// Arduino IP address
8
bytegw[]={192,168,178,1};// Gateway IP address
9
bytebc[]={192,168,178,255};// Broadcast IP address
10
bytenm[]={255,255,255,0};// Netmask
11
12
// WOL CONFIGURATION
13
bytepc_mac[]={0x--,0x--,0x--,0x--,0x--,0x--};//PC startet nicht
14
bytepc_mac_2[]={0x--,0x--,0x--,0x--,0x--,0x--};//Startet schon