Twincat MQTT und AWS für IoT Anbindung

vetje

Level-2
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, bin neu hier.

Ich versuche gerade verzweifelt auf einer Beckhoff CX das TF6701 IotMqttSampleAwsIoT


mit einem Thing im IoT Core von Amazon zum laufen zu kriegen.
Hat das schon mal jemand gemacht und kann mir helfen?
Ich kriege schon die Verbindung zum Broker nicht aufgebaut....

Bin über jegliche Hilfe dankbar!

VG
Vetje
 
Huhu,

kannst du vielleicht mal deinen Code für die Verbindung zum Broker posten.
Und vielleicht noch die Information welchen Broker du verwendest ;)

Viele Grüße

P.S. in der Doku habe ich gerade folgendes entdeckt:
Since this sample is essentially based on the sample IotMqttSampleUsingQueue[} 106], only the parts that are relevant for establishing a connection to AWS IoT are explained in thissection

Vielleicht hilft dir das schon weiter?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi, hier ist die Deklaration:

PROGRAM PrgMqttCom
VAR
fbMqttClient : FB_IotMqttClient;
bSetParameter : BOOL := TRUE;
bConnect : BOOL := TRUE;

(* published message *)
sTopicPub : STRING(255) := 'things/CX-12345';
sPayloadPub : STRING(255);
i: UDINT;
fbTimer : TON := (PT:=T#1S);

(* topic subscribtion *)
bSubscribed : BOOL;
sTopicSub : STRING(255) := 'things/CX-12345';

(* received message *)
{attribute 'TcEncoding':='UTF-8'}
sTopicRcv : STRING(255);
{attribute 'TcEncoding':='UTF-8'}
sPayloadRcv : STRING(255);

fbMessageQueue : FB_IotMqttMessageQueue;
fbMessage : FB_IotMqttMessage;

hrErrorOccurred : HRESULT; // contains the latest occurred error
END_VAR

Und hier der Programmteil:

IF bSetParameter THEN
bSetParameter := FALSE;

(* TLS settings for AWS IoT connection *)
fbMqttClient.stTLS.sCA := '\Hard Disk\TwinCAT\3.1\Certs\rootCA.pem';
fbMqttClient.stTLS.sCert := '\Hard Disk\TwinCAT\3.1\Certs\ba395e7329-certificate.pem.crt';
fbMqttClient.stTLS.sKeyFile := '\Hard Disk\TwinCAT\3.1\Certs\ba395e7329-private.pem.key';

(* Broker settings für AWS IoT *)
fbMqttClient.sHostName:= 'c39tt43ah5cfor-ats.iot.eu-central-1.amazonaws.com';
fbMqttClient.nHostPort:= 8883;
fbMqttClient.sClientId:= 'CX-12345';
fbMqttClient.sTopicPrefix:= '';

fbMqttClient.ipMessageQueue := fbMessageQueue;
END_IF

fbMqttClient.Execute(bConnect);
IF fbMqttClient.bError THEN
// add your error logging here
hrErrorOccurred := fbMqttClient.hrErrorCode;
END_IF
IF fbMessageQueue.nQueuedMessages > 0 THEN
IF fbMessageQueue.Dequeue(fbMessage:=fbMessage) THEN
fbMessage.GetTopic(pTopic:=ADR(sTopicRcv), nTopicSize:=SIZEOF(sTopicRcv) );
fbMessage.GetPayload(pPayload:=ADR(sPayloadRcv), nPayloadSize:=SIZEOF(sPayloadRcv), bSetNullTermination:=FALSE);
END_IF
END_IF

IF fbMqttClient.bConnected THEN
IF NOT bSubscribed THEN
bSubscribed := fbMqttClient.Subscribe(sTopic:=sTopicSub, eQoS:=TcIotMqttQos.AtMostOnceDelivery);
IF fbMqttClient.bError THEN
// add your error logging here
hrErrorOccurred := fbMqttClient.hrErrorCode;
END_IF
END_IF
fbTimer(IN:=TRUE);
IF fbTimer.Q THEN // publish new payload every second
fbTimer(IN:=FALSE);
i := i + 1;
sPayloadPub := CONCAT('MyMessage', TO_STRING(i));
fbMqttClient.Publish( sTopic:= sTopicPub,
pPayload:= ADR(sPayloadPub), nPayloadSize:= LEN2(ADR(sPayloadPub)),
eQoS:= TcIotMqttQos.AtMostOnceDelivery, bRetain:= FALSE, bQueue:= FALSE );
IF fbMqttClient.bError THEN
// add your error logging here
hrErrorOccurred := fbMqttClient.hrErrorCode;
END_IF
END_IF
END_IF

Habe die Zertifizierungsschlüssel auf die CX kopiert.
Bin mir nicht sicher, ob ich den Pfad so richtig angegeben habe: mit \Hard Disk\... oder nur Hard Disk\...
Habe beide Varianten ausprobiert.
Auch den im Original verwendeten Pfad habe ich ausprobiert: c:\TwinCAT\3.1\Config\Certificates\...
und Kopien der Zertifizierungsschlüssel dort gespeichert.

Funktioniert leider alles nicht...

Zu deinem Hinweis:
Ich denke, dass das Beispiel von Beckhoff ein komplett lauffähiges Programm ist und daher nur die AWS Parameter richtig eingestellt werden müssen...

Vielen Dank für deine Hilfe!
Vetje
 
Hallo Vetje,

folgende Dinge musst du sicherstellen, um das TF6701 (oder allgemein jeden anderen MQTT Client auch) mit AWS IoT zu connecten:

- Zertifikate müssen angelegt und enabled sein (z.B. die one-click Zertifikate vom AWS IoT)
- Zertifikate müssen mit einer IoT Policy verknüpft sein (der Einfachheit halber sollte die Policy erstmal alles erlauben)
- Zertifikate müssen auf die Steuerung gelegt werden (auch das Root CA Cert vom AWS IoT !)
- Pfad zu den Zertifikaten muss am FB angegeben werden (fbMqttClient.stTLS)

Mehr Infos zu den Policies siehe hier:

https://docs.aws.amazon.com/iot/latest/developerguide/iot-policies.html

Ich denke, dass du diesen Schritt vergessen hast, weil du ihn oben nicht explizit erwähnt hattest. :)

Gruss, Yoda
 
Ich denke, dass das Beispiel von Beckhoff ein komplett lauffähiges Programm ist und daher nur die AWS Parameter richtig eingestellt werden müssen...

Vetje

Nachtrag: Korrekt, es müssen nur die Pfade zu den Zertifikaten angepasst werden. Der Rest der Konfiguration geschieht auf AWS IoT (Thing, Certs, Policies, etc., siehe oben).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo nochmal,

ich krieg's einfach nicht hin.
Ich glaube nicht, dass es an den AWS liegt.
Habe das IotMqttSampleUsingQueue Beispiel verwendet, um den CX zum mosquitto Testbroker zu verbinden.
Auch hier scheitert es schon an dem verbindungsaufbau.
Vom PC aus klappt der Aufbau problemlos mittels MQQT.fx.
Dieselbeln Einstellung habe ich nach Twincat übernommen und es funtioniert nicht....
Muss ich am CX noch irgenetwas einstellen?
In der Beckhoff Hilfe steht:
"Ein Client-Funktionsbaustein ist für die Verbindung zu genau einem Broker zuständig. Um die Hintergrundkommunikation zu diesem Broker zu gewährleisten und Nachrichten empfangen zu können, muss die Methode Execute() des Funktionsbausteins zyklisch aufgerufen werden."
Dies habe ich im Beispiel überprüft und es sollte alles richtig sein (siehe Anhang).
Habt ihr noch ne Idee?

Danke, Vetje
 

Anhänge

  • Anhang.jpg
    Anhang.jpg
    338,2 KB · Aufrufe: 22
Ok, also wenn es auch beim Verbindungsaufbau mit einem im lokalen Netzwerk laufenden Broker nicht läuft: Hast du eventuell auf dem CX die Windows Defender Firewall aktiviert, welche ausgehend den MQTT Port blockiert ?

Allgemein läuft der MQTT Treiber im TwinCAT ohne Probleme, gerade nochmal auf dem aktuellen 4022.27 mit meinem AWS IoT Account getestet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe eine CX-5130 mit MS Windows Embedded Compact V7 (Win CE7)....

Verrückte Welt: jetzt habe ich im Code die Broker Adresse von "test.mosquitto.org" in "37.187.106.16" geändert und schon klapt die Verbindung zum Broker !!!

Was ist da falsch?

Vermutlich liegt der fehlende Verbindungsaufbau zu AWS auch daran....

VG Vetje
 
Zuletzt bearbeitet:
Hallo alle,

so, jetzt läuft es!
Zwei Dinge, die ich falsch gemacht habe:
1) das Zertifikat rootCA.pem darf nicht verwendet werden, es muss stattdessen das AmazonRootCA1.pem verwendet werden
2) Wir haben seit kurzem auf Deutsche Glasfaser umgestellt. Ich musste an der Fritzbox, die hinter dem Glasfaser NT hängt noch IPv6 aktivieren. Damit kann dann der Broker per Domain erreicht werden.

VG
Vetje

Bei Fragen, einfach melden. Habe jetzt 2 Programme auf der CX zum laufen bekommen, die zu externen Brokern verbinden (mosquitto und AWS) und einfache Daten austauschen.
 
Hallo

Ich habe deine perfekter problembeschrieb/lösung durchgelesen und würde gerne die 2 Test Programme von dir zum testen haben, um gleiches Fehlanwendungen meinerseits zu verhindern. waäre das noch möglich nach 3 jahren?

Vielen Dank
Francis
 
Zurück
Oben