projekte:schlosssystem_2026
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige ÜberarbeitungVorherige ÜberarbeitungNächste Überarbeitung | Vorherige Überarbeitung | ||
| projekte:schlosssystem_2026 [2026-03-20 18:48] – [User Storys] wene | projekte:schlosssystem_2026 [2026-09-18 22:13] (aktuell) – [MQTT] wene | ||
|---|---|---|---|
| Zeile 62: | Zeile 62: | ||
| === Module und Schnittstellen === | === Module und Schnittstellen === | ||
| - | {{ :projekte:schlosssystem_module_und_schnittstellen_v2.png |}} | + | {{: |
| Grafik erstellt mit [[https:// | Grafik erstellt mit [[https:// | ||
| Zeile 108: | Zeile 107: | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| + | |||
| + | |||
| + | |||
| + | ===== Spezifikationen ===== | ||
| + | |||
| + | ==== Protokoll zwischen Schlossaktuator und Authentifizierungsmodul ==== | ||
| + | |||
| + | Vorerst verwenden wir unix domain sockets. Dies ist die beste Lösung, solange sich beide Komponenten auf dem gleichen System befinden. Sobald die Anforderung aufkommt, Schlossaktuatoren über Netzwerk anbinden zu können, sollte die Umstellung auf TCP über TLS verhältnismässig einfach sein. | ||
| + | |||
| + | Der Schlossaktuator ist in diesem System der " | ||
| + | |||
| + | Sobald die Verbindung aufgebaut ist, sendet der Schlossaktuator den aktuellen Zustand zum Authentifizierungsmodul. Danach hören beide Teilnehmer passiv auf den Socket und beide können bei einem entsprechenden Ereignis die Kommunikation anfangen. Wenn beispielsweise sich der Status des Schlossaktuators ändert, teilt dieser den neuen Status unmittelbar allen verbundenen Authentifizierungsmdule mit. Wenn wiederum ein Benutzer sich bei einem Authentifizierungsmodul erfolgreich authentifiziert hat, schickt das Authentifizierungsmodul das Kommando zum öffnen des Schlosses an den entsprechenden Schlossaktuator. | ||
| + | |||
| + | < | ||
| + | ┌─────────────────────────┐ | ||
| + | │ Authentifizierungsmodul │ │ Schlossaktuator │ | ||
| + | └┬────────────────────────┘ | ||
| + | | ||
| + | | ||
| + | │ connect() | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | │ recv() | ||
| + | |||
| + | | ||
| + | send(state) | ||
| + | | ||
| + | │ recv() | ||
| + | │ Bereit, authentifizierungen entgegen zu nehmen | ||
| + | |||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | │ recv() | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Die Kommando- und Statusnachrichten sind ASCII Strings, die mit einem "line feed" ('' | ||
| + | |||
| + | * Bereitschaftszustand des Schlossaktuators - im Ruum42 ob Licht brennt, kann aber auch anders definiert werden: '' | ||
| + | * Status des Schlosses: '' | ||
| + | * Kommando zum öffnen und schliessen: '' | ||
| Zeile 136: | Zeile 183: | ||
| # Den RasPi Timestamp anpassen für den Fall, dass es ohne Verbindung zum NTP Server startet | # Den RasPi Timestamp anpassen für den Fall, dass es ohne Verbindung zum NTP Server startet | ||
| sudo touch / | sudo touch / | ||
| + | |||
| + | # Existierendes Zertifikat erneuern | ||
| + | openssl x509 -x509toreq -in server.crt -out server.csr -signkey server.key | ||
| + | openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -out server.crt -days 30 | ||
| + | |||
| </ | </ | ||
| + | |||
| ==== MQTT ==== | ==== MQTT ==== | ||
| Zeile 153: | Zeile 206: | ||
| # Kommando zum Öffnen an's Schloss schicken: | # Kommando zum Öffnen an's Schloss schicken: | ||
| - | mosquitto_pub -h wene-raspi-lock -t "main-door/lock" -m " | + | mosquitto_pub -h wene-raspi-lock -t "command/main_lock/ |
| # Das Schloss schickt den Status " | # Das Schloss schickt den Status " | ||
| - | mosquitto_pub -h wene-raspi-lock -t "main-door/status" | + | mosquitto_pub -h wene-raspi-lock -t " |
| # Das Flag ' | # Das Flag ' | ||
| </ | </ | ||
| Zeile 174: | Zeile 227: | ||
| <file - tls.conf> | <file - tls.conf> | ||
| listener 8883 | listener 8883 | ||
| - | allow_anonymous true | ||
| cafile / | cafile / | ||
| certfile / | certfile / | ||
| keyfile / | keyfile / | ||
| + | </ | ||
| + | |||
| + | <file - password.conf> | ||
| + | password_file / | ||
| + | allow_anonymous false | ||
| + | </ | ||
| + | |||
| + | <file - acl.conf> | ||
| + | acl_file / | ||
| </ | </ | ||
| Die Datei '' | Die Datei '' | ||
| + | |||
| + | Die Datei '' | ||
| + | |||
| + | <code bash> | ||
| + | # Passwortdatei anlegen mit dem ersten Benutzer namens " | ||
| + | sudo mosquitto_passwd -c -b / | ||
| + | |||
| + | # Den Eigentümer der Passwortdatei festlegen | ||
| + | sudo chown mosquitto: | ||
| + | |||
| + | # Weitere Einträge zur existierenden Datei hinzufügen | ||
| + | sudo mosquitto_passwd -b / | ||
| + | # Es wird eine Warnung angezeigt, dass die Datei nicht root gehört. Diese kann | ||
| + | # ignoriert werden, da der mosquitto Service nicht als root ausgeführt wird. | ||
| + | # Um die Warnung zu vermeiden erst alle Passwörter eintragen, dann den Besitzer ändern. | ||
| + | </ | ||
| + | |||
| + | Über die Datei ''/ | ||
| + | |||
| + | <file - acl> | ||
| + | user system | ||
| + | topic read main_lock/ | ||
| + | topic write main_lock/ | ||
| + | |||
| + | user towel_key | ||
| + | topic write main_lock/ | ||
| + | topic read main_lock/ | ||
| + | </ | ||
| === Python Library Paho === | === Python Library Paho === | ||
projekte/schlosssystem_2026.1774028885.txt.gz · Zuletzt geändert: von wene