TimeStamp := FuGetLongTime();
IF iState <> iStateOld THEN
TimeStampLastChange := TimeStamp;
iStateOld := iState;
END_IF
SSL_Options.xVerifyHost := FALSE;
SSL_Options.xVerifyPeer := FALSE;
CASE iState OF
0: // Init, wait for trigger
TimeStampLastChange := TimeStamp;
iStateOld := iState;
IF xDoIt THEN
iState := 10;
END_IF
10: // Get challenge from Fritzbox
xDoGetChallenge :=TRUE;
FbHTTPs_Get_Challenge(
sURI:= Concat3(s1:= 'https://', s2:= sIP_Adress, s3:= '/login_sid.lua'),
sUser:= ,
sPassword:= ,
sHeader:= ,
eAuthentication:= 0,
pRxBuffer:= ADR(arEmpfangChallenge),
udiRxBufferSize:= SIZEOF(arEmpfangChallenge),
tTimeout:= ,
typSSL_Options:= SSL_Options,
xTrigger:= xDoGetChallenge,
xBusy=> ,
xError=> ,
oStatus=> ,
udiRxNBytes=> );
IF NOT FbHTTPs_Get_Challenge.xBusy THEN
iState := 20;
END_IF
20: // Extract Challenge from arEmpfangChallenge
// Empfangene Daten in String wandeln
sEmpfangChellenge := Mem_to_PrintableString(pData:= ADR(arEmpfangChallenge), udiDataSize:= SIZEOF(arEmpfangChallenge));
// Startposition des Challenge finden
udiChallangeStart := StrFindLeft(sBuffer:= sEmpfangChellenge, udiSize:= SIZEOF(sEmpfangChellenge) , sProbe:= '<Challenge>', udiBegin:= 1);
// Challenge herausschneiden
sChallenge := StrExtractSub(sBuffer:= sEmpfangChellenge, udiSize:= SIZEOF(sEmpfangChellenge), udiPos:= udiChallangeStart+11, udiLength:= 8);
iState := 30;
30: // Challenge und Passwort verbinden
sChallengeUndPW := Concat3(s1:= sChallenge, s2:= '-', s3:= sPassword);
iState := 40;
40: // Challenge und Passwort nach UTF16 konvertieren
iLaengeChallengeUndPW := LEN(sChallengeUndPW);
iCharCount :=1;
FOR Loopcount := 0 TO (2 * iLaengeChallengeUndPW)-1 DO
IF Loopcount = 0 THEN
arChallengeUndPW[Loopcount] := StrExtractChar(sChallengeUndPW,(iCharCount));
iCharCount := iCharCount + 1;
xOdd := FALSE;
END_IF
IF Loopcount > 0 THEN
IF xOdd THEN
arChallengeUndPW[Loopcount] := StrExtractChar(sChallengeUndPW,(iCharCount));
iCharCount := iCharCount + 1;
xOdd := FALSE;
ELSE
arChallengeUndPW[Loopcount] := 0;
xOdd := TRUE;
END_IF
END_IF
END_FOR
iState := 50;
xDoMD5 := FALSE;
50: // MD5 Hash berechnen
MD5_0(
xExecute:= xDoMD5,
pMemoryBlock:= ADR(arChallengeUndPW),
udiNumberOfBytes:= (2 * iLaengeChallengeUndPW),
xDone=> ,
xBusy=> ,
abyDigest=> arResponse);
IF MD5_0.xDone THEN
iState := 60;
END_IF
xDoMD5 := TRUE; // Wegen Flankenwechsel
60: // Response in HEX wandeln
FOR Loopcount := 0 TO 15 DO
arHexString[Loopcount] := Byte_to_Hexstring(arResponse[Loopcount]);
END_FOR
sResponse_AS_HEX:=Concat9(
s1:= arHexString[0],
s2:= arHexString[1],
s3:= arHexString[2],
s4:= arHexString[3],
s5:= arHexString[4],
s6:= arHexString[5],
s7:= arHexString[6],
s8:= arHexString[7],
s9:= arHexString[8]);
sResponse_AS_HEX:=Concat8(
s1:= sResponse_AS_HEX,
s2:= arHexString[9],
s3:= arHexString[10],
s4:= arHexString[11],
s5:= arHexString[12],
s6:= arHexString[13],
s7:= arHexString[14],
s8:= arHexString[15]);
iState := 70;
70: // URL für Login zusammenstellen
sLoginURL := Concat6( s1:= 'https://',
s2:= sIP_Adress,
s3:= '/login_sid.lua?username=&response=',
s4:= sChallenge,
s5:= '-',
s6:= sResponse_AS_HEX);
iState := 80;
80: // SID erfragen
xDoGetSID :=TRUE;
FbHTTPs_Get_SID(
sURI:= sLoginURL,
sUser:= ,
sPassword:= ,
sHeader:= ,
eAuthentication:= 0,
pRxBuffer:= ADR(arEmpfangSID),
udiRxBufferSize:= SIZEOF(arEmpfangSID),
tTimeout:= ,
typSSL_Options:= SSL_Options,
xTrigger:= xDoGetSID,
xBusy=> ,
xError=> ,
oStatus=> ,
udiRxNBytes=> );
IF NOT FbHTTPs_Get_SID.xBusy THEN
iState := 90;
END_IF
90: // Extract SID from arEmpfangSID
// Empfangene Daten in String wandeln
sEmpfangSID := Mem_to_PrintableString(pData:= ADR(arEmpfangSID), udiDataSize:= SIZEOF(arEmpfangSID));
// Startposition des SID finden
udiSIDStart := StrFindLeft(sBuffer:= sEmpfangSID, udiSize:= SIZEOF(sEmpfangSID) , sProbe:= '<SID>', udiBegin:= 1);
// SID herausschneiden
sSID := StrExtractSub(sBuffer:= sEmpfangSID, udiSize:= SIZEOF(sEmpfangSID), udiPos:= udiSIDStart+5, udiLength:= 16);
iState := 100;
100: // SID auf Ausgang schreiben
SID := sSID;
iState := 200;
sURL_Rumpf := CONCAT6(s1:= 'https://', s2:= sIP_Adress, s3:= '/webservices/homeautoswitch.lua', s4:= '?sid=', s5:= sSID, s6:= '&switchcmd=');
200: // Beenden oder Verbindung halten
IF NOT xDoIt THEN
iState := 0;
END_IF
IF TimeStamp > TimeStampLastChange + LTIME#3M THEN
iState := 201;
END_IF
201: // Send KeepAlive Request (Geräteliste holen)
xDoGetGeraeteliste :=TRUE;
sGeraeteURL := Concat6(
s1:= 'https://',
s2:= sIP_Adress,
s3:= '/webservices/homeautoswitch.lua',
s4:= '?sid=',
s5:= sSID,
s6:= '&switchcmd=getswitchlist');
FbHTTPs_Get_Geraeteliste(
sURI:= sGeraeteURL,
sUser:= ,
sPassword:= ,
sHeader:= ,
eAuthentication:= 0,
pRxBuffer:= ADR(arEmpfangGeraeteliste),
udiRxBufferSize:= SIZEOF(arEmpfangGeraeteliste),
tTimeout:= ,
typSSL_Options:= SSL_Options,
xTrigger:= xDoGetGeraeteliste,
xBusy=> ,
xError=> ,
oStatus=> ,
udiRxNBytes=> );
IF NOT FbHTTPs_Get_Geraeteliste.xBusy THEN
iState := 200;
// Empfangene Daten in String wandeln
sGeraeteliste := Mem_to_PrintableString(pData:= ADR(arEmpfangGeraeteliste), udiDataSize:= SIZEOF(arEmpfangGeraeteliste));
END_IF
ELSE
iState := 0;
END_CASE