Hallo Zusammen
Ich nutze den von G. Menke angepassten Webserver von U. Radig auf meinem
AVR NET IO:
http://www.mikrocontroller.net/articles/AVR_Net-IO_Bausatz_von_Pollin#Webserver_von_G._Menke
Das funktioniert soweit auch ganz gut.
Nun möchte ich, dass der NET IO regelmäßig eine IP bei mir im LAN
anpingt (192.168.1.107) und prüft ob die IP erreichbar ist. Leider habe
ich bisher nicht ganz kapiert wie die wohl dafür zuständige Funktion
command_ping() aufgerufen werden muss, und an welcher Stelle dann auch
das Resultat (ping erfolgreich oder nicht erfolgreich) im Programm
erscheint.
Meine bisherigen Versuche mit der Funktion waren nicht erfolgreich. Ich
versteh auch den Sinn der ersten Zeile nicht so richtig:
1
if(*((unsignedint*)&variable[0])!=0x00000000)
Also, dass variable[0] nicht gleich 0 sein darf ist mir klar. Aber was
bedeuten die * und warum wird hier überhaupt die variable geprüft?
Dann hab ich einfach mal alles auskommentiert bis auf die Zeile
dann über UART den Hinweis ausgegeben hätte. Leider kommt da gar nichts
:-(
Der UART funktioniert aber, das habe ich natürlich vorher getestet. Und
192.168.1.107 lässt sich auch problemlos von einem PC im Netzwerk
anpingen.
Wie wichtig ist die Funktion
ich kann dir nicht weiterhelfen, stehe aber mit meinem webserver genau
vor dem gleichen problem wie du: Wie sendet man irgendetws vom
webserver?
die funktion arp_request kannst du sicher nicht weglassen. die
arp-tabelle steuert den datenaustausch.
Ich versuche gerade den Stack-speicher >eth_buffer< auszulesen. das echo
auf den ping müsste über diesen empfangen werden.
Zumindest bin ich schon mal nicht alleine mit meinem Problem :-)
Die Idee mit wireshark ist nicht schlecht. Ich hoffe, dass ich heute
Abend dazu komme und ein paar neue Erkenntnisse gewinne.
Trotzdem hier nochmal der Aufruf an die die wissen wie das Ganze
funktioniert: ein kleiner Tipp von euch wäre super :-)
Na ja.
So schwer kann das aber nicht sein
variable ist offensichtlich ein Eingangswert, höchst wahrscheinlich sind
das die Werte, die über die COmmand line eingegeben werden.
Eine Command Line von
"ping 192.168.0.97"
führt zu
1
variable[0] 192
2
variable[1] 168
3
variable[2] 0
4
variable[3] 97
Die einzige Frage, die sich stellt ist, ist die Reihenfolge genau so
oder genau anders rum. Das lässt sich aber rauskriegen, in dem man
einfach mal eine Debug Ausgabe in den Code einbaut, flasht und über die
Command Line einen ping eingibt.
D.h. hier
1
if(*((unsignedint*)&variable[0])!=0x00000000)
wird geprüft, ob es eine eingabe gab, denn der Benutzer könnte ja auch
einfach
"ping"
eingegeben haben, und dann soll nichts schlimmes passieren.
Hier
wird aus der Eingabe die intern verwendete IP-Adresse zusammengebaut,
indem das Array ping.ip1 als unsigned long aufgefasst wird (4 Bytes).
Der rechte Teil der Zuweisung ist einfach nur das Zusammenstoppeln der 4
Einzelbytes zu einem derartigen unsigned long.
Man hätte die Bytes auch direkt zuweisen können, hätte aber dann darauf
achten müssen, dass die Bytereihenfolge korrekt ist. So erledigt das der
COmpiler und zeitkritisch ist es an dieser Stelle auch nicht.
hier
wird dann der Ping abgesetzt, dessen Antwort dann über die anderweitigen
üblichen Kanäle eingeholt wird.
Willst du also per Programm 192.168.1.107 anpingen, dann würde ich mir
dafür eine Funktion schreiben
ich geh mal davon aus, dass 'ping' eine globale Variable ist, die
benötigt wird, damit bei der empfangenen Antwort die entsprechende
Ausgabe gemacht werden kann.
> und an welcher Stelle dann auch das Resultat (ping erfolgreich oder nicht
erfolgreich)
Wie das beim Menke Server ist weiß ich nicht.
Aber der COde vom Radig Ulrich schreibt als Antwort 'PONG' hin. Wenn du
also nach dem Text suchst, müsstest du die Stelle im Code finden, an der
die Antwort eintrudelt und ausgewertet wird bzw. wo dann entschieden
wird, ob der ping als 'in den Timeout gelaufen' deklariert wird und aus
der Liste der offenen Pakete ausgetragen wird.
scheint die Stelle zu sein, an der die ICMP Antwort ausgewertet wird.
Wenn sie reichtig ist, wird ping.result auf 1 gesetzt.
Jetzt muss man noch finden, wo diese 1 ausgewertet wird.
Wobei das hier
> %i.%i.%i.%i\r\n",ping.ip1[0],ping.ip1[1],ping.ip1[2],ping.ip1[3]
eine Möglichkeit eröffnet, wie man diesen ganzen unsigned long
Palawatsch gar nicht braucht.
Ich denke, da waren sich die Autoren selbst nicht einig, wie das laufen
soll, bzw. sie haben hier bei den Funktionen
arp_request ( ... )
icmp_send( ... )
nicht gut genug überlegt, wie sie die Parameterübergabe machen wollen.
Da fehler eine Struktur, die einzig und alleine den Zweck hat, eine
IP-Adresse in Form von 4 Bytes zu speichern (vielleicht gibt es die
sogar irgendwo, müsste man im Code stöbern), und dann sowas anstelle des
unsigned long zu übergeben. Sowas ist sowieso eine Unsitte, wie man
spätestens beim Anstieg der CPU-Bitzahlen seit einigen Jahren immer
wieder deutlich merkt.
Hallo Zusammen
Hat leider etwas länge gedauert bis ich dazu gekommen bin es
auszuprobieren.
Im Grunde genommen ist es eigentlich ganz einfach. Man muss einfach über
ein Terminal via RS232 an den Net-IO den Textstring "ping 192.168.1.107"
senden (gefolgt von einem \CR). Lässt sich die IP anpingen kommt im
Terminal die Pong-Antwort.
@kbuchegg: danke für deinen Hinweis, der hat mich darauf gebracht.
Über ein bisschen rumprobieren und debuggen habe ich die Ping-Funktion
nun für meine Zwecke entfremden können :-)
Vielen Dank euch nochmal.