Guten Tag zusammen,
irgendwie habe ich immer nur Probleme mit Ethernet Themen ![]()
Da der Ethernet Chip ENC28J60 zwar schwach auf der Brust ist aber dafür klein und billig ist wollte ich ihn als alternative für den W5100 einsetzen.
Da ich mein eigenes Protokoll auf UDP Basis entwickelt habe, wird auch nicht viel Leistung benötigt.
Die einzige Library die ich gefunden habe, die verlässlich funktioniert, nennt sich "ethercard" (GitHub - njh/EtherCard: EtherCard is an IPv4 driver for the ENC28J60 chip, compatible with Arduino IDE). Das Beispiel zum UDP Server funktioniert auch einwandfrei nur habe ich am Anfang kein Anzeichen gefunden UDP Pakete zu senden.
Also nicht lange nach was neuem suche und versuchen selber zu machen. Habe mir dann mal die "EtherCard.h" ein wenig genauer angeschaut und gesehen, dass es schon eine Funktion "sendUdp" gibt:
/** @brief Sends a UDP packet
* @param data Pointer to data
* @param len Size of payload (maximum 220 octets / bytes)
* @param sport Source port
* @param dip Pointer to 4 byte destination IP address
* @param dport Destination port
*/
static void sendUdp (const char *data, uint8_t len, uint16_t sport,
const uint8_t *dip, uint16_t dport);
Gut mal schnell das Server Beispiel angepasst, einen Server auf meinem Rechner gestartet und gehofft das es funktioniert:
#include <EtherCard.h>
#include <IPAddress.h>
#define STATIC 1 // set to 1 to disable DHCP (adjust myip/gwip values below)
#if STATIC
// ethernet interface ip address
static byte myip[] = { 192,168,178,200 };
static byte hostip[] = { 192,168,178,26 };
// gateway ip address
static byte gwip[] = { 192,168,0,1 };
#endif
// ethernet mac address - must be unique on your network
static byte mymac[] = { 0x70,0x69,0x69,0x2D,0x30,0x31 };
byte Ethernet::buffer[500]; // tcp/ip send and receive buffer
//callback that prints received packets to the serial port
void udpSerialPrint(word port, byte ip[4], const char *data, word len) {
IPAddress src(ip[0], ip[1], ip[2], ip[3]);
Serial.println(src);
Serial.println(port);
Serial.println(data);
Serial.println(len);
}
void setup(){
Serial.begin(57600);
Serial.println(F("\n[backSoon]"));
if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
Serial.println(F("Failed to access Ethernet controller"));
#if STATIC
ether.staticSetup(myip, gwip);
#else
if (!ether.dhcpSetup())
Serial.println(F("DHCP failed"));
#endif
ether.printIp("IP: ", ether.myip);
ether.printIp("GW: ", ether.gwip);
ether.printIp("DNS: ", ether.dnsip);
//register udpSerialPrint() to port 1337
ether.udpServerListenOnPort(&udpSerialPrint, 1337);
//register udpSerialPrint() to port 42.
ether.udpServerListenOnPort(&udpSerialPrint, 42);
}
void loop(){
//this must be called for ethercard functions to work.
//ether.packetLoop(ether.packetReceive());
ether.sendUdp("HelloWorld", 10, 26, hostip, 8888);
}
Die Enttäuschung war groß. Es kam nichts an. Nun ja Wireshark aufgemacht und mal ein wenig rumgesucht.
Siehe da jedes Packet kommt mit richter SourceIP, DestinationIP, Source Port, Destination Port, Data Length und der Payload. Habe mal ein Screenshot abgehangen wo man alles sieht.
Der UDP Server funktioniert mit anderen Clients und er ist auch im netstat registriert.
Habt ihr eine Idee wo die Pakete abbleiben?

