stefandreyer / CODESYS-MQTT

MQTT client library for CODESYS, supporting all QoS
MIT License
112 stars 26 forks source link

noTLS example does not work #8

Closed bmshine closed 5 years ago

bmshine commented 5 years ago

Hallo Stefan,

ich habe mal deinen MQTT Baustein geladen und den Beispielprogramm ausprobiert. Leider funktioniert nur die TLS Variante. Die ohneTLS Variante verbindet sich weder auf test.mosquitto.org noch meinen lokalen MQTT server. Muss ich bestimmte Versionen von den LIB's laden oder funktioniert es auch mit den neusten? Aktuell verwende ich Codesys 3.5 SP13 Patch2.

Gruss Markus

stefandreyer commented 5 years ago

Hallo Markus,

auf welchem System läuft die Runtime? Funktionieren muss dass alles mit den Bibliotheken die du in meinen Repositories findest.

Grüße Stefan

bmshine commented 5 years ago

Hallo Stefan, auf Windows10 funktionierts nicht. Auf dem Raspi mit lokalem MQTT Server funktioniert das Beispiel. Mit test.mosquitto.org als Server funktionierts da leider auch nicht. Gruss Markus

stefandreyer commented 5 years ago

Hallo Markus,

kann das Problem nachvollziehen, gehen dem nach. Grüße

stefandreyer commented 5 years ago

Hallo Markus,

gestern hatte ich die selben Probleme wie du beschrieben hast. Heute Klappt die Verbindung zu test.mosquitto.org. Ich denke die werden da was versucht haben.

Bitte versuche es nochmal und geb mir Rückmeldung, vielen Dank

Grüße Stefan

bmshine commented 5 years ago

Hallo, das Windows Beispiel funktioniert bei mir immer noch nicht. Die Raspi Variante mit lokalem MQTT Server funktioniert super. Vielen Dank. Gruss Markus

stefandreyer commented 5 years ago

Hallo Markus,

schau mal bitte nach folgenden Variablen: MQTT_CONTROL : step MQTT_CONTROL : SResultIP (sollte ip von test.mosquitto.org enthalten, wenn nicht stimmt was mit dem DNS nicht) IP_CONTROL_TLS : State

und geb mir die Aktualwerte.

Aktuell funktioniert das beispiel bei mir.

Grüße Stefan

kurta241 commented 5 years ago

Hallo Stefan,

Das Projekt "TestMQTTGithubWindowsWithoutTLS.project" funktioniert bei mir leider auch nicht. MQTT_CONTROL : step = 30 MQTT_CONTROL : SResultIP = 3.121.19.92 (Adresse von broker.hivemq.com) IP_CONTROL_TLS : State = konnte ich nicht finden Mit dem Broker test.mosquitto.org konnte ich mich auch mit einem MQTT-Client auf dem PC nicht verbinden, deshalb habe ich broker.hivemq.com verwendet.

Mit Wireshark sehe ich den TCP-Verbindungsaufbau (3-Way-Handshake) und 10s später den Verbindungsabbau. Dazwischen findet keine Datenübertragung statt.

Was kann ich noch zur Fehlersuche tun?

SG Kurt

stefandreyer commented 5 years ago

Hallo Kurt,

habe das Beispiel heut früh mit hivemq.com getestet. Lief bei mir. Es sieht so aus als wenn er nicht mit dem Verbindungsaufbau fertig wird. Du musst in dem super() Aufruf in IP_control_TLS online öffnen und dort nach dem Städte schauen.

Bei test.mosquitto.org spielen sie ab und zu rum. Vielleicht Lags daran. Hatte ich auch schon.

Grüße Stefan

kurta241 commented 5 years ago

Hallo Stefan,

Danke für den raschen Hinweis. TC_Connect bleibt im state=52 hängen. SysSock2Connect liefert einmal als Ergebnis pResult=518, dann immer pResult=525 (socket is already connected). Da nur bei pResult=0 zum nächsten Schritt (250) weitergeschaltet würde, geht nichts mehr weiter.

Ich habe nun das Testbeispiel für den Raspberry ausprobiert - funktioniert problemlos. Ich möchte die MQTT Bibliothek sowieso auf dem Raspberry einsetzen und muss daher den Fehler im Windows-Beispiel nicht unbedingt finden, helfe dir aber gerne bei der Fehlersuche.

Danke, dass du diese MQTT-Bibliothek zur Verfügung stellst!

Schöne Grüße Kurt

stefandreyer commented 5 years ago

Hallo Kurt,

welche Windows Version nutzen du?

Grüße Stefan

kurta241 commented 5 years ago

