AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Maschinesteuern mit TNetHttpClient
Thema durchsuchen
Ansicht
Themen-Optionen

Maschinesteuern mit TNetHttpClient

Ein Thema von WunniKunz · begonnen am 28. Feb 2024 · letzter Beitrag vom 15. Apr 2024
Antwort Antwort
Seite 1 von 2  1 2      
WunniKunz

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

Maschinesteuern mit TNetHttpClient

  Alt 28. Feb 2024, 13: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 18:23 Uhr)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Maschinesteuern mit TNetHttpClient

  Alt 29. Feb 2024, 06:42
Guten Morgen,

der Abfragestring "Http://IPAdresseort/getKey?k=Hka_Mw1.usDrehzahl&_rnd=9619" schaut doch sehr noch einer Restanfrage aus.
Du könntest es dann mit dem TRestClient, TRestRequest und TRestResponse versuchen.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Maschinesteuern mit TNetHttpClient

  Alt 29. Feb 2024, 06:55
Wieso wird AHeaders1 als Adresse übergeben?
Der Parameter ist doch bereits als const TNetHeaders deklariert?

Abgesehen davon würde eine Adresse ohne Typ im 3.Parameter AEncoding übergeben werden.

Geändert von Blup (29. Feb 2024 um 07:00 Uhr)
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
629 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Maschinesteuern mit TNetHttpClient

  Alt 1. Mär 2024, 18:15
Die URL müsste so sein:
Http://IPAdresse : Port/getKey (ohne Leerschläge)

"Stromf_Ew.Anforderung_GLT.bAktiv=1" gehört in eine Stringlist die mit dem 2. Parameter bei TNetHttpClient.Post übergeben wird. So müsste es eigentlich gehen.
  Mit Zitat antworten Zitat
WunniKunz

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

AW: Maschinesteuern mit TNetHttpClient

  Alt 2. Mär 2024, 08:33
Danke Euch für eure Bemühungen. Ich weiß jetzt nicht, wie ich Euch einzeln ansprechen kann. Ich mache es eben pauschal.

Hallo Klaus, danke für den Tip mit TRestClient. Ich werde es nächste Woche ausprobieren.

Hallo Blub, AHeaders1 ohne @ führt zu Compilerfehler "Es gibt keine überladene Version von Post, die man mit diesen Parametern aufrufen kann"

Hallo Rolf, Probiert habe ich einmal Stingliste[0] := "Stromf_Ew.Anforderung_GLT.bAktiv": Antwort OK, keine Befehlsausdührung.
Stingliste[0] := "Stromf_Ew.Anforderung_GLT.bAktiv=1" und
Stingliste[0] := "Stromf_Ew.Anforderung_GLT.bAktiv'; Stingliste[1] := "1". Antwort keine, TimeOut.
jeweils URLort/SetKeys
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
629 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Maschinesteuern mit TNetHttpClient

  Alt 3. Mär 2024, 17:34
1. Nutze THttpClient aus System.Net.HttpClient.pas
2. Wie folgt sollte das damit ohne Probleme laufen:

Delphi-Quellcode:
uses
  System.Net.HttpClient;
...
var
  http: THTTPClient;
  PostData: TStringList;
  s: String;
begin
  http := THTTPClient.Create;
  PostData:= TStringList.Create;
  try
    PostData.Text := 'Stromf_Ew.Anforderung_GLT.bAktiv=1';
    s := http.Post('Http://deinserver: port/getKey', PostData).ContentAsString; // ohne Leerschlag
    Memo1.Lines.Text := s;
  finally
    PostData.Free;
    http.Free;
  end;
end;
Wenn das nicht geht, müsstest du mal die Doku zu deiner Maschinensteuerung genauer studieren. Womöglich braucht es da noch eine Authentifizierung oder sowas.

Geändert von Rolf Frei ( 3. Mär 2024 um 17:37 Uhr)
  Mit Zitat antworten Zitat
WunniKunz

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

AW: Maschinesteuern mit TNetHttpClient

  Alt 5. Mär 2024, 12:59
Danke Dir Rolf Frei,
ich werde das ausprobieren, wenn ich wieder zu Hause bin. Im Moment bin ich im Krankenhaus, Notfall, Sorry
  Mit Zitat antworten Zitat
WunniKunz

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

AW: Maschinesteuern mit TNetHttpClient

  Alt 21. Mär 2024, 14:15
21.03.24

