Einzelnen Beitrag anzeigen

WunniKunz

Registriert seit: 13. Feb 2024
8 Beiträge
 
#1

Maschinesteuern mit TNetHttpClient

  Alt 28. Feb 2024, 14:19
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]

Geändert von TBx (28. Feb 2024 um 19:23 Uhr)
  Mit Zitat antworten Zitat