Hallo Stefan,

Auf meinem PC ist Windows 10 Pro Build 1803 installiert.

Schöne Grüße Kurt

stefandreyer commented 5 years ago

Hallo Kurt,

ist schon komisch, habe auch ein Windows 10 und da funktionierts.

Das SysSock2Connect hat bei mir auch schon immer mal Probleme gemacht. Hast du die Aktuelle Version?

Grüße Stefan

kurta241 commented 5 years ago

Hallo Stefan,

Bei mir sind folgende Versionen installiert: SysSocket2, 3.5.10.0 (System) SysSocket, 3.5.13.0 (System)

C:\netstat -an zeigt eine hergestellte TCP Verbindung auf port 1883, und mehr als 10 wartende. Die Verbindung wird hergestellt und wieder verworfen. TC_Connect bekommt das aber nicht mit, da SysSock2Connect nie pResult=0 liefert. SysSock2Connect liefert 525 und diese Rückgabewert wird im CASE ab Zeile 388 nicht berücksichtigt.

Schöne Grüße Kurt

kurta241 commented 5 years ago

Hallo Stefan,

Habe jetzt SysSocket2, 3.5.13.20 Bibliothek hinzugefügt. In CommonTypsFunctions steht immer noch die SysSocket2, 3.5.10.0. Ist hier etwas mit den Versionen durcheinander?

Schöne Grüße Kurt

Tommilein commented 5 years ago

Hallo Stefan, Habe das Testprogramm(ohne TLS - TestMQTTGithubRaspberryWithoutTLS.project) zum Laufen gebracht. Ich kann sehen, das die MQTT-Übertragung zu 'test.mosquitto.org:1883' sttfindet. Jedenfalls kommen im mqtt.fx Daten an.

Aber nun verzeihe einem nicht ganz so gewieften Codesys-Programierer. Wie kann ich nun das Testprogramm für meine eigenen Programme nutzen. Ich erkenne nur eine Eingabe-Variable für die URL. Ich müsste aber auch noch einen EIngabewert zum "publish" und eine Ausgabevariable für "subscribe" haben, damit ich was geordnet übertragen bekomme. Ein bissel "status" wäre auch ganz schön.

Ist diese Test-Programm ohen jeden Kommentar und mit einer Programmzeile von vornherein so konzipiert, oder finde ich wieder mal nicht alles...

Für ein paar kleine Hinweise wäre ich dankbar.

