Forum: Haus & Smart Home MQTT und Webserver


von Dario C. (dario) Benutzerseite


Angehängte Dateien:

Lesenswert?

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.

von Christian S. (vivus)


Lesenswert?

Ich glaube du suchst Websockets :)
Guck mal nach "Mosquitto Websockets"

von Dario C. (dario) Benutzerseite


Lesenswert?

Websockets kenne ich, habe ich aber nicht verstanden.
Ich dachte, dass ist, damit ich mit meinem Endgerät (z.B. per Ajax) 
direkt auf den MQTT Broker zugreifen kann. Ist es besser mit PHP und 
fsockopen, fwrite
und fgets auf den MQTT-Server zu connecten, oder über ein mqtt PHP 
Plugin?

Meine alternative Denke war; ich subscribe in einem gesonderten 
deamon-Prozess auf das Topic door/status und schreibe die Ergebnisse 
fortwährend in eine Datei oder Datenbank. Diese kann ich dann per PHP 
auslesen. Das halte ich aber für nicht sehr elegant (von hinten, durch 
die Bust ins Auge).

Ich suche eine elegante Lösung.

Dario.

von Εrnst B. (ernst)


Lesenswert?

Es gibt für PHP doch genug MQTT-Libs, erste Google-Treffer:

https://github.com/mgdm/Mosquitto-PHP
https://www.cloudmqtt.com/docs-php.html
[...]

Hast du die mal angeschaut?

Dann (Sorry, wenn das aus deinem doch etwas langen Post schon 
hervorgeht):
Ein langlaufendes subscribe ist im Webserver-PHP keine gute Sache.
Kannst natürlich PHP auch Standalone laufen lassen.

Oder, ganz Oldschool, per Pipe -> STDIN:

mosquitto_sub -h -t topic ... | php Tueroeffner.php

Damit wäre dein PHP komplett MQTT-Frei.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.