Gateway für EnOcean-Funk

Mit dem Raspberry Pi in alle Richtungen

7. Dezember 2016, 11:12 Uhr | Ralf Higgelke
Diesen Artikel anhören

Fortsetzung des Artikels von Teil 2

Systemprogrammierung

Bild 7: Funktionsbereiche der Datenvermittlungskette.
Bild 7: Funktionsbereiche der Datenvermittlungskette.
© Dipl.-Ing. Klaus Dembowskidiesen Tag löschen

Die in C programmierte Software ist in Funktionsbereiche aufgeteilt − also modular −, sodass sich die erwähnte Vielzahl von unterschiedlichen Endgeräten ansteuern lässt. Hierfür ist lediglich der Vermittlungsteil unterschiedlich auszuführen. Die weiteren einzelnen Bereiche sind für das Empfangen der EnOcean-Funkpakete mithilfe von USB 300 oder EnOcean Pi und für die Verarbeitung der empfangenen Daten (interpretieren und verwalten) zuständig (Bild 7).

Das Gateway empfängt die Daten seriell und speichert sie in einem Byte-Array, woraufhin es die Telegramme für die einfachere Verarbeitung in eine Paketstruktur umsetzt, die alle Elemente eines ESP3-Pakets enthält. Diese Pakete speichert das Gateway in einer »Sensorknotenliste«, die alle bereits erkannten Geräte enthält. Wenn ein Paket eintrifft, überprüft das Gateway, ob die Absender-ID bekannt ist. Ist dies der Fall, aktualisiert es lediglich das letzte Paket und den Zeitstempel. Sollte die Absender-ID nicht bekannt sein, legt das Gateway hierfür einen neuen Sensorknoten in der Liste an. Um das Paket über die Socket-Verbindung zu vermitteln, muss es wieder in ein Telegramm konvertiert werden.

Als Beispiel sei im Folgenden die Vermittlung an Android-Geräte über WLAN gezeigt. Die Verbindung übernehmen Sockets, die von einer IP-Adresse, einem Port (3034) und einem Transportprotokoll (TCP) definiert werden. Die Funktion zur Initialisierung eines Socket ist »Server_init()«. Der Rückgabewert ist ein Socket-Deskriptor, der wie eine Datei gelesen und beschrieben werden kann. Mit dem Systemaufruf »socket()« wird vom Betriebssystem ein Socket angefordert. Dieser verwendet die Protokolle IPv4 und TCP.

sockfd = socket( AF_INET , SOCK_STREAM , 0 );

Die Serveradresse und die Port-Nummer werden eingestellt:

serv_addr.sin_family = AF_INET; // IPv4
serv_addr.sin_addr.s_addr = INADDR_ANY; // Jede IP-Adresse wird akzeptiert
serv_addr.sin_port = htons( 3034 ); // Port-Nummer 3034

Die Socket-Einstellungen werden mit »bind()« an den Socket gebunden:

bind( sockfd , (struct sockaddr*) &serv_addr ,
sizeof(serv_addr) );

Nach der Einstellung wird der Server Socket durch »listen()« dazu veranlasst, auf Verbindungen zu hören:

listen( sockfd , 1 );

Mit »accept()« wird auf eine Verbindung mit einem Client gewartet. Dieser Systemaufruf blockiert das Programm so lange, bis eine Verbindung akzeptiert wurde, und gibt dann einen Socket-Deskriptor zurück, der diese Verbindung repräsentiert.

newsockfd = accept( sockfd , (struct sockaddr*) &cli_addr,&clilen ) );

Verbindet sich ein Client mit dem Socket, wird auf eine Nachricht von ihm gewartet. Nach Empfang wird eine Bestätigungsnachricht an den Client zurückgeschickt. Der neue Socket-Deskriptor, der bei einer Verbindung mit einem Client von der Funktion »accept()« zurückgegeben wird, kann jetzt zum Empfangen und Senden von Daten über die Socket-Verbindung verwendet werden.

Nach erfolgreicher Initialisierung der Socket-Verbindung wird ein Socket-Deskriptor bereitgestellt, mit dem Daten des verbundenen Clients gesendet und empfangen werden können. Anhand der Funktion »Server_send()« wird ein Telegramm oder eine Nachricht über die Socket-Verbindung gesendet:

void Server_send( int socketfd , byte* message , int length );

Im Folgenden werden die Funktionsparameter an die Funktion »write()« übergeben.

write( socketfd , message , length );

passend zum Thema

Bild 8: »Activity« zur Geräteauswahl.
Bild 8: »Activity« zur Geräteauswahl.
© Dipl.-Ing. Klaus Dembowski

Der Funktionsparameter »socketfd« ist der Socket-Deskriptor, »message« ist der Zeiger auf das erste Element eines Byte-Arrays und »length« ist die Länge des Arrays. Bei der Vermittlung eines Telegramms wird die folgende Funktion aufgerufen:

Server_send( socketfd , telegram ,
Telegram_getTelegramLength( telegram ) );

Bei der Vermittlung werden die Telegramme so gesendet, wie das Empfangsmodul sie empfangen hat. Es geht keine Information verloren und es wird keine Redundanz hinzugefügt.

Eine Android-Applikation soll die Daten visualisieren, die das Gateway übermittelt. Dafür muss sich die App mit dem Gateway verbinden und mit diesem kommunizieren können. Für ausgewählte EnOcean-Geräte, wie für die Funkschaltmodule PTM 210 und PTM 330 sowie den Temperatursensor STM 330, die allesamt im EnOcean-Starterkit ESK 300 enthalten sind, wurde eine Visualisierung der Daten implementiert (Bild 8).

Android-Gerät ankoppeln

Bild 10: Darstellung der Telegramme und Auswertung eines Rocker Switch (PTM 330) sowie eines Temperatursensors.
Bild 10: Darstellung der Telegramme und Auswertung eines Rocker Switch (PTM 330) sowie eines Temperatursensors.
© Dipl.-Ing. Klaus Dembowski
Bild 9: »Activity« stellt die Wi-Fi-Verbindung zum Gateway her.
Bild 9: »Activity« stellt die Wi-Fi-Verbindung zum Gateway her.
© Dipl.-Ing. Klaus Dembowski

Die Verbindung des Android-Geräts mit dem Gateway wird mithilfe der »Activity«-Wi-Fi-Verbindung hergestellt (Bild 9). Dabei wird eine TCP/IP Socket-Verbindung zum Gateway-Socket etabliert, wofür die IP-Adresse des Gateway und der Port des Gateway-Socket nötig ist. Die Port-Nummer des Gateway-Socket wurde auf 3034 festgelegt und die IP-Adresse des Gateway ist hier 192.168.2.1.

Nach erfolgreicher Verbindung lassen sich die Datentelegramme der detektierten EnOcean-Geräte sowie deren jeweiliger Status bzw. Wert (z. B. Schalterstellung, Sensorwert) darstellen (Bild 10). Außerdem sind eigene Geräte mit EnOcean-Funk einfach implementierbar, sodass sich im Grunde genommen die Daten aller möglichen EnOcean-Geräte auf einem Android-Gerät darstellen lassen.


  1. Mit dem Raspberry Pi in alle Richtungen
  2. Telegramme und Pakete analysieren
  3. Systemprogrammierung

Lesen Sie mehr zum Thema


Das könnte Sie auch interessieren

Jetzt kostenfreie Newsletter bestellen!