Ich habe da mal ein Problem
Vorab: Bitte keine Diskussionen um die Sicherheit, mein Statement dazu
am Ende.
Ich habe eine kleine Schaltung zur Türöffnung über Handy, die ich schon
seit mehreren Jahren erfolgreich betreibe. Die Funktionsweise ist
folgende:
- Das Hand geht per HTTPS auf eine von außen erreichbare Webseite.
- Die Authentifizierung Handy/Webserver erfolgt gegenseitig mit
Client-Zertifikaten einer selbst betriebenen CA.
- Diese Webseite schickt HTML-Daten, die den Status des Türschlosses
(Verriegelt/Entriegelt) sowie der Tür selber (geöffnet/geschlossen)
anzeigen.
- Durch einen form-Button kann das Handy den Befehl zum Entriegeln an
den Webserver senden.
- Bis hier ist alles Prima uns soll auch so bleiben, doch was jetzt
kommt möchte ich gerne ersetzen.
Alt: Die Web-App bekommt den Status vom Arduino, indem diese einen
http-get auf den Arduino http://192.168.1.47/status macht. Soll die Tür
entriegelt werden sendet sie einen http-get auf
http://192.168.1.47/open600 das bedeutet: "Entriegel das Schloss für 10
Minuten" Die Web-App realisiere ich derzeit in PHP mit fsockopen, fwrite
und fgets.
Jetzt möchte ich aber MQTT einsetzen. Den Arduino habe ich schon fertig,
ich kann den Status über das Topic "/door/status" abfragen und Befehle
per "/door/cmd" senden, welche über "/door/ack" bestätigt werden. Die
Web-App muss, wenn ich die Seite abrufe "/door/status" subscriben (den
letzten Publish hat ja der MQTT Broker im Cache, der kommt dann ja
sofort) dann kann die Web-App dem mobilen Gerät den aktuellen Status
senden.
Wenn ich den Button drücke muss die Web-App auf "/door/cmd" publishen
und die Response über das Topic "/door/ack" holen. Sobald das Türschloss
entriegelt ist, wird der Arduino im Sekundentakt das Topic
"/door/status" senden, denn dieser wird immer gesendet wenn er sich
ändert und die Dauer ist Teil des Status:
1 | /door/status unlocked,600,closed
|
2 | /door/status unlocked,599,closed
|
3 | /door/status unlocked,598,open
|
4 | /door/status locked, ,open
|
5 | /door/status locked, ,closed
|
Warum mache ich das eigentlich: Ich habe einen zweiten Dienst laufen,
der alle MQTT-Nachrichten überwacht. Temperaturen schreibt er in eine
Datenbank und alarmiert mich, wenn etwas nicht stimmt. Die
Türalarmierung macht derzeit der Arduino, indem er die
Push-Notifications selber verschickt, das würde ich gerne zentral an
einer Stelle konfigurieren. Derzeit muss ich ein neues Handy an mehreren
Orten konfigurieren, das möchte ich in Zukunft vermeiden. Auch die
Datenbank einträger pusht der Arduino selber in die Datenbank, wenn ich
hier etwas ändere, muss ich auch am Arduino-Code ändern.
Meine Fragen:
- Wie mache ich die MQTT Kommunikation am besten in PHP?
- Ist das überhaupt eine sinnvolle Lösung?
Ich möchte nämlich:
- Keine IOS-App programmieren
- Den MQTT-Broker nicht ins Internet hängen
*Zur Sicherheit:* Mit dieser Schaltung wird meine Wohnungstür geöffnet,
ein Angreifer müsste bei seinem Angriff in unserem Treppenhaus stehen.
Wenn die Tür geöffnet wird, wird diese auch nur entriegelt: Von außen
ist eine Drücker (Türklinke) installiert, der aber normal ins Leere
läuft. Nur wenn der Arduino 12V auf das Schloss gibt, rastet der Drücker
ein du die Tür kann geöffnet werden. Sobald das Türblatt sich bewegt,
werden Sensoren aktiviert, die überwachen, dass die Tür geschlossen ist
und ich erhalte PUSH-Notifications auf alles Handys, zusammen mit
Bildern der Webcam im Inneren der Wohnung.
Der Zugriff auf den Webserver erfolgt ausschließlich über TLS (HTTPS)
und ich verwende auf den Mobilen Geräten Client-Zertifikate meiner
eigenen Root-CA.