MQTT - Komponente

Rund um die LCL und andere Komponenten
Antworten
MmVisual
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

Beitrag von MmVisual »

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
EleLa - Elektronik Lagerverwaltung - www.elela.de

Ich934
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

Beitrag von Ich934 »

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.
Tipp für PostgreSQL: www.pg-forum.de

Benutzeravatar
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

Beitrag von af0815 »

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.
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.

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).

Benutzeravatar
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

Beitrag von corpsman »

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
--
Just try it

MmVisual
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

Beitrag von MmVisual »

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
Zuletzt geändert von MmVisual am Mo 4. Nov 2024, 10:47, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de

MmVisual
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

Beitrag von MmVisual »

Ich habe was gefunden was funktioniert :D

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

Benutzeravatar
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

Beitrag von af0815 »

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.
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).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
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

Beitrag von corpsman »

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 ;)
--
Just try it

MmVisual
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

Beitrag von MmVisual »

Ich habe es hin bekommen :D

- 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

MmVisual
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

Beitrag von MmVisual »

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
Zuletzt geändert von MmVisual am Do 7. Nov 2024, 09:26, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de

MmVisual
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

Beitrag von MmVisual »

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.

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; 
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.
Zuletzt geändert von MmVisual am Do 7. Nov 2024, 09:26, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de

MmVisual
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

Beitrag von MmVisual »

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.
Zuletzt geändert von MmVisual am Do 7. Nov 2024, 09:27, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de

MmVisual
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

Beitrag von MmVisual »

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. :idea:

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.
MQTT_Demo.png
MQTT_Demo.png (24.92 KiB) 3801 mal betrachtet
Zuletzt geändert von MmVisual am Do 7. Nov 2024, 18:22, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de

MmVisual
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

Beitrag von MmVisual »

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
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten