Get

  1. Der Funktionsbaustein wird gestartet, indem die Variable bGetAWSSigV4 im Hauptprogramm auf TRUE gesetzt wird.
  2. Die steigende Flanke wird dann verwendet, um eine GET-Anfrage mit dem Funktionsbaustein IotHttpRequest zu senden.
  3. 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).
Get 1:

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