MQTT - Komponente
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
MQTT - Komponente
Hallo,
Ich wollte mal mit "MQTT" Kommunikation was machen, Es gibt ja schon einiges dazu. Bevor ich nun damit beginne wollte ich mal fragen, ob jemand damit schon Erfahrungen gesammelt hat und vor allem mit welchen Komponenten er zufrieden ist.
Vielen Dank für die Ideen.
VG Markus
Ich wollte mal mit "MQTT" Kommunikation was machen, Es gibt ja schon einiges dazu. Bevor ich nun damit beginne wollte ich mal fragen, ob jemand damit schon Erfahrungen gesammelt hat und vor allem mit welchen Komponenten er zufrieden ist.
Vielen Dank für die Ideen.
VG Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- Lazarusforum e. V.
- Beiträge: 370
- Registriert: So 5. Mai 2019, 16:52
- OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
- CPU-Target: x86_64, i386
- Wohnort: Bayreuth
Re: MQTT - Komponente
Hallo,
mit MQTT grundsätzlich ja. Meine ganze Heimautomatisierung läuft darüber. Ohne Probleme und das seit Jahren.
Bezogen auf Pascal nein, aber es gibt das hier: https://github.com/jamiei/Delphi-TMQTT2
Keine Ahnung aber, ob das mit Lazarus läuft.
mit MQTT grundsätzlich ja. Meine ganze Heimautomatisierung läuft darüber. Ohne Probleme und das seit Jahren.

Bezogen auf Pascal nein, aber es gibt das hier: https://github.com/jamiei/Delphi-TMQTT2
Keine Ahnung aber, ob das mit Lazarus läuft.
Tipp für PostgreSQL: www.pg-forum.de
- af0815
- Lazarusforum e. V.
- Beiträge: 6848
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: MQTT - Komponente
Ich verwende von hier https://github.com/afriess/mqtt, das ist meine (stabile) Kopie/Fork (Branch LessDepends). Das original liegt hier https://github.com/bkeevil/mqtt. Geht sehr gut, Einarbeitungkurve ist sehr steil.MmVisual hat geschrieben: Mi 30. Okt 2024, 09:41 Ich wollte mal mit "MQTT" Kommunikation was machen, Es gibt ja schon einiges dazu. Bevor ich nun damit beginne wollte ich mal fragen, ob jemand damit schon Erfahrungen gesammelt hat und vor allem mit welchen Komponenten er zufrieden ist.
Das original hat nur sehr viele Abhängigkeiten zu weiteren Komponenten vom selben Programmierer. Die habe ich mit LessDepends für mich auf mein Wesentliches reduziert. Waren für mich die stabilsten Komponeten zum Thema MQTT. Was ich damit nicht mehr probiert habe ist MQTT mit Authentifizierung.
Gebraucht habe ich das Ganze für eine Strommessgerät, das nur per MQTT seine Daten abgibt. Deshalb einen kleinen RasPi-MQTT Server und die App mit MQTT mit Lazarus geschrieben. Ist aber auch schon 2-3 Jahre her.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- corpsman
- Lazarusforum e. V.
- Beiträge: 1629
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: MQTT - Komponente
Ich lese meine AiOnTheEdge mittels MQTT aus.
Den Broker und den Publisher dazu habe ich auf meinem Github Account abgelegt
.
Beides Lazarus und L-Net, implementiert unter Linux Mint Mate und im Dauereinsatz auf einem Raspi 3
Den Broker und den Publisher dazu habe ich auf meinem Github Account abgelegt

