Get
- Der Funktionsbaustein wird gestartet, indem die Variable bGetAWSSigV4 im Hauptprogramm auf TRUE gesetzt wird.
- Die steigende Flanke wird dann verwendet, um eine GET-Anfrage mit dem Funktionsbaustein IotHttpRequest zu senden.
- Nachdem die Anfrage abgeschlossen ist, wird die Fehlerbehandlung durchlaufen. Wenn weder der Funktionsbaustein selbst noch der HTTP-Statuscode einen Fehler aufweisen, kann die XML-Antwort vom Webserver im SPS-Programm geparst werden (Die Antwort der AWS-REST API kann ziemlich lang werden, deshalb reservieren Sie genug Speicherplatz und probieren Sie es ggf. vorher mit einem HTTP-Testclient aus).
Alphabetische Sortierung notwendig Die Request-URL muss ebenso wie der signierte Header alphabetisch sortiert werden. Bei dem signierten Header übernimmt dies der IoT-Treiber, bei der Request-URL muss der Be-nutzer selbst darauf achten, ansonsten kommt eine Fehlermeldung vom HTTP-Server. |
FUNCTION_BLOCK FB_TestHTTP_Get_AWSSigV4
VAR_INPUT
bSend : BOOL;
END_VAR
VAR_IN_OUT
fbClient : FB_IotHttpClient;
END_VAR
VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
END_VAR
VAR
fbRequest : FB_IotHttpRequest;
fbSig4Header : FB_IotHttpAwsSigV4HeaderFieldMap;
nState : UDINT;
RisingEdge : R_TRIG;
bGetContentResult : BOOL;
sContent : STRING(5000);
bGetJsonResult : BOOL;
sResultValue : STRING;
nReqCount : UDINT;
nResCount : UDINT;
nValidResCount : UDINT;
nErrCount : UDINT;
sRequestUrl : STRING(500):='?Action=RunInstances&ImageId=ami-0229f7666f517b31e&InstanceType=t2.small&KeyName=TestKDB&MaxCount=1&MinCount=1&Version=2016-11-15';
//sRequestUrl : STRING(500):='?Action=DescribeInstances&Version=2016-11-15';
sService : STRING:='ec2';
sRegion : STRING:='us-east-1';
sAccessKey : STRING:='censored';
sSecretKey : STRING:='censored';
sSignedHeaders : STRING:='host;x-amz-date';
bSetParameter : BOOL;
END_VAR
RisingEdge(CLK:= bSend );
CASE nState OF
0:
IF RisingEdge.Q THEN
bSetParameter:=fbSig4Header.SetParameter(sService, sRegion, sAccessKey, sSecretKey, sSignedHeaders);
IF fbRequest.SendRequest(sUri:=sConMessage, fbClient:=fbClient, eRequestType:=ETcIotHttpRequestType.HTTP_Get, 0, 0, fbHeader:=fbSig4Header) THEN
nState:= 1;
nReqCount:= nReqCount+1;
bBusy:= TRUE;
bError:= FALSE;
END_IF
bSetParameter:=FALSE;
END_IF
1:
IF NOT fbRequest.bBusy THEN
bError:= TRUE;
IF NOT fbRequest.bError THEN
bGetContentResult:= fbRequest.GetContent(pContent:= ADR(sContent), nContentSize:= SIZEOF(sContent), bSetNullTermination:= TRUE);
IF fbRequest.nStatusCode >= 200 AND fbRequest.nStatusCode < 300 THEN
nResCount:= nResCount+1;
// do something with the XML response
bError:=FALSE;
END_IF
END_IF
nState:= 0;
bBusy:= FALSE;
IF bError THEN
nErrCount:= nErrCount+1;
END_IF
END_IF
END_CASE