Übrigens mit einem lokalen Broker und mittlerweile auch mit einem öffentlichen Broker konnte ich eigene Daten hin und herschicken (forcen für publish und nur Anschauen für subscribe, verarbeiten konnte ich nichts. mqtt fx_anzeige

Mfg Thomas

stefandreyer commented 5 years ago

Hallo Tommi,

ja das Testprogramm ist mit Absicht so konzipiert.

Hintergrund: ich habe 2 TestOutOfTheBox FBs geschrieben. Einmal mit und einmal ohne TLS. Diese kann ich dann je Plattform in ein Projekt integrieren und brauch das je Plattform nicht neu machen. Ich habe hier zum testen nur Windows und Linux(Raspi). Somit können auch Nutzer anderer Plattformen diese FBs einfach zum testen in einem Projekt aufrufen(Wago z.B., ist ja aber auch Linux, glaube ich).

Also, in den Github Testprojekten einfach rechtsklick in der Variablenansicht auf testMQTT:SD_MQTT.TestOutOfTheBoxNoTLS; Symbol suchen --> gehe zur Definition, dann siehst du das Programm.

Grüße Stefan

Tommilein commented 5 years ago

Hallo Stefan,

Meine Antwort begann vor einer Stunde so: _vielen Dank für die schnelle Antwort. Da komme ich vielleicht weiter. Solche Tricks wie

  **_„…testMQTT:SD_MQTT.TestOutOfTheBoxNoTLS; Symbol suchen --> gehe zur Definition“ …“_**

 sind für mich eben nicht Standard – man lernt immer dazu. 
 Ich versuche nun den Code aus TestOutOfTheBoxNoTLS
 in die „POU“ zu übertragen, um dann dort die Variablen füllen zu können.
 Aber schon wenn ich nur  die Variablen übertrage, kommen massenweise
 die Compilerhinweise auf Fehler._

Dann habe ich immer weiter geforscht, da ich nicht verstehen konnte (und wollte), dass ich so beschränkt sein soll. Und siehe da, wenn man nur stur genug ist, kommt man zum Erfolg: mqtt_codesys_erster_erfolg

Aber ich gebe zu: ohne Deinen Hinweis hätte ich noch ewig rumgesucht !!!

Ist eben schön, wenn das Internet nicht nur für Selfies gut ist. Jetzt kann mein Projekt weitergehen, noch mal vielen Dank für Deinen Hinweis. Aber noch mehr Respekt für Deine Library !!

Viele Grüße Thomas

stefandreyer commented 5 years ago

Hallo Thomas,

schön das du voran kommst.

Aber sei gewarnt, ich aktuallisiere gerade die Library und stelle das subscription Konzept um. Ich verwende nun Callbacks. Pro: viel schneller und sicherer, Kontra: vielleicht nicht ganz so einfach. Ich baue aber ein paar schöne Beispiele dazu.

Grüße Stefan

Tommilein commented 5 years ago

Hallo Stefan, ist doch toll, wenn Du die Library weiterentwickelst (nicht : fire'n'forget ) .

Wenn Du aber u.U. gerade am Computer bist – kannst Du mir mal einen Hinweis zu dem öffentlichen Broker geben ? Wie komme ich denn zu einem „eigenen“ Topic. Ich möchte getrennte Topics für Senden und Empfangen anlegen. Aber mit meinen Topics geschieht nichts – kein Senden/Empfangen. Sind die schon verwendet oder wie komme zu eigenen getrennten Topics (auch für state).

Mit freundlichen Grüßen Thomas

stefandreyer commented 5 years ago

Hallo Thomas,

Ein eigenes Topic? Nun die öffentlichen Broker haben was von Anarchie. Du kannst zu jeden Vorhandenen Topic publishen oder einfach ein neues aufmachen. Es gibt für Topics bei Brokern kein "Anmelden", "Registrieren" oder "Reservieren". Einfach machen. Aber so ist es auch anders herum. jeder kann deine Topics lesen und auch darauf schreiben.

Wenn du im Codesys ein Publish senden willst, mache dafür eine eigene Instans des MQTTPublish FBs auf und vergess das Initialisieren nicht. Genauso für die Subscribtion.

Grüße Stefan

Tommilein commented 5 years ago

Hallo Stefan, bin mit Deinen Hinweisen eigentlich gut zurechtgekommen - bisher im Testprogramm. Wenn ich nun die MQTT-Teile in meine Anwendung kopiere, da knalle ich gegen die oscat-network 1.2.1. Durch FTP-Aufruf fahre ich voll gegen die Wand (Totalabsturz Raspberry). Nun finde ich auf den Oscat-Seiten nichts mehr von network 1.3.0. - auch keine Beschreibung, wo ich die evtl. vorhandenen Aufruf-Unterschiede nachvollziehen könnte. Hast Du eine Beschreibung ? -- oder was ist da bei oscat los.

Viele Grüße Thomas

PS: auch FTP geht mit Deinem mqtt-Programm. Ich hatte eigene Anpassungen am FTP-Script vorgenommen, die musste ich erneut an der Network 1.30 anpassen und schon funktionierts.

stefandreyer commented 5 years ago

Hallo Thomas,

ich habe den IP_Controll anpassen müssen, hast du meinen aus der CommonTypesAndFunction lib?Ich habe nich kontrolliert ob 2 verschiedene FBs kollidieren. Versuch mal auf meine Version zu gehen. Ich habe auch eine OSCAT Network lib im repository, vielleicht geht die für dich.

Grüße Stefan

Tommilein commented 5 years ago

Hallo Stefan, brauche nochmal Deine Hilfe. Wie ist es angedacht, wenn nun mehrere Mqtt-Clients auf die Codesys-Maschine einstürmen. Kann ich alle Topics "irgendwie" über einen einzigen Subscribe-Aufruf übernehmen und danach im Codesys analysieren, wo das Telegramm herkommt. Oder muss ich pro topic je eine subscribe-Instanz definieren ?? Ich will die Welt nicht nochmal erfinden... Danke und viele Grüße Thomas

stefandreyer commented 5 years ago

Hall Thomas,

nun, das kannst du machen wie du möchtest, wenn du für jedes Topic eine einzelne subscription machst, dann übernimmt die lib dir das auseinandernehmen. Ist halt entsprechend umfangreich. Wenn du Wildcards einsetzt, dann muss dein Projekt das raussuchen was du willst.

Schau dir doch mal meine neuen Beispiele an. Da wird nur zu einer Topic die subscription gemacht, und die library vertilt das dann an die variablen der instancen.

Zum Thema einstürmen. Wenn du zu # auf test.mosquitto.org eine subscription macht, dann wird's natürliche eng ;) aber bei deinem lokalen broker sollte das ja kein Problem sein.

Und der Broker sendet nur zo Topics auf die du eine Subscription macht.

Grüße Stefan

Tommilein commented 5 years ago

Hallo Stefan, ich muss Dich nochmal bemühen. Bei mir geht seit 8.3.2019 der Broker "test.mosquitto.org" nicht mehr. Sowohl das Tool mqtt.fx connected nicht mehr als auch ein Arduino, der lange Zeit vor sich hin sendete, steigt aus. Der Arduino geht sofort wieder mit einem anderen Broker. Auch Dein neuestes Programm connected nicht. Nun sind die öffentlichen Broker auch im Betrieb wahrscheinlich nicht sicher und ich hatte die Idee, den broker zu wechseln wenn einer nicht geht. Der Arduino macht das auch - er wechselt enfach, wenn er merkt es geht nichts raus. Der Raspberry weiß aber davon u.U. nichts, bzw. weiß er nicht wohin der Arduino gewechselt hat. Die Lösung ist aus meiner Sicht die: der Raspberry muss alle vorgesehenen Broker permanent abfragen (vielleicht jede Minute) und wenn er von dort was sinnvolles bekommt, dann connected er sich dahin mit der richtigen Abfrage-Geschwindigkeit. Meine Frage: Mit Deinem Programm muss ich dann eine komplette zweite(dritte) Instanz mit einem anderen Broker anlegen (??) und das entsprechend abfragen - oder gibt es innerhalb des FB noch eine Eingriffsmöglichkeit ??

Vielen Dank Thomas

stefandreyer commented 5 years ago

Hallo Thomas,

habe es gerade selber Probiert, geht nicht, bestimmt spielen die übers WE... broker.hivemq.com funktioniert. Ja, öffentlichen Broker würde ich da auch nicht über den weg trauen. habe vor kurzem davon gehöhrt: https://www.cloudmqtt.com/ gibt da ne kostenlose Variante, ist vielleicht was für dich. Ansonnsten, ja du musst den Clienten 2 mal Aufrufen. Das ganze wird aber ein Problem, da ich dieses Broker hopping nicht vorgesehen habe. Du müsstest die Variablen alle Doppelt zuweisen... hmmm oder den MQTT_IN_OUT umschalten, je nachdem welcher Client verbunden ist. Dann weißt du aber immer noch nicht mit welchem der Arduino verbunden ist. Für mich klingt das alles sehr unsicher. Wenn dein Codesys auf nem Raspi läuft könntest du dir da einen eigenen Broker aufsetzten und ins Netz lassen(DynDns), würde auch gehen, natürlich nur verschlüsselt.

Grüße

stefandreyer commented 5 years ago

Hallo Thomas,

heut geht's wieder....

Grüße Stefan

Tommilein commented 5 years ago

Hallo Stefan, vielen Dank für den Hinweis. Ich habe noch zwei gut funktionierende Broker gefunden:

Erstes Ergebnis: Publish von Codesys geht mit 2 Brokern ( und wird wohl auch mit dreien gehen).

Ein erster Versuch mit 2 Brokern zu "subscriben" hat nur kurz funktioniert,dann geben sie den Geist auf. (mein - wahrscheinlich amatuerhafter - Glaube an unabhängige Instanzen ist damit stark erschüttert...)

Update: ich sollte mehr an die Programmierkünste Anderer glauben: Es geht mit 2 Instanzen ganz normal !! (Es lag wahrscheinlich am Tool mqtt.fx)

neues Ergebnis: MQTT_2Broker

IM Bild: Test_1 und Test_2 sind die beiden Instanzen von "SD_MQTT.TestOutOfTheBoxNoTLS" und Ergebnis_1 bzw. Ergebnis_2 sind MQTT-Telegramme eines Arduino, der abwechselnd mal über "test.mosquitto.org" und das andere Mal über "mqtt.fluux.io" sendet.

Damit ist Nachfolgendes alles hinfällig (bis jetzt): Mein Gedanke ist nun der: ich muss abwechslend die Broker abfragen. Ist was angekommen, wechsle ich danach den Broker Problem dabei ist: kommt nichts, wechsle ich auch nie den Broker, da ich mich auf das
"subscribe.Recived"-Signal berufe. Ich brauche also ein Signal, das "nichts" empfangen wurde. Kann ich in Deinen Programmen sowas finden?

Mal zur Begründung für den ganzen Aufwand: Ich teste gerade die "Haltbarkeit" eines batteriebetriebenen Arduino (Temp.Messung). Wenn der Arduino keinen MQTT-Broker findet, hat er sich "totgesendet". Die Batteriespannung ließ rapide nach, da er im Wifi-Modus massenweis Strom verbraucht. Ich kann mit meinem Test wieder von vorn beginnen). Lasse ich im Fehlerfalle die "deepsleep"-Phase genauso lange wie im Erfolgsfalle spart das Batterieleistung, aber ich bekomme (wie jetzt in den letzten Tagen mit "test.mosquitto.org") keine Informationen vom Arduino - auch nicht erhebend. Ich hoffe, das ich nun mit 2 Übertragungslinien die notwendige Redundanz geschaffen habe, das immer was ankommt.

