# Komunikation zwischen Zwei Arduinos per LAN Die erste Aufgabe war es, vom DHCP Server der Schule eine IP Adresse für den Arduino zu bekommen. Die zweite Aufgabe war es, zwei Arduinos mit hilfe von dem UDP Protokoll Daten aus tauschen zu lassen. ## Code für die DHCP Abfrage (Aufgabe 1) #include <EtherCard.h> #define REQUEST_RATE 5000 // milliseconds // ethernet interface mac address static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; // remote website name const char website[] PROGMEM = "google.com"; byte Ethernet::buffer[700]; static long timer; // called when the client request is complete static void my_result_cb (byte status, word off, word len) { Serial.print("<<< reply "); Serial.print(millis() - timer); Serial.println(" ms"); Serial.println((const char*) Ethernet::buffer + off); } void setup () { Serial.begin(57600); Serial.println("\n[getDHCPandDNS]"); // Change 'SS' to your Slave Select pin, if you arn't using the default pin if (ether.begin(sizeof Ethernet::buffer, mymac, SS) == 0) Serial.println( "Failed to access Ethernet controller"); if (!ether.dhcpSetup()) Serial.println("DHCP failed"); ether.printIp("My IP: ", ether.myip); // ether.printIp("Netmask: ", ether.mymask); ether.printIp("GW IP: ", ether.gwip); ether.printIp("DNS IP: ", ether.dnsip); if (!ether.dnsLookup(website)) Serial.println("DNS failed"); ether.printIp("Server: ", ether.hisip); timer = - REQUEST_RATE; // start timing out right away } void loop () { ether.packetLoop(ether.packetReceive()); if (millis() > timer + REQUEST_RATE) { timer = millis(); Serial.println("\n>>> REQ"); ether.browseUrl(PSTR("/foo/"), "bar", website, my_result_cb); } } ## Code für SendOnly (Aufgabe 2) // This demo does web requests via DHCP and DNS lookup. // 2011-07-05 <jc@wippler.nl> // // License: GPLv2 #include <EtherCard.h> #define REQUEST_RATE 5000 // milliseconds // ethernet interface mac address static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; // remote website name const char website[] PROGMEM = "google.com"; byte Ethernet::buffer[700]; static long timer; // called when the client request is complete static void my_result_cb (byte status, word off, word len) { Serial.print("<<< reply "); Serial.print(millis() - timer); Serial.println(" ms"); Serial.println((const char*) Ethernet::buffer + off); } void setup () { Serial.begin(57600); Serial.println("\n[getDHCPandDNS]"); // Change 'SS' to your Slave Select pin, if you arn't using the default pin if (ether.begin(sizeof Ethernet::buffer, mymac, SS) == 0) Serial.println( "Failed to access Ethernet controller"); if (!ether.dhcpSetup()) Serial.println("DHCP failed"); ether.printIp("My IP: ", ether.myip); // ether.printIp("Netmask: ", ether.mymask); ether.printIp("GW IP: ", ether.gwip); ether.printIp("DNS IP: ", ether.dnsip); if (!ether.dnsLookup(website)) Serial.println("DNS failed"); ether.printIp("Server: ", ether.hisip); timer = - REQUEST_RATE; // start timing out right away } void loop () { ether.packetLoop(ether.packetReceive()); if (millis() > timer + REQUEST_RATE) { timer = millis(); Serial.println("\n>>> REQ"); ether.browseUrl(PSTR("/foo/"), "bar", website, my_result_cb); } } ## Code für Receiver #include <EtherCard.h> #include <IPAddress.h> #define STATIC 0 // set to 1 to disable DHCP (adjust myip/gwip values below) #if STATIC // ethernet interface ip address static byte myip[] = { 192,168,0,200 }; // 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(uint16_t dest_port, uint8_t src_ip[IP_LEN], uint16_t src_port, const char *data, uint16_t len){ IPAddress src(src_ip[0],src_ip[1],src_ip[2],src_ip[3]); Serial.print("dest_port: "); Serial.println(dest_port); Serial.print("src_port: "); Serial.println(src_port); Serial.print("src_port: "); ether.printIp(src_ip); Serial.println("data: "); Serial.println(data); } void setup(){ Serial.begin(57600); Serial.println(F("\n[backSoon]")); // Change 'SS' to your Slave Select pin, if you arn't using the default pin if (ether.begin(sizeof Ethernet::buffer, mymac, SS) == 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()); } /* //Processing sketch to send test UDP packets. import hypermedia.net.*; UDP udp; // define the UDP object void setup() { udp = new UDP( this, 6000 ); // create a new datagram connection on port 6000 //udp.log( true ); // <-- printout the connection activity udp.listen( true ); // and wait for incoming message } void draw() { } void keyPressed() { String ip = "192.168.0.200"; // the remote IP address int port = 1337; // the destination port udp.send("Greetings via UDP!", ip, port ); // the message to send } void receive( byte[] data ) { // <-- default handler //void receive( byte[] data, String ip, int port ) { // <-- extended handler for(int i=0; i < data.length; i++) print(char(data[i])); println(); } */ ## Weitere Schritte Informationen: - Welche Daten werden benötigt? - Wie sollen diese Daten generiert werden? - Was soll mit den gesendeten Daten geschehen? - Welches Gerät soll die Daten verarbeiten? - Was ist das Ziel? -> Sobald die Fragen beantwortet sind, muss dafür ein Code geschrieben werden. ## Bilder ![](https://i.imgur.com/yUsoyds.jpg) ![](https://i.imgur.com/RF2NLg5.jpg) ![](https://i.imgur.com/vrKnVv3.jpg) ### Quellen: https://www.aelius.com/njh/ethercard/udp_client_send_only_8ino-example.html https://www.arduino.cc/en/Tutorial/LibraryExamples/UDPSendReceiveString https://www.arduino.cc/en/Reference/Ethernet