Benutzer-Werkzeuge

Webseiten-Werkzeuge


projekte:schlosssystem_2026

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige ÜberarbeitungVorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
projekte:schlosssystem_2026 [2026-08-21 18:26] – [Anleitungen] weneprojekte:schlosssystem_2026 [2026-09-18 22:13] (aktuell) – [MQTT] wene
Zeile 111: Zeile 111:
  
 ===== Spezifikationen ===== ===== 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 "Server". Er öffnet den Socket und nimmt Verbindungen von mehreren Authentifizierungsmodulen an. Die Authentifizierungsmodule sind entsprechend "Clients" und können sich wiederum zu (optional) mehreren Schlossaktuatoren verbinden.
 +
 +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.
 +
 +<code>
 +┌─────────────────────────┐                       ┌─────────────────┐
 +│ Authentifizierungsmodul │                       │ Schlossaktuator │
 +└┬────────────────────────┘                       └────────────────┬┘
 + │                                                  bind()         │ 
 + │                                                  listen()       │ 
 + │ connect()                                                       │ 
 + ├────────────────────────────────────────────────────────────────►│ 
 + │                                                  accept()       │ 
 + │                                                  send(state)    │ 
 + │◄────────────────────────────────────────────────────────────────┤ 
 + │ recv()                                                          │ 
 +                                                                     
 + │                  Aussenlicht wird eingeschaltet                 │ 
 +                                                    send(state)      
 + │◄────────────────────────────────────────────────────────────────┤ 
 + │ recv()                                                          │ 
 + │ Bereit, authentifizierungen entgegen zu nehmen                  │ 
 +                                                                     
 + │                Ein Benutzer löst ein Öffnen aus                 │ 
 +   send(command)                                                     
 + ├────────────────────────────────────────────────────────────────►│ 
 + │                                                  recv()         │ 
 + │                                                  Schloss öffnen │ 
 + │                                                  send(state)    │ 
 + │◄────────────────────────────────────────────────────────────────┤ 
 + │ recv()                                                          │ 
 + │                                                                 │ 
 +</code>
 +
 +Die Kommando- und Statusnachrichten sind ASCII Strings, die mit einem "line feed" (''\n'') enden.
 +
 +  * Bereitschaftszustand des Schlossaktuators - im Ruum42 ob Licht brennt, kann aber auch anders definiert werden: ''isReady:true'' / ''isReady:false''
 +  * Status des Schlosses: ''isOpen:true'' / ''isOpen:false''
 +  * Kommando zum öffnen und schliessen: ''command:open'' / ''command:close''
 +
  
  
Zeile 138: 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 /var/lib/systemd/timesync/clock sudo touch /var/lib/systemd/timesync/clock
 +
 +# 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
 +
 </code> </code>
 +
  
 ==== MQTT ==== ==== MQTT ====
Zeile 155: Zeile 206:
  
 # Kommando zum Öffnen an's Schloss schicken: # Kommando zum Öffnen an's Schloss schicken:
-mosquitto_pub -h wene-raspi-lock -t "main_lock/command/userName/userSecret" -m "open" -p 8883 --cafile path/to/ca.crt+mosquitto_pub -h wene-raspi-lock -t "command/main_lock/userName/userSecret" -m "open" -p 8883 --cafile path/to/ca.crt
  
 # Das Schloss schickt den Status "opened" zurück: # Das Schloss schickt den Status "opened" zurück:
-mosquitto_pub -h wene-raspi-lock -t "main_lock/status" -r -m "opened" -p 8883 --cafile ca.crt+mosquitto_pub -h wene-raspi-lock -t "status/main_lock" -r -m "opened" -p 8883 --cafile ca.crt
 # Das Flag '-r' steht für "retain" und bedeutet, dass dieser Wert auf dem Broker als Status gespeichert bleibt und neuen Clients bei Verbindung zugestellt wird. # Das Flag '-r' steht für "retain" und bedeutet, dass dieser Wert auf dem Broker als Status gespeichert bleibt und neuen Clients bei Verbindung zugestellt wird.
 </code> </code>
projekte/schlosssystem_2026.1787329616.txt.gz · Zuletzt geändert: von wene