Problembeschreibung Delphi-HKA-Steuerung. 26.02.24
WK
Aufgabe: Ein Blockheizkraftwerk soll mittels eines Delphi-Programms gesteuert werden.
Erforderlich beim Zugriff ist eine Authentifizierung, bestehend aus Benutzername und Passwort.
Das Auslesen von Betriebswerten geschieht, in dem ein Anforderungsstring gesendet wird in der Form
Http://IPAdresse:Port/getKey?k=Hka_Mw1.usDrehzahl&_rnd=9619;
Ein Steuerbefehl muß mit „Post“ ausgeführt werden und hat die Form
Http://IPAdresse:Port/SetKeys
mit den Daten: Stromf_Ew.Anforderung_GLT.bAktiv=1
Mit einer Htm-Seite können beide Befehle erfolgreich ausgeführt werden, wobei der Anforderungstring darin ist
<input type="text" name="Stromf_Ew.Anforderung_GLT.bAktiv" value="1"><br>
Lösungsversuch:
1. Sockets, scheiden nach meinem Kenntnisstand aus, da kein Authentifizierungs-Methode zur Verfügung steht.
2. mit NetHttpRequest und NetHttpClient.
2.1 Datenabfrage funktioniert.
2.2 Senden eines Steuerbefehls funktioniert bisher nicht.
Das Sendeteil hat entsprechend DocWicki die Form:
function Post(const AURL: string; const ASource: TStrings; const AResponseContent: TStream = nil; const AEncoding: TEncoding = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; overload;
Dies habe ich programmiert und dabei als ersten Versuch nur AURL und ASource verwendet, mit ASource: SetKeys&Stromf_Ew.Anforderung_GLT.bAktiv=1
Die Verwendung von „Overload“ am Ende der Funktion führt zu einem Compilerfehler.
Dies erzeugt keinen Compilerfehler und keinen Laufzeitfehler, aber ein TimeOut, der Server antwortet nicht.
Läßt man da „=1“ am Ende des Befehls weg Antwortet der Server mit „OK“ führt den Befehl aber nicht aus.
Im zweiten Versuch habe ich zusätzlich AHeaders verwendet, da damit der BefehlsString und der Wert „ =1 “ getrennt werden kann.
Dies ergibt keinen Compilerfehler, aber eine Zugriffsverletzung
Den verwendeten Code gebe ich hier wieder. Man kann entweder nur Stringliste oder zusätzlich AHeaders verwenden.
Kann mir eventuell jemand weiterhelfen? Geht dies überhaupt mit NetHttp…?
Delphi-Quellcode:
//StromAnfStr1 = 'Stromf_Ew.Anforderung_GLT.bAktiv';
(*** Daten holen, bearbeiten und anzeigen *************************************)
procedure THKA02Form.AnfSenden(Sender: TObject);
VAR Antwort : IHTTPResponse;
URL :
String;
AHeaders1: TNetHeaders;
ValuePair : TNAmeValuePair;
AnfString : TStringList;
begin
if HKAStromAnf
then begin
(*
URL := 'Http://'+URLHKA+':'+PortHKA+'/Setkeys';
AnfString := TStringList.Create;
AnfString.Add('/'+StromAnfStr1);
AnfString.Add('=1');
try
Antwort := NetHttpRequest1.post(URL,AnfString);
Antwort := Antwort;
*)
URL := '
Http://'+URLHKA+'
:'+PortHKA;
ValuePair := TNameValuePair.Create(StromAnfStr1,'
1');
AHeaders1 := TNetHeaders.Create(ValuePair);
AHeaders1 := AHeaders1;
AnfString := TStringList.Create;
AnfString.Add('
/SetKeys');
//&'+StromAnfStr1
try
Antwort := NetHttpRequest1.post(
URL,AnfString,@AHeaders1);
// Antwort := NetHttpRequest1.post(URL,AnfString);
Antwort := Antwort;
(**)
finally
AnfString.Free;
end;
end else begin
SendeStr := '
Http://'+ URLHKA + '
:' + PortHKA + '
/' + AnforderungStr;
NetHTTPRequest1.GET(SendeStr);
end;
end;
[EDIT SAGT]
Demo Urls "entschärft", Code-Tags gesetzt
MfG Christian Seehase
[/EDIT SAGT]