Forum: PC-Programmierung MySQL - Polling unerwünscht


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Stefan R. (stefan103)


Lesenswert?

Hallo zusammen,
ein Gerät (Aktor) soll über das Internet mit einer Datenbank 
kommunizieren.

Problem:
Dabei soll der Aktor NICHT im Sekundentakt seinen (eventuell neuen) 
Status von der Datenbank abfragen. Meine bisherigen Kenntnisse in HTML, 
CSS, PHP, Java-Script, MySQL (incl. Routinen) und CronJob reichen 
allerdings nur für eben diese Lösung im Polling-Betrieb.
Statt dessen soll der Server zu gegebener Zeit aktiv werden und den 
Aktor kontaktieren.

Idee:
Mit Hilfe der GET Methode konnte ich Aktoren bereits dazu bewegen 
bestimmte Dinge zu tun. Bitte nicht nach Details fragen, auf dem Aktor 
lief DOS :D

Fragen:
Leider fehlt mir hier der letzte Step: Wie bekomme ich meine Datebank 
dazu eine Webseite aufzurufen (um den GET Befehl an meinen Aktor zu 
senden)?
Oder macht man das ganz anders?
Welche Suchbegriffe helfen mir hier weiter?

Vorab vielen Dank,
Stefan

von Thomas V. (tomv)


Lesenswert?

Hi Stefan,

Du suchst MQTT. Das ist genau für sowas gemacht.

https://de.wikipedia.org/wiki/MQTT
https://mqtt.org/

Es gibt da schon jede Menge Bibliotheken undClients sowie auch Message 
Broker für alle möglichen Systeme/Microcontroller/wasauchimmer.

von Jan H. (j_hansen)


Lesenswert?

Stefan R. schrieb:
> Fragen:
> Leider fehlt mir hier der letzte Step: Wie bekomme ich meine Datebank
> dazu eine Webseite aufzurufen (um den GET Befehl an meinen Aktor zu
> senden)?
> Oder macht man das ganz anders?
> Welche Suchbegriffe helfen mir hier weiter?

Macht man so nicht. Irgendwas wird ja den Status in der DB umsetzen. Das 
kann dann auch den Aktor ansprechen.

Ev. kann es auch die DB machen wie hier beschrieben, ist aber wirklich 
Pfusch Pfusch Pfusch: 
https://stackoverflow.com/questions/27665066/send-an-http-request-in-mysql-trigger-after-insertion-in-a-table

von ozo (Gast)


Lesenswert?

Nabend,

eventuell ist 'websocket' ein sinnvoller Suchbegriff.

Grüße

von Deutscher Riese (Gast)


Lesenswert?

Ne Datenbank macht gar nix aktiv von selbst nach aussen, die reagiert 
nur auf das was von aussen an Kommandos reinkommt.
Wie macht man das nun? Man klemmt nen Dienst davor der das regelt.

von Imonbln (Gast)


Lesenswert?

Thomas V. schrieb:
> Du suchst MQTT. Das ist genau für sowas gemacht.

Wenn der TO das Protokoll frei wählen kann, ist MQTT sicher eine schöne 
Lösung. Aber ich habe irgendwie denn verdacht das der TO sich im Web 
Umfeld (vielleicht RESTfull) unterwegs ist. Dann währen wahrscheinlich 
Webhooks die Technik welche seine Anforderungen erfüllen.

Allerdings wie auch schon erwähnt ändert sich die DB nicht so spontan, 
es muss einen Trigger geben und im Idealfall sollte dieser Trigger auch 
gleich ein Event zum Client schicken das dieser neue Daten abholen kann 
oder besser gleich die neuen Daten.

von Εrnst B. (ernst)


Lesenswert?

Postgres hätte für sowas "LISTEN/NOTIFY"
Bei MySQL könnte man mit table-locks was basteln, der Schreib-Task hält 
dann ständig ein exclusive lock und gibt es nur kurz nach 
updates/inserts frei.
der Lese-Task kann dann ohne Polling auf dem Lock warten. Ist aber sehr 
"hacky" und vmtl. nicht was der TE braucht.

: Bearbeitet durch User
von Michael H. (mha1)


Lesenswert?

Um bei einer Änderung in einer Datenbank eine Aktion auszulösen gibt es 
Datenbanktrigger. Damit sollte sich das gewünschte Verhalten realisieren 
lassen.

von Εrnst B. (ernst)


Lesenswert?

Michael H. schrieb:
> Damit sollte sich das gewünschte Verhalten realisieren
> lassen.

Bei Postgres: Kein Problem.
AFTER UPDATE or INSERT --> pg_notify(kanalname...)

und der Client führt ein "LISTEN kanalname" aus, und wird so bei jeder 
Änderung benachrichtigt.

MySQL hat m.W. keinen vergleichbaren Mechanismus. Evtl. könntest du kurz 
beschreiben, wie du dir das gedacht hast.

von Stefan R. (stefan103)


Lesenswert?