Beides Lazarus und L-Net, implementiert unter Linux Mint Mate und im Dauereinsatz auf einem Raspi 3
--
Just try it
Just try it
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: MQTT - Komponente
Vielen Dank für die vielen guten Antworten.
Ich bin noch nicht ganz durch mit allen, aber schon viel weiter als wie vor ein paar Tagen.
Der Code von Corpsman:
Da muss ich sagen, das ist der einzige Code, der mit Lazarus V3.6 problemlos zu übersetzen ging, Broker & Publisher haben mit einander gesprochen. Benutzen kann ich das jedoch dennoch nicht, denn mit einem Echten Broker kann sich der Publisher nicht verbinden.
Was ich noch gemacht habe:
Auf meiner Synoplogy Discstation habe ich in einem Docker Image anhand dieser Anleitung den "toke/mosquitto" installiert:
https://www.youtube.com/watch?v=kQ159NLCJts
In der Anleitung nutzt er das Test Programm "MQTT.fx 1.7.1", das kann man von hier laden:
https://mqtt.iot01.com/apps/mqttfx/1.7.1/
Damit hatte ich einen Broker und nun ein Client, das Nachrichten Publishen und Subscriben kann. Diese 2 Programme funktionieren auch. Daher kann ich diese nun als Referenz nutzen um den Lazarus Code gegenprüfen zu können.
Das Programm Publisher von Corpsman funktioniert damit leider nicht.
Der Code von af0815 konnte ich leider nicht übersetzen. Die Komponente zu installieren war auch nicht so einfach, da es noch 2 andere Komponenten zuvor benötigte und dann ging es leider doch nicht, bzw. der Thread wird nicht sauber beendet und es folgt eine Exception.
Ich habe noch dies gefunden: https://github.com/ZiCog/mqtt-free-pascal
Das will ich auch noch aus probieren. Da ist Synapse TCP/IP Komponente hinterlegt, da ich diese schon öfter benutzt habe kenne ich mich damit etwas aus. Mal schauen ob das was wird.
Vielen Dank nochmals, ich lese und lerne noch etwas weiter ....
Markus
Ich bin noch nicht ganz durch mit allen, aber schon viel weiter als wie vor ein paar Tagen.
Der Code von Corpsman:
Da muss ich sagen, das ist der einzige Code, der mit Lazarus V3.6 problemlos zu übersetzen ging, Broker & Publisher haben mit einander gesprochen. Benutzen kann ich das jedoch dennoch nicht, denn mit einem Echten Broker kann sich der Publisher nicht verbinden.
Was ich noch gemacht habe:
Auf meiner Synoplogy Discstation habe ich in einem Docker Image anhand dieser Anleitung den "toke/mosquitto" installiert:
https://www.youtube.com/watch?v=kQ159NLCJts
In der Anleitung nutzt er das Test Programm "MQTT.fx 1.7.1", das kann man von hier laden:
https://mqtt.iot01.com/apps/mqttfx/1.7.1/
Damit hatte ich einen Broker und nun ein Client, das Nachrichten Publishen und Subscriben kann. Diese 2 Programme funktionieren auch. Daher kann ich diese nun als Referenz nutzen um den Lazarus Code gegenprüfen zu können.
Das Programm Publisher von Corpsman funktioniert damit leider nicht.
Der Code von af0815 konnte ich leider nicht übersetzen. Die Komponente zu installieren war auch nicht so einfach, da es noch 2 andere Komponenten zuvor benötigte und dann ging es leider doch nicht, bzw. der Thread wird nicht sauber beendet und es folgt eine Exception.
Ich habe noch dies gefunden: https://github.com/ZiCog/mqtt-free-pascal
Das will ich auch noch aus probieren. Da ist Synapse TCP/IP Komponente hinterlegt, da ich diese schon öfter benutzt habe kenne ich mich damit etwas aus. Mal schauen ob das was wird.
Vielen Dank nochmals, ich lese und lerne noch etwas weiter ....
Markus
Zuletzt geändert von MmVisual am Mo 4. Nov 2024, 10:47, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: MQTT - Komponente
Ich habe was gefunden was funktioniert
https://github.com/jamiei/Delphi-TMQTT2/tree/master
Mit Lazarus das Delphi Projekt auf Lazarus konvertieren
Dazu noch ein Ordner "Synapse" anlegen und die aktuellen Dateien da rein.
Läuft. Publish und Subscribe. Perfekt.
Nur Disconnect geht nicht so recht.