Das Ganze ist immer noch von hinten durch die Brust: aber für jede andere Idee bin ich dankbar.

Viele Grüße Thomas

stefandreyer commented 5 years ago

Hallo Thomas,

es sollte vielleicht mit einer Instanz des Clienten gehen, du musst nur den Broker string für die Verbindung(url) wechseln und dann verbinden. Dann muss dein Arduino noch zyklisch eine lebensmeldung an eine bestimmte Topic senden, und schon kannst du den vom Arduino gewählten broker herrausfinden.

Verbinden, Lebensmeldung abwarten --> timeout, trennen, url wechseln, verbinden.

Grüße Stefan

Tommilein commented 5 years ago

Hallo Stefan, ich bleibe mal vorläufig bei 2 Instanzen. Das funktioniert hinreichend gut. Bei einer Instanz habe ich das Problem mit dem "Lebenszeichen". Der Arduino soll ja solange wie möglich im "deepsleep" bleiben. Das sind durchaus mal 10 Minuten. Da würde das Erkennen des fehlenden Brokers sehr lange dauern. Aber ich denke, das ist "Programmierphilosophie". Ich habe mit Deiner Hilfe auf jeden Fall eine Lösung gefunden.

Nun aber gehen meine Probleme weiter. Ich möchte jetzt mit TLS arbeiten. Dein Beispielprogramm hat sofort funktioniert. ABER: das kam mir etwas einfach vor. Ist da jetzt irgendwas verschlüsselt oder ist ein Passwort versteckt, oder, oder ... Kannst Du mir da noch eine paar Hinweise geben. Im Netz gibt es viele Infos, aber wie ich diese in Dein Programm integrieren kann - rätselhaft.

Vielen Dank (und ich hoffe, ich gehe Dir nicht zu sehr auf den Geist) Gruß Thomas

Zitat: Security gehört zu den wichtigsten und gleichzeitig am stärksten vernachlässigten Themen im Internet der Dinge. und: Applikationsentwickler sind nicht immer Sicherheitsexperten und sollen sich auf die Geschäftslogik ihrer IoT-Anwendung (Internet of Things) konzentrieren, sei es eine mobile App, Software oder Hardware.

.. wie war !!!!

Tommilein commented 5 years ago

Hallo Stefan, gleich nochmal hinterher: Dein Programm mit Port 8883 sendete etwas und ich konnte es mit dem Tool mqtt.fx mit Port 1883 empfangen, deshalb ging das so schnell. Nun habe ich am mqtt.fx rumgesucht und eine ganze Menge Einstellungen gefunden, die nicht so recht einfach sind: Mit_TLS Hier habe ich noch keinen Connect zum Server zustandegebracht, wenn ich den kleinen Haken bei "enable SSL/TLS" setze.

Im Internet habe ich im Zusammenhang mit TLS sowas wie _espClient.verify(mqtt_fprint, mqtt_server)_ gefunden. Wo in Deinem Programm wäre das zu konfigurieren? Ich brauche doch einen Schlüssel oder ein Schlüsselfile.

Also wie schon gesagt - Hiiilfe !!

Grüße Thomas

stefandreyer commented 5 years ago

Hallo Thomas,

willkommen in der Gruppe "Bedänkenträger IoT". Unsere Gruppe hatte dieses Jahr schon großen Zuwachs. Wir sind jetzt zu zweit!

Solltest du dir ein Sprachassitens fähiges Gerät großer IT Konzerne ins Haus stellen, wird dir die Mitgliedschaft gekündigt!

Spaß beiseite.

Schau mal hier: https://forum-de.codesys.com/viewtopic.php?f=10&t=5716 Da gings um die Entwicklung zu dem Ganzen. Du kannst den TLS Kontext selber definieren mit:

TLS_CONFIG:CommonTypesAndFunctions.TLS_CONFIG;

und übergabe mit: MQTT_IN_OUT.TLS_CONFIG := ADR(TLS_CONFIG);

Aber in Wirklichkeit verschlüssel ich nix, gebe es nur vor :D