Das MQTT-Protokoll scheint genau das zu sein was ich gesucht habe. Auch 
weil in diesem Zusammenhang immer wieder der Begriff IoT fällt.

Die Sensor-Variante scheint recht simpel zu sein. Die stelle ich mir so 
vor:
Sensor -> MQTT via Internet -> mit Hilfe von Python in MySQL
Hier habe ich in der Vergangenheit mit Python auf dem Sensor gearbeitet 
und konnte die Daten direkt in die Datenbank schreiben.

Die Aktor-Variante habe ich noch nicht ganz durchblickt und scheint auch 
dünner dokumentiert.
MySQL -> ? -> MQTT via Internet -> Aktor
Sprechen MySQL Events/Trigger/Routinen MQTT?
Hier muss ich mich erst einmal einlesen.

Vielen Dank für alle Antworten.

von Thomas V. (tomv)


Lesenswert?

MQTT funktioniert anders:

Zentraler "Datenspeicher"(vermutlich, das was Du mit der DB abbilden 
willst) ist ein Stück Software, der "message broker". Dafür gibt es 
unter Linux z.B. mosquitto.
Dort melden sich alle Aktoren und Sensoren an. Jeder Sensor und Aktor 
sendet in regelmäßigen Abständen als auch bei akut eingetretenen 
Ereignissen seinen Status an den message broker.
Alle am message broker angemeldeten Sensoren und Aktoren teilen 
gleichzeitig dem MB mit, der Status welcher anderer Geräte sie 
interessiert. Somit sendet der Broker bei einer Änderung am SensorX eine 
Nachricht an Aktor Y, da dieser sein Interesse daran bekundet hat.

Mal ganz vereinfacht und vielleicht nicht 100%ig korrekt ausgedrückt.

p.s:
Einer dieser MQTT-Clients kann auch eine Home-Automation-Software sein, 
die  z.B.eine WebGUI, nette Graphen, Automatismen oder ähnliches zur 
Verfügung stellt.

von Sheeva P. (sheevaplug)


Lesenswert?

Deutscher Riese schrieb:
> Ne Datenbank macht gar nix aktiv von selbst nach aussen, die reagiert
> nur auf das was von aussen an Kommandos reinkommt.
> Wie macht man das nun? Man klemmt nen Dienst davor der das regelt.

Man könnte sich -- also: rein theoretisch, natürlich -- ein bisschen mit 
diesem Datenbankzeug auskennen und die NOTIFY-Funktionen von PostgreSQL 
oder Blocking Reads von Redis kennen, oder Redis Streams, oder... ;-)

von Sheeva P. (sheevaplug)


Lesenswert?

Εrnst B. schrieb:
> Postgres hätte für sowas "LISTEN/NOTIFY"
> Bei MySQL könnte man mit table-locks was basteln, der Schreib-Task hält
> dann ständig ein exclusive lock und gibt es nur kurz nach
> updates/inserts frei.
> der Lese-Task kann dann ohne Polling auf dem Lock warten. Ist aber sehr
> "hacky" und vmtl. nicht was der TE braucht.

... und vermutlich lossy.

von Sascha W. (sascha-w)


Lesenswert?

@Stefan,

für was ist denn die Datenbank überhaupt da? Nur um den letzten Wert 
vorzuhalten?
MQTT wird für den Zweck schon das beste sein. Dein Sensor sendet die 
Daten an den Broker und der gibt sie zum Aktor. Wenn die auch noch in 
der Datenbank benötigt werden (Langzeitaufzeichnung) dann kann der 
Broker die auch noch an einen Dienst geben der sie in die Datenbank 
schreibt. Damit der Aktor beim Anmelden am Broker den letzten Wert 
bekommt den der Sensor geliefert hat, kann dieser seine Nachricht mit 
gesetztem Retain-Flag senden - dann merkt sich der Broker den letzten 
Wert. Ansonsten reicht er nur das weiter was reinkommt.

Sascha

von Stefan R. (stefan103)


Lesenswert?

Thomas V. schrieb:
> MQTT funktioniert anders:
> ...

Sascha W. schrieb:
> @Stefan,
>
> für was ist denn die Datenbank überhaupt da? Nur um den letzten Wert
> vorzuhalten?
> ...

Prima, jetzt wird klarer wie MQTT funktioniert.

In einem anderen Projekt habe ich in der MySQL Datenbank den Status 
mehrerer Aktoren je als Bool gespeichert. Die Aktoren selbst haben 
permanent und im Sekundentakt ihren Status in der Datenbank abgefragt. 
Auch wenn das im LAN sehr gut funktioniert hat, konnte ich mich für 
diese Polling-Variante nie so richtig begeistern.

Davon abgesehen gefällt mir an MySQL wie leicht man Daten mit Webseiten 
einsehen und verändern kann.
Gemäß einer kurzen Google-Suche kann ich dies scheinbar auch mit MQTT 
via JavaScript/PHP/Phyten lösen. Somit wüsste ich nicht, wofür ich MySQL 
noch benötigen sollte.

Nochmals vielen Dank =)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.