https://github.com/jamiei/Delphi-TMQTT2/tree/master
Mit Lazarus das Delphi Projekt auf Lazarus konvertieren
Dazu noch ein Ordner "Synapse" anlegen und die aktuellen Dateien da rein.
Läuft. Publish und Subscribe. Perfekt.
Nur Disconnect geht nicht so recht.
EleLa - Elektronik Lagerverwaltung - www.elela.de
- af0815
- Lazarusforum e. V.
- Beiträge: 6848
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: MQTT - Komponente
Deswegen im Git Repro von mir der Zweig 'LessDepends' deswegen. Aber ich muss gestehen, das ich es die letzten Jahre nicht angefasst habe, nachdem die App beim Kunden läuft und läuft und läuft (Oder er alles schon verschrottet hat).MmVisual hat geschrieben: So 3. Nov 2024, 19:13 Der Code von af0815 konnte ich leider nicht übersetzen. Die Komponente zu installieren war auch nicht so einfach, da es noch 2 andere Komponenten zuvor benötigte und dann ging es leider doch nicht, bzw. der Thread wird nicht sauber beendet und es folgt eine Exception.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- corpsman
- Lazarusforum e. V.
- Beiträge: 1629
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: MQTT - Komponente
Servus,
Ich befürchte, dass deine MQTT variante Sicherheitsaspeckte nutzt, die ich nicht implementiert habe. Ich habe meine MQTT komponenten für Ai on The Edge implementiert und da läuft das ganze 24 / 7 seit gut einem Jahr durch
.
Ggf habe ich über den Jahreswechsel mal Zeit mir dein Testprogramm an zu sehen, meist ist es nicht viel das fehlt
Ich befürchte, dass deine MQTT variante Sicherheitsaspeckte nutzt, die ich nicht implementiert habe. Ich habe meine MQTT komponenten für Ai on The Edge implementiert und da läuft das ganze 24 / 7 seit gut einem Jahr durch

Ggf habe ich über den Jahreswechsel mal Zeit mir dein Testprogramm an zu sehen, meist ist es nicht viel das fehlt

--
Just try it
Just try it
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: MQTT - Komponente
Ich habe es hin bekommen
- QoS: 0 geht
- Man kann mehrere Subscribe machen und diese wieder Unsubscriben
- Läuft mit Lazarus 3.6
- Braucht nur Synapse, das man nicht extra installieren muss (mit im ZIP, aktuelle Version)
- Keine Exceptions beim Beenden der EXE, der Thread wird nun korrekt beendet
- Von hier kommt das Original, das ich angepasst habe: https://github.com/ZiCog/mqtt-free-pascal

