vorige Seite
Inhaltsverzeichnis nächste Seite

Überlegungen zur Kommunikation mit der Rollladensteuerung

Auf einem Linux-System gw (im VLAN42) lauscht 24x7 ein Python-Script auf einem Port und wartet auf Anfragen von der Rollladensteuerung.
Das Script erhält seine Zeiten-Tabelle aus einer Datei. Diese Datei kann per Editor oder über ein weiteres Python-Script mit wxWidgets-GUI geändert werden.
Daraus abgeleiteter Ansatz:
Bei dieser Vorgehensweise wird der Schalter für den Programmier-Modus nicht mehr benötigt.
Änderungen können jederzeit vorgenommen, ab der nächsten Kontakt-Aufnahme von Seiten Rollladensteuerung sind sie dann aktiv.

Irgend eine Art Authentifizierung oder Crypto muss wegen des offenen WLANs noch rauf...
Z.B.: Python-Script und Arduino-Code kennen ein gemeinsames Passwort.
Das Python-Script schickt dem ATmega328 Datum und Uhrzeit als Klartext-String.
Danach dann den MD5-Hash (https://github.com/tzikis/ArduinoMD5/) von Datum+Uhrzeit+Passwort.
Also etwa für "2015-10-14 20:40:22" und "Passw0rt" auf Python-Seite:
    >>> import hashlib
    >>> hashlib.md5("2015-10-14 20:40:22 Passw0rt").hexdigest()
    'f9dbca6a27bbab49dbb398b406872cb7'
Und auf ATmega328-Seite:
    #include <MD5.h>
    [...]
    unsigned char* hash=MD5::make_hash("2015-10-14 20:40:22 Passw0rt");
    char *md5str = MD5::make_digest(hash, 16);
    Serial.println(md5str);

liefert im Terminal-Fenster: f9dbca6a27bbab49dbb398b406872cb7

Wobei Datum+Uhrzeit eigentlich keine ganz so gute Idee ist.
Wenn zu festen Zeiten kommuniziert wird, sind es immer wieder die selben Zeiten. Und damit die selben Hashes.
Eine hinreichend große Zufallszahl wäre weniger vorhersagbar.
Ablauf ATmega328 Ablauf Python-Script @ gw

Verbindung zu gw+port# herstellen
Zufallszahl empfangen
MD5 aus Zufallszahl + PasswortP bilden
MD5 senden


Zufallszahl generieren
MD5 aus Zufallszahl + PasswortA bilden
MD5 empfangen
wenn sie nicht zur eigenen MD5 passt
    Verbindung schließen
Uhrzeit senden

Uhrzeit empfangen
Uhrzeit in RTC einstellen
Zeiten-Liste senden

Zeiten-Liste empfangen
Verbindung schließen
Socket öffnen und auf Connects warten
bei Connect
    Zufallszahl generieren und senden
    MD5 aus Zufallszahl + PasswortP bilden
    MD5 empfangen
    wenn sie nicht zur eigenen MD5 passt
        Verbindung schließen
    Zufallszahl empfangen
    MD5 aus Zufallszahl + PasswortA bilden
    MD5 senden


    Uhrzeit empfangen
    Uhrzeit zur Info speichern
    Uhrzeit senden

    Zeiten-Liste empfangen
    Zeiten-Liste zur Info speichern
    ggf. geänderte Zeiten-Liste senden
    Verbindung schließen
Zusätzlich sollte jede Seite sein eigenes Passwort haben, aber das des Anderen natürlich auch kennen.
Bei nur einem Passwort für beide Richtungen könnte sonst theoretisch jemand dadurch Schabernack treiben, dass er so Man-In-The-Middle-mäßig das Python-Script nach dem Hash befragt, für den er selber gerade vom ATmega328 befragt wurde.

vorige Seite
nächste Seite