Schau die die Kommunikation im Wireshark an da siehst du den Handshake.

Die Kommunikation wird verschlüssel, sollte ein Passwort vom Server angefordert werden ist dies Verschlüsselt. Es wird nicht geprüft ob der Server der Richtig ist, sollte jemand die DNS Kommunikation korummpieren kannst du dich mit einem falschen Server verbinden.

Server Zertifikaten können Implementiert werden, habe ich noch nicht.

MQTT FX scheint TLS V2 nicht zu unterstützen ....

Genau, ich Sende verschlüsselt. Wenn der broker dazu noch unverschlüsselt akzeptiert, dann ist es so.

Kann der Arduino TLS?

Codesys nutzt hier OpenSSL Da kannst du dir mit der Doku eine eigene Chiper List zusammen bauen.

Viel Erfolg!

Und geh mir ruhig auf den Keks, so frische ich auf und lerne dazu!

Grüße Stefan

Tommilein commented 5 years ago

Hallo Stefan, ich habe kein "sprachassistenzfähiges Gerät großer IT-Konzerne" im Haus. Wäre ja noch schöner. Ich bin mehr von der "verstehe, was Du tust"-Fraktion. Habe ich eben etwas weniger Technologie im Haus...

Zum Thema "Bedenkenträger" : Ich habe schon Mails mit Erpressungsversuchen bekommen! Ich glaube nicht, das irgendeine Viren-o.ä.-Software jemand davor bewahrt. Gestern Im TV erklärt eine ehemalige Justizministerin (Leutheuser-Schnarrenberger), das Banken das Mausklickverhalten schon mitloggen u.ä. (wahrscheinlich über die Online-Banking-Software, nicht via Virus/Trojaner). Aber es regt mich immer wieder auf, das kein Betriebssystem mal nur auf ROM abgelegt wird. Mal sehen, wie man dann angreift. Aber eine Angriffsabwehr will ja auch gar keiner wirklich.

Soviel zur Politik oder was man dafür halten soll.

Nun zu TLS und Co. Das sehe ich alles ziemlich kompliziert an. Das Verständnis klemmt bei mir vor allem, weil ich keine Beispielverbindung zustande bringe. Du hast doch bestimmt auch auf der "anderen" Seite von Codesys irgend ein Tool benutzt . Ich habe auf einem Raspberry eine mosquitto-Broker laufen. Da gibt es aber wieder die "mosquitto.conf", die jetzt eher trivial ist, weil ohne TLS. Wenn ich aber das Komplettbeispiel des conf-Files mir anschaue, bin ich so klug als wie zuvor. Soll heissen, wenn ich kein Beispiel für die ganzen Randbedingungen (Client Certificat File, Client key File, CA File usw.usw.) finde, bin ich wohl aufgeschmissen. Wenn ich auf dem Raspberry eine ssh-Verbindung zum nächsten aufbauen will, geht das automatisch. Deshalb wüßte ich nicht wie ich das händisch alles einrichten soll.

Ich glaube ich baue eine eigene Verschlüsselung (über die die NSA dann einen Lachanfall bekommt, aber die Spielmatze im Netz das knacken uninteressant finden).

Soweit bis hierher - bin bissel geknickt.

Grüße Thomas

Tommilein commented 5 years ago

PROBLEM !!!! PROBLEM !!!! PROBLEM !!!! Hallo Stefan, ich habe ein Problem, mehr als 80 Zeichen zu empfangen. Ganz typisch wäre eine Definition eines Strings ohne Länge. Im Programm kann ich aber einfach nichts finden, wo so ein zu kurzer String wäre: Ende_verschluckt_1

Irgendwo in den Variablen habe ich eine für mich komische Zahl entdeckt, ich kann sie aber nicht deuten. Ende_verschluckt_2

Kannst Du mal schauen, ob Du da nicht einen kleinen Fehler irgendwo hast, damit ich danach ohne Zweifel bei mir weitersuchen kann, wobei die Länge schon bei "ReciveSubscribePayload" fehlt - obwohl dort STRING(255) definiert ist und das mit einer Pointer-Operation gefüllt wird (??) Ende_verschluckt_3

Mir ist aufgefallen in "FUNCTION_BLOCK MQTTSubscribe EXTENDS MQTTBase" das dort definiert ist:

PayloadString:POINTER TO STRING;

Kann es sein, das dann Codesys bei der Operation

ReciveSubscribePayload := subscribe.PayloadString^;

automatisch bei 80 Zeichen aufhört ???? Könnte die Definition PayloadString:POINTER TO STRING(255) ; das Problem beheben. Ich habe nicht viel Ahnung von Pointer-Operationen (leider).