Lieber Rolf Frei,

Ich bin wieder zurück, wenisgsten halbwegs.
Ich möchte Dir danken für Deine Mühe. Dein Code hat nur halbwegs funktioniert. Er sendet den String ohne „=1“ einwandfrei und läuft dabei auch über die Authentifizierungsprocedur. Mit „=1“ gibt es einen Timeout und die Authentifizierungsprocedur wird auch nicht angefahren.
Es sieht so aus, als ob die „=1“ anders behandelt werden muß.

Die Dokumentation sagt:
Daten senden
Für das Senden von Anlagendaten wird die HTTP POST Methode verwendet. Hierbei werden die Parameter nicht über die URL übergeben sondern sind im Body der Nachricht enthalten.

Der URL wird hierfür der Befehl /setKeys angehängt. Die Daten sind wie folgt aufgebaut: GewünschterKey=Wert
Beispiel – Stromanforderung senden
URL: http://IP Adresse:8080/setKeys

Daten: Stromf_Ew.Anforderung_GLT.bAktiv=1

Die erfolgreiche Antwort vom Webserver lautet:

Stromf_Ew.Anforderung_GLT.bAktiv ok

Bei einer einfachen html-Testseite die funktioniert sieht der Body so aus:

<body>

<p>Dachs-Ansteuerung</p>

<form action="http://192.168.178.25:8080/setKeys" method="post">

Strom Anforderung GLT:

<input type="text" name="Stromf_Ew.Anforderung_GLT.bAktiv" Value=1><br>

<br>

<input type="submit" value="Absenden"><br>

</form>

</body>
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
629 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Maschinesteuern mit TNetHttpClient

  Alt 21. Mär 2024, 15:36
Mein Beispielcode vom letzen Post geht bei mir 100% korrekt und entspricht genau dem, was deine funktionierende HTML Form macht. Auf meinem Test Webserver bekomme ich das HTTP Feld "Stromf_Ew.Anforderung_GLT.bAktiv" und der Wert "1", wie erwartet als POST Daten. Kann es eventuell sein, dass die Maschine dann eine SSL/TLS Verbindung herzustellen verucht oder sowas, das dann nicht geht? Hast du schon mal im Browser den Entwicklermodus aktiv gehabt (Beim Firefox F12 / Netzwerkanalyse, Chrome ist ähnlich) und geschaut was da genau beim Absenden des Formulars passiert?

EDIT:
Mir ist eben noch aufgefallen, dass die Doku von /setKeys redet und ich in meinem Beispielcode /getKey verwende. Das ist dann natürlich falsch. Korrekt wäre es dann so:
Delphi-Quellcode:
uses
  System.Net.HttpClient;
...
var
  http: THTTPClient;
  PostData: TStringList;
  s: String;
begin
  http := THTTPClient.Create;
  PostData:= TStringList.Create;
  try
    PostData.Text := 'Stromf_Ew.Anforderung_GLT.bAktiv=1';
    s := http.Post('Http://192.168.178.25:8080/setKeys', PostData).ContentAsString; // ohne Leerschlag
    Memo1.Lines.Text := s;
  finally
    PostData.Free;
    http.Free;
  end;
end;

Geändert von Rolf Frei (21. Mär 2024 um 15:47 Uhr)
  Mit Zitat antworten Zitat
WunniKunz

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

AW: Maschinesteuern mit TNetHttpClient

  Alt 10. Apr 2024, 10:24
Lieber Rolf Frei,
leider komme ich erst jetzt dazu zu antworten.
Dein Code ist in Ordnung. Leider führt er nicht zum Ergebnis. Wie früher führt die Anforderung 'Stromf_Ew.Anforderung_GLT.bAktiv=1' zu einem Timeout.
Ich habe die gesendeten Daten aufgezeichnet mit einem Echoserver, der auf einem anderen Server installiert war. Die gesendeten Daten waren im wesentlichen gleich wie mit der HTML-Seite. Trotzdem wird mit der HTML-Seite die Stromanforderung ausgeführt, mit der Delphi-Anforderung nicht.
Irgendwas muß noch anders sein. Ich habe schon dem Hersteller geschrieben, aber noch keine Antwort bekommen.
Wahrscheinlich muß man den Datenverkehr mit einem TSP/IP Monitor/Sniffer analysieren um den Grund zu finden, warum das eine funktionier, das andere nicht.

Gruß WunniKunz
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz