Multicast - basierte Kommunikation mit dem ARDUINO (Session 1)
*C.Paulsen 2026-07-06
Im Rahmen meiner ISOagriNET-basierten Entwicklungsarbeiten eines Smart-Home-Netzwerks mit Hilfe von embeddeed Devices wie den Arduino, den Raspberry PI, SNAP, ODROID, Beagebox Black und Pandaboard ist es wichtig sich mit UDP basierter Multicast-Kommunikation zu beschäftigen.

Leider beginnt dies gleich mit einigen Hürden. Alte Multicast-Bibliotheken funktionen nicht mehr mit der aktuellen Entwicklungsumgebung und die ETHERNET-Bibliothek inkludiert kein MultiCast. Nach einigen Rechergen habe ich dann aber einige Patches gefunden, die helfen, die ETHERNET-Library zu erweitern.
Änderungen an der ETHERNET-Library in der ARDUINO-IDE unter LINUX
Diese Änderungen stammen von einem Patch:
[Patchlink](https://github.com/arduino/Arduino/pull/1531/commits/3811729f82ef05f3ae43341022e7b65a92d333a2 "EthernetLib gepatcht für MCC")
Um die Ethernet-Library unter Linux zu finden, suchst Du, zunächst mal, das Verzeichnis, in dem die Arduino-IDE abgelegt ist:
sudo find /usr -name "arduino*" -print
Auf meinem Rechner findet sich die entsprechende ETHERNET-Bibliothek dann unter
/usr/share/arduino/libraries/Ethernet/
Sichere das Verzeichnis vorab mit einem sudo tar cvfz ethernet.tgz Ethernet, um im Fehlerfall das Verzeichnis wieder herstellen zu können. In die beiden Daten EthernetUdp.cpp und EthernetUdp.h trägst Du dann einfach die fehlenden Zeilen ein. Anschließend die Arduino-IDE frisch starten.
Die Schaltung
Hier die einfache Schaltung

Das Arduino-Programm
Das Arduino-Programm liest die Sensordaten aus und sendet sie sowohl über die serielle Schnittstelle (USB) wie über MCC (Multicast) an die angegebene Multicvast-Adresse. Dort können dann andere Programme daraus horchen. In einem weiteren Schritt werde ich eine kleine Arduino-ISOagriNET-Bibliotek entwickeln, so daß die Daten ISOagriNET kompatibel angeboten werden.
#include
// needed for Arduino versions later than 0018 #include
#include
// UDP library from: [email protected] 12/30/2008 byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);
IPAddress mip(239, 100, 100, 100);
unsigned int localPort = 9999; // local port to listen on
char packetBuffer[50]; //buffer to hold incoming packet,
char hiBuffer[] = "0:Client ready"; // a string to send back
String inputString = ""; // a string to hold incoming data
boolean stringComplete = false;
int c = 0;
EthernetUDP Udp;
int DHpin = 5;
byte dat [5];
void setup() {
// start the Ethernet and UDP:
Ethernet.begin(mac, ip);
Udp.beginMulti(mip, localPort);
Serial.begin(9600);
pinMode (DHpin, OUTPUT);
}
void loop() {
// if there's data available, read a packet
start_test ();
Serial.print ("Current humdity =");
Serial.print (dat [0], DEC); // display the humidity-bit integer;
Serial.print ('.');
Serial.print (dat [1], DEC); // display the humidity decimal places;
Serial.println ('%');
Serial.print ("Current temperature =");
Serial.print (dat [2], DEC); // display the temperature of integer bits;
Serial.print ('.');
Serial.print (dat [3], DEC); // display the temperature of decimal places;
Serial.println ('C');
delay (1000);
String tmpstr ="Aktuelle Luftfeuchtigkeit =" + String(dat[0], DEC)+"."+ String(dat[1], DEC)+"%";
sendUDP(tmpstr+"\n");
tmpstr ="Aktuelle Temperatur =" + String(dat[2], DEC)+"."+ String(dat[3], DEC)+" C";
sendUDP(tmpstr+"\n");
tmpstr="";
}
byte read_data () {
byte data;
for (int i = 0; i <8; i ++) {
if (digitalRead (DHpin) == LOW) { while (digitalRead (DHpin) == LOW); // wait for 50us delayMicroseconds (30); // determine the duration of the high level to determine the data is '0 'or '1' if (digitalRead (DHpin) == HIGH) data |= (1 <<(7-i)); // high front and low in the post while (digitalRead (DHpin) == HIGH); // data '1 ', wait for the next one receiver }}
return data;
}
void start_test () {
digitalWrite (DHpin, LOW); // bus down, send start signal>
delay (30); // delay greater than 18ms, so DHT11 start signal can be detected
digitalWrite (DHpin, HIGH);
delayMicroseconds (40); // Wait for DHT11 response
pinMode (DHpin, INPUT);
while (digitalRead (DHpin) == HIGH);
delayMicroseconds (80); // DHT11 response, pulled the bus 80us
if (digitalRead (DHpin) == LOW);
delayMicroseconds (80); // DHT11 80us after the bus pulled to start sending data
for (int i = 0; i <4; i ++) // receive temperature and humidity data, the parity bit is not considered
dat[i] = read_data ();pinMode (DHpin, OUTPUT);
digitalWrite (DHpin, HIGH); // send data once after releasing the bus, wait for the host to open the next Start > signal
}
void sendUDP(String text)
{
Udp.beginPacket(mip, Udp.remotePort()); Udp.print(text); Udp.endPacket(); delay(30);}
Mit Udp.beginMulti(mip, localPort); wird die lokale IP mit der MultiCast-IP (mip) verbunden. Über die Methode start_test werden die Daten des Sensors ausgelesen und über sendUdp werden die Daten zur Multicast-IP geschickt. Dort horcht dann ein Groovyprogramm.
Der Listener - ein Groovy-Programm
Der Listener horcht auf die Multicast-Adress und liest die Daten des Arduino aus. Dazu habe ich einjen Listener, den ich einm,al für meine TINI und SNAP-embedded Devices ADIS/ADED konform entwickelt habe, entsprechend verschlankt.
package de.struxt.ian.mcc.listen
class MCCSmallListener {
byte[] buffer = new byte[1024]; DatagramPacket datagram = new DatagramPacket(buffer,buffer.length); MulticastSocket socket; int port = 9999; // Constructor public MCCSmallListener() { try { // Socket auf Port 6789 starten socket = new MulticastSocket(port); System.out.println("*** MulticastMCCListener: Socket created"); // Anmelden bei einer Multicast-Gruppe InetAddress group = InetAddress.getByName("239.100.100.100"); socket.joinGroup(group); }catch (IOException ex) { } } public String listen(){ try{ socket.receive(datagram); // prototyping noch mangelhaft String msg = new String(datagram.getData()); return msg; } catch (IOException ex) {ex.printStackTrace(); } return "ERROR"; } static void main(args) { MCCSmallListener ls = new MCCSmallListener(); while (true){ def msg = ls.listen(); println(msg); } }}
Der Sensor
Der verwendete Sensor stammt aus dem 40 in 1 Sensorkit 4duino(Temp and humidity). Die Schaltung ist sehr einfach, da hier weder Widerstände noch sonst was benötigt werden. Die Anschlüsse sind nach dem SVG-Prinzip herausgeführt, so daß die Steuerung mit dem digitalen Eingang 5, die Spannung aus dem V-Volt-Pin und Ground mit Ground verbunden wird.