Schau doch bitte mal... Grüße Thomas

Tommilein commented 5 years ago

Update: Es scheint wirklich so zu sein, das die erwähnte Pointer-Operation nur 80 Byte rüberholt:

Ende_verschluckt_4

Jetzt wäre alles gut, wenn ich nicht den "Vogel" hätte, nun doch lieber reine Byte-Arrays zu übertragen. Denn mit Strings kann ich nun mal keine 0-Bytes senden. Da ist immer Schluß.

Is eben so... Viele Grüße Thomas

stefandreyer commented 5 years ago

Hallo Thomas,

ich kenne das Problem, habe es nur noch nicht im ListStringCallback bedacht.

Der Singel String Callback macht das mit memmove und ignoriert die String Grenzen knallhart, da gehen auch mehr wie 255 byte....

Ziehe ich noch glatt.

stefandreyer commented 5 years ago

Zu dem TLS Thema schreib ich nochmal...

stefandreyer commented 5 years ago

Hallo Thomas,

habe eine neue Version hoch geladen, sollte nun gehen.

Das mit den String Pointer ist sehr frustrierend. Wie du schon festgestellt hast, kann man auch bei den Pointern eine länge festlegen. Dann kann man mit den Pointern auch String > 255 zeichen Kopieren.

Sollte nun aber ein p1:Pointer to String(1000) auf String(80) zeigen und man kopiert nun über den Pointer einen String > 80 dann überschreibt codesys knallhart follgenden Speicher mit ungeahnten konzequenzen. Ich habs gerade Probiert, hat schön gekracht...

Also, werde ich bei den Subscriptions noch die Längen der Ziele mitgeben. Sonst wird mal ein zu langes Payload abgschickt und die Steuerung geht hops ....

Grüße Stefan

Tommilein commented 5 years ago

Hallo Stefan, glaubst gar nicht, wie stolz ich auf mich bin, daß ich mit meiner Vermutung richtig lag. Im Normalfalle bin ich nie sicher, ob irgendeine Ungereimtheit nicht die Ursache in meinen Programmzeilen hat - meistens nämlich...

Das mit TLS wäre eine schöne(wichtige) Geschichte, wenn Du sie so aufbereiten/beschreiben könntest, das der Normalsterbliche die Sache nutzen kann.

Danke für Deine Arbeit. Grüße Thomas

Tommilein commented 5 years ago

Hallo Stefan, hab wieder mal ne Frage: wie komme ich denn an die Endemitteilung beim "publish" ran. In "SD_MQTT.MQTTState" sieht es ja so aus, als gibt es ein Flag "SendDone". Wie komme ich denn an das Flag heran ?? Kann sein, das das Grundwissen von Codesys ist, aber ich weiß es nun mal nicht.

Vielen Dank Thomas

stefandreyer commented 5 years ago

Hallo Thomas,

das ist ein Ausgang am FB und kommt für genau einen Zyklus wenn das Paket vollständig abgearbeitet wurde. Dort heißt es "done"

Grüße Stefan

Tommilein commented 5 years ago

Danke !!

Grüße Thomas

