einen Webserver konnte ich ganz einfach erstellen. Doch jetzt möchte ich dem Clienten seine IP-Adresse anzeigen. Dazu muss ich die erstmal kennen.
[Update] Übrigens benutze ich UIPEthernet für den enc28j60; für das Shield habe ich gefunden, dass es mit "W5100.readSnDIPR(_sock, remoteIP);" geht. Doch wie geht das für den enc28j60?
[Update2] GELÖST (siehe next post). Ehemalige Überschrift "Webserver: Der Client soll seine IP-Adresse angezeigt bekommen: UDP.remoteIP() ?"
Doch leider sagt mir UDP nicht so viel, außer dass es ein Protokoll ist, mit dem Daten im Internet übetragen werden können.
Als Webserver habe ich erstmal den Beispielscode von 'Examples' -> 'Ethernet' -> 'WebServer' genommen, damit dort sich keine Fehler einschleichen. Und das funktioniert auch prima.
Doch wenn ich einfach den Code mit
int packetSize = Udp.parsePacket();
und so weiter in den Loop einfüge, hat die Abfrage "if(packetSize)..." nie true ausgeben (also das was danach kommt wurde nie ausgeführt), obwohl der Webserver funktioniert?!
Leider gibt "UDP.begin()" ja kein Ergebnis (´laut der Dokumentation: Arduino - EthernetUDPBegin) , daher weiß ich gar nicht wo der Fehler liegt...
Kann mir jemand helfen, die IP-Adresse des Clients herauszufinden, wenn er auf den Webserver zugreift (also wenn bei "server.available()" was herauskommt)?
Da in der cpp in Zeile 149 wird die Funktion folgendermaßen definiert:
IPAddress
UIPClient::remoteIP() {
if (!_uip_conn) return IPAddress();
return ip_addr_uip(_uip_conn->ripaddr);
}
Dabei ist die "_uip_conn" ein privates 'struct', das offensichtlich die IP-Adresse gespeichert hält (scheint in der uip-Datei im utility-Ordner beschrieben zu werden...).
Auf jeden Fall klappt es
Code:
// Webserver: Der Client soll seine IP-Adresse angezeigt bekommen - Arduino Forum
// http://forum.arduino.cc/index.php?topic=251783.0
// 27.6.2014
#define UIPETHERNET_DEBUG 1 // doesnt show up any debug
#include <SPI.h>
#include <UIPEthernet.h>
// Ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 2, 177);
// Server
EthernetServer server(1000); //port: 1000
void setup()
{
Serial.begin(9600);
Serial.println("Go");
// start the Ethernet and Server:
Ethernet.begin(mac, ip);
Serial.println("init ok");
Serial.print("My IP address: ");
Serial.println(Ethernet.localIP());
Serial.println();
server.begin();
Serial.println("Server ready\n\n");
}
void loop()
{
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println("> Connection from: ");
Serial.print(client.remoteIP());
Serial.print(":");
Serial.println(client.remotePort());
while (client.connected())
{
if (client.available())
{
char c = client.read();
// Serial.print(">> ");
Serial.write(c);
}
}
delay(1);
// close the connection:
client.stop();
Serial.println("\n> Disonnected.\n");
}
}
Serial-Monitor-Ausgabe:
Go
init ok
My IP address: 192.168.2.177
Server ready
> Connection from:
192.168.2.123:53225
123456789abcdef000xyzÿ
> Disonnected.
Windows-Befehl:
cmd /C telnet 192.168.2.177 1000
(mit STRG und Plus-Zeichen kommt man wieder ins telnet-menü (interactive mode), dann dort 'close' oder sogar 'quit' eingeben)