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