Von: stefandreyer [mailto:notifications@github.com] Gesendet: Montag, 25. März 2019 17:42 An: stefandreyer/CODESYS-MQTT Cc: Tommilein; Comment Betreff: Re: [stefandreyer/CODESYS-MQTT] noTLS example does not work (#8)

Hallo Thomas,

das ist ein Ausgang am FB und kommt für genau einen Zyklus wenn das Paket vollständig abgearbeitet wurde. Dort heißt es "done"

Grüße Stefan

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/stefandreyer/CODESYS-MQTT/issues/8#issuecomment-476281474 , or mute the thread https://github.com/notifications/unsubscribe-auth/AspuVhYS6TXBnmjr3K561mRfhDF3L0xVks5vaPxBgaJpZM4YBozk . https://github.com/notifications/beacon/AspuVos7il5b4h87cJVlX6F0Zi1Ftnz3ks5vaPxBgaJpZM4YBozk.gif

Tommilein commented 5 years ago

Hallo Stefan,

habe nun endlich die neue Bibliothek runtergeladen und mit viel Mühe geupdated (ich mach das nun mal nicht jeden Tag und die Bibliotheks-Versionen sehen nach aussen hin alle gleich aus. Ehe man dann mitbekommt, das man die alte immer wieder verwendet - Katastrophe). Leider läßt sich das Beispielprogramm nicht fertigkompilieren, da ich immer den Fehler

cmperrors_32bit

Fehler: [FEHLER] cmperrors interfaces, 3.5.5.0 (system): C0338: Die Bibliothek 'cmperrors interfaces, 3.5.5.0 (system)' wird nur in 32-Bit-Applikationen unterstützt Kompilierung abgeschlossen -- 1 Fehler, 0 Warnungen

bekomme. Ich fahre Codesys 3.15 SP14 + 32bit . Wie kann ich denn das Problem ausmerzen ?? Allerdings habe ich Windows 64bit, was wohl die Ursache ist.

Als workaround kann ich mir die Umstellung auf den raspberry vorstellen. Ich kriege aber einfach das Gerät "Codesys Control for Raspberry Pi SL" nicht in das Testprogramm...

Viele Grüße Thomas

stefandreyer commented 5 years ago

Hallo Thomas,

bei mir in der Bibliothek sieht es so aus :

image

Hast du wirklich alle Bibliotheken aktuell?

Bei mir läuft Codesys V3.5 SP14 + 64 bit…

Ich glaube ich hatte auch mal ein 32 bit codesys installiert und dann damit auch Probleme(dem Codesys).

Aber für die Runtime müssten 32 und 64 bit funktionieren.

Und ich glaube mittlerweile haben nur noch sehr wenige Entwicklungs PC 32 bit Betriebssysteme.

Mach doch einfach mal ein neues Projekt, dort einen Raspi einfügen und dann den Test FB aufrufen.

Mal schauen ob das klappt.

Ich hab dich noch gar nicht auf der Sternel Seite gesehen... kannst da ja nochmal hinschauen ;)

Geb mal Rückmeldung obs geht.

Und ja, ich muss mal Bibliotheksversion erhöhen ;)

Grüße Stefan

Tommilein commented 5 years ago

Danke für die schnelle Antwort, Was ist die "Sternelseite"? Ich habe mal oben auf der Github-Seite (wo auch noch watch und fork stehen) Star angeclickt. Meinst Du das? Würde gerne noch 10 mal clicken, aber das toggelt wohl nur...

Im Bibliotheksverwalter sieht es bei mir auch so aus wie bei Dir. cmperrors_32bit_2

Allerdings wird ja "cmperrors interface" angemeckert. Im Bibliotheksverwalter sind wirklich nur alte Versionen festzustellen. Ich wüßte allerdings nicht, wie ich diese Bibliotheken einzeln updaten könnte, falls sie tatsächlich veraltet sind.

cmperrors_32bit_3

Wenn Du eine neuere Version von "cmperrors interface" bei Dir findest, sag bitte mal Bescheid, vielleicht auch mit einem Hinweis, wie man die einzelne Bibliothek findet zum updaten.

Viele Grüße Thomas

stefandreyer commented 5 years ago

Hallo Thomas,

ja, das war der Richtige Stern, Danke!

Ich glaube es ist ein Problem, das ich in dem Testprojekt eine 64 Bit Windows PLC CPU habe und du nur ein 32 Bit Codesys und damit eine 32 Bit Windows PLC CPU.

Mach mal einen rechts Klick auf HomeContrl(Codesys Control Win V3 x64) Dann Gerät aktualisieren, Dann Doppelklick auf CODESYS Control Win V3 , ohne X64!!!

Dann hast du ne 32Bit CPU, Übersetzten und testen.

Grüße Stefan

Tommilein commented 5 years ago

Böse Falle ... Bei Nutzung des Gerätes CODESYS Control Win V3 (ohne X64) kommen 3 Fehler: cmperrors_32bit_4

Beim Raspberry geschieht das Gleiche !!!

cmperrors_32bit_5

Kann es sein, das LREAL_TO... nicht mit 32 Bit geht ?? Da hätte ich ein echtes Problem !!

Denn für CODESYS Control Win V3 X64 benötige ich das Ganze nicht.

Da bin ich überfragt.

Noch eine böse Falle: neues Projekt für Raspberry angelegt und programme rüberkopiert. Nun kommen zig Fehler, daß kein "dynamischer Speicher" definiert ist. Ehe ich das raus hatte ...

Bin jetzt ratlos wegen LREAL..... Grüße Thomas

stefandreyer commented 5 years ago

Hmmm,

ich schau mal, aber erstmal soviel dazu,

auf meinem Raspi läufts, und der ist auch 32 bit.

Dürfte eigentlich kein Thema sein wenn target und Entwicklungsumgebung unterschiedlich sind, oder gleich.

Grüße

stefandreyer commented 5 years ago

Lief bei mir soweit:

image

stefandreyer commented 5 years ago

Hast du die Oscat Basic lib aus meinem Profil?

Grüße