- QoS: 0 geht
- Man kann mehrere Subscribe machen und diese wieder Unsubscriben
- Läuft mit Lazarus 3.6
- Braucht nur Synapse, das man nicht extra installieren muss (mit im ZIP, aktuelle Version)
- Keine Exceptions beim Beenden der EXE, der Thread wird nun korrekt beendet
- Von hier kommt das Original, das ich angepasst habe: https://github.com/ZiCog/mqtt-free-pascal
Zuletzt geändert von MmVisual am Do 7. Nov 2024, 09:27, insgesamt 2-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: MQTT - Komponente
Ich habe mich nun an die MQTT2 Version ran getraut, die kann mehr und ist wohl ein Upgrade bei dem deutlich mehr MQTT Funktionalität drin ist...
Das ganze ist schon ziemlich verschachtelt programmiert mit überlagernden Klassen usw.
Connect geht. Publish geht auch. Subscribe geht jedoch nicht richtig.
Ich bin mir jetzt nicht sicher woran das liegt. Und wenn ich Unsubscribe kommt eine Fehlermeldung dass der Speicherbereich nicht ansprechbar ist. Innerhalb der Funktion sind alle Zeiger da und das TBytes Array wir korrekt aufgebaut, jedoch wenn die Funktion beim End: verlassen wird, dann knallt es.
Ich debugge das nun schon ein paar Stunden und ich komme da einfach nicht drauf was da schief geht. Hier das Projekt:
Vielen Dank für die Hilfe.
PS: Der ursprüngliche Download kommt von hier: https://github.com/jamiei/Delphi-TMQTT2
Das ganze ist schon ziemlich verschachtelt programmiert mit überlagernden Klassen usw.
Connect geht. Publish geht auch. Subscribe geht jedoch nicht richtig.
Ich bin mir jetzt nicht sicher woran das liegt. Und wenn ich Unsubscribe kommt eine Fehlermeldung dass der Speicherbereich nicht ansprechbar ist. Innerhalb der Funktion sind alle Zeiger da und das TBytes Array wir korrekt aufgebaut, jedoch wenn die Funktion beim End: verlassen wird, dann knallt es.
Ich debugge das nun schon ein paar Stunden und ich komme da einfach nicht drauf was da schief geht. Hier das Projekt:
Vielen Dank für die Hilfe.
PS: Der ursprüngliche Download kommt von hier: https://github.com/jamiei/Delphi-TMQTT2
Zuletzt geändert von MmVisual am Do 7. Nov 2024, 09:26, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: MQTT - Komponente
Ein klein wenig habe ich noch heraus gefunden:
- Inherited Create haben gefehlt
- Es muss irgendwie mit dem "Subscribe" / "UnSubscribe" zusammen hängen. Bei Subscribe werden die Botschaften dann empfangen, jedoch bei "UnSubscribe" stürzt das ab, bzw. bring Speicherfehler.
- Wenn man kein "Subscribe" macht, sondern sich nur verbindet / Published, dann kommen keine Fehler.
Wenn ich die Zeile "Data := [162,5,0,2,0,1,35];" aktivieren und "Msg.ToBytes" nicht verwende, dann wird die Botschaft beim Server unsubscribet, und es kommt dann auch kein Fehler. So weit habe ich mal den Fehler eingegrenzt.
Anbei der Stand mit ein paar Korrekturen und alle .Free sind jetzt zu FreeAndNil() ersetzt.
Irgend was ist da mit erzeugen und Freigeben der Konponenten noch nicht ganz sauber.
- Inherited Create haben gefehlt
- Es muss irgendwie mit dem "Subscribe" / "UnSubscribe" zusammen hängen. Bei Subscribe werden die Botschaften dann empfangen, jedoch bei "UnSubscribe" stürzt das ab, bzw. bring Speicherfehler.
- Wenn man kein "Subscribe" macht, sondern sich nur verbindet / Published, dann kommen keine Fehler.
Code: Alles auswählen
Function TMQTT.Unsubscribe(Topics: TStringList): Integer;
Var
Msg: TMQTTMessage;
MsgId: Integer;
Data: TBytes;
Begin
Result := -1;
If isConnected Then
Begin
Msg := UnsubscribeMessage;
MsgId := getNextMessageId;
(Msg.VariableHeader As TMQTTUnsubscribeVarHeader).MessageID := MsgId;
Msg.Payload.Contents.AddStrings(Topics);
Data := Msg.ToBytes;
//Data := [162,5,0,2,0,1,35];
If WriteData(Data) Then Result := MsgId;
FreeAndNil(Msg);
End;
End;
Anbei der Stand mit ein paar Korrekturen und alle .Free sind jetzt zu FreeAndNil() ersetzt.
Irgend was ist da mit erzeugen und Freigeben der Konponenten noch nicht ganz sauber.
Zuletzt geändert von MmVisual am Do 7. Nov 2024, 09:26, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: MQTT - Komponente
Ich denke nun habe ich es...
Bei MQTT2 habe ich den Thread umgeschrieben und die Ansteuerung der Socket Komponnete anders gemacht. Nun verbraucht der Thread auch nicht mehr die komplette Rechenleistung eines Prozessor-Kerns. Auch wird nun das Senden der Daten mit im Thread gemacht, was das ganze Handling mit TCriticalSection deutlich vereinfacht. Die Exceptions hatte ich bisher auch nicht mehr gesehen.
Kann bitte dieser Client jemand mit testen und schreiben ob es bei euch auch geht?
Dankeschön.
Bei MQTT2 habe ich den Thread umgeschrieben und die Ansteuerung der Socket Komponnete anders gemacht. Nun verbraucht der Thread auch nicht mehr die komplette Rechenleistung eines Prozessor-Kerns. Auch wird nun das Senden der Daten mit im Thread gemacht, was das ganze Handling mit TCriticalSection deutlich vereinfacht. Die Exceptions hatte ich bisher auch nicht mehr gesehen.
Kann bitte dieser Client jemand mit testen und schreiben ob es bei euch auch geht?
Dankeschön.
Zuletzt geändert von MmVisual am Do 7. Nov 2024, 09:27, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: MQTT - Komponente
Ich hatte doch noch ein paar Bugs drin, ich musste ziemlich lange suchen, bis ich auf die Idee kam die ganzen Prüfungs-Häkchen bei den Projekteinstellungen zu aktivieren.
Nun ist auch QoS 1 und QoS 2 Handshake mit drin und die Komponente kann "AutoResponse" um den Server zu bedienen. Über eine StringList können von allen Subscribten Werten als TObject die MessageID gelesen werden.
Bei Publish werden jetzt alle Parameter gesetzt und bei Subscribe werden alle Parameter empfangen (die es für QoS 1 und QoS 2 benötigt).
Die Befehle Pubrel(), Puback(), Pubrec() und Pubcomp() gibt es nun auch, die werden bei QoS 1 und QoS 2 zwingend gebraucht und bei Parameter AutoResponse=TRUE automatisch bedient.
Timeout ist mal auf 1000 eingestellt, der Timeout wirkt auch bei Connect der TCP/IP Komponnete. Ein "OnDisconnect" Event gibt es jetzt auch.
Schreibt mir bitte ob das nun OK ist, bzw. eure Erfahrungen.
Könnt ihr das mit UserName / Passwort testen? Ich habe derzeit keinen Broker mit den Benutzerrechten. Dankeschön.

Nun ist auch QoS 1 und QoS 2 Handshake mit drin und die Komponente kann "AutoResponse" um den Server zu bedienen. Über eine StringList können von allen Subscribten Werten als TObject die MessageID gelesen werden.
Bei Publish werden jetzt alle Parameter gesetzt und bei Subscribe werden alle Parameter empfangen (die es für QoS 1 und QoS 2 benötigt).
Die Befehle Pubrel(), Puback(), Pubrec() und Pubcomp() gibt es nun auch, die werden bei QoS 1 und QoS 2 zwingend gebraucht und bei Parameter AutoResponse=TRUE automatisch bedient.
Timeout ist mal auf 1000 eingestellt, der Timeout wirkt auch bei Connect der TCP/IP Komponnete. Ein "OnDisconnect" Event gibt es jetzt auch.
Schreibt mir bitte ob das nun OK ist, bzw. eure Erfahrungen.
Könnt ihr das mit UserName / Passwort testen? Ich habe derzeit keinen Broker mit den Benutzerrechten. Dankeschön.
Zuletzt geändert von MmVisual am Do 7. Nov 2024, 18:22, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: MQTT - Komponente
Ich habe das Projekt nun selbst in das Git gestellt, daher habe ich die Downloads hier aus dem Forum gelöscht:
https://github.com/mmvisualgit/TMQTT3---Pascal
https://github.com/mmvisualgit/TMQTT3---Pascal
EleLa - Elektronik Lagerverwaltung - www.elela.de