FAQ EPC Cpp
Aus Gude- Analog- und Digitalsysteme GmbH
Inhaltsverzeichnis |
HTTP-GET-Request senden
Um den EPC Schaltkomandos in ein eigenes Programm einzubinden haben Sie folgende Möglichkeiten:
- Per system call einen wget Prozess starten, und als Rückgabe die Ausgabe von wget (eine HTML Seite) analysieren
- wget selbst ist eine OpenSource (GPL) Implementierung in C
- wget ist unter allen Linux Deviraten und als Win32 Binary wget.exe bzw. wgetwin-1_5_3_1-binary.zip verfügbar
- http://www.gnu.org/software/wget/
- Selbst einen HTTP-GET-Request auf das Ethernet legen (am besten mit Hilfe eines Object Frameworks Ihrer Wahl) und die HTTP-Antwort des Servers (hier: der EPC) analysieren
In beiden Fällen ist das Ergebnis ein HTTP-GET-Request, und die Rückgabe eine vom EPC per HTTP versendete HTML Seite (z.B. ov.html).
Da HTTP ein überaus offenes und weit verbreitetes Standardprotokoll ist, werden Sie genügend Informationen und Implementierungen eines HTTP-GET-Requests im Internet finden.
HTTP Dokumentationen (Bsp):
HTTP Implementierungen (Bsp):
Zum Schalten des EPC Sie brauchen nun noch:
- eine Liste der CGI Parameter
- Verfahren zur Auswertung der Rückgabe
HTTP Antwort des EPC analysieren
Verwenden Sie zum Senden des Schaltkommandos die URL der EPC-Übersicht (ov.html), so bekommen Sie als Antwort die HTML Datei ov.html mit folgenden Inhalt im HTML Header gesendet
- Bsp: Port 1 soll eingeschaltet werden:
- ein HTTP-GET-Request fragt 'ov.html?cmd=1&p=1&s=1
- EPC Antwortet mit HTTP Error Code 200 (OK), und sendet die HTML Seite ov.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta http-equiv="cache-control" content="no-cache"> <link rel="stylesheet" type="text/css" href="style.css"> <link rel="icon" href="favicon.ico" type="image/x-icon"> <meta http-equiv="powerstate" content="Power Port 1,1"> <meta http-equiv="powerstate" content="Power Port 2,1"> <meta http-equiv="powerstate" content="Power Port 3,1"> <meta http-equiv="powerstate" content="Power Port 4,1"> <meta http-equiv="powerstate" content="Power Port 5,0"> <meta http-equiv="powerstate" content="Power Port 6,0"> <meta http-equiv="powerstate" content="Power Port 7,0"> <meta http-equiv="powerstate" content="Power Port 8,0"> <title>Expert Power Control NET 8x - EPC </title> </head> <body> [...] </body>
Bitte beachten Sie hier die meta-Informationen im HTML-Header:
<meta http-equiv="powerstate" content="Power Port 1,1">
Hieraus entnehmen Sie dass der erste Powerport den Namen 'Power Port 1' trägt, und gerade eingeschaltet ist. Steht hinter dem Komma eine 0, ist er ausgeschaltet.
HTTP Error Codes
| Code | ||
| 200 | OK | Der HTTP-GET-Request wird erfolgreich beantwortet |
| 404 | Not Found | Die angefragte Ressource ist nicht verfügbar |
| 401 | Unaurhorized | Im EPC ist 'HTTP Athentification' eingeschaltet, aber im HTTP-GET-Request fehlt der sog. Authentication-Header oder der darin codierte Benutzername bzw. das Password ist falsch |
Authentication Header im HTTP-GET-Request
- Der EPC erwartet den Athentication Header als Option innerhalb des HTTP-GET-Requests
- Diese sog. Credentials müssen nach dem sogenannten Authentication Type 'Basic' im HTTP-GET-Request mitgesendet werden werden (Base64 / Mime)
- Ein Beispiel solcher Credentials finden sie in den Wikipedia:HTTP Erläuterungen
Beispiel in Delphi / Indy
- Das folgende Beispiel demonstriert die Verwendung der Indy HTTP Implementierung
- Der Quelltext (Unit1.pas) und das Win32 Kompilat (Project1.exe) stehen zum Download bereit
- als Compiler wurde das frei verfügbare Turbo Delphi 2006 verwendet, siehe www.turboexplorer.com bzw. www.delphipraxis.net
function TForm1.send_request(url: string) : boolean; var html : string; IdHTTP1 : TIdHTTP; begin // prepare GUI widgets Memo1.Lines.Clear; Edit4.text := url; IdHTTP1 := TIdHTTP.Create(Form1); // prepare Athentification Header IdHTTP1.Request.Username := Edit2.text; IdHTTP1.Request.Password := Edit3.text; IdHTTP1.Request.BasicAuthentication := true; // Send HTTP-GET-Request html := IdHTTP1.Get(url); // post reply to GUI widgets Memo1.Lines.Add(html); Edit5.Text := IdHTTP1.ResponseText; // return True on HTTP 200 (OK) send_request := (IdHTTP1.ResponseCode = 200); IdHTTP1.Destroy; end;
procedure TForm1.Button1Click(Sender: TObject); var url : string; I : integer; meta : string; portname : string; portstate : string; begin url := 'http://' + Edit1.Text + '/ov.html'; if (ComboBox1.ItemIndex > 0) and (ComboBox2.ItemIndex > 0) then url := url + '?' + 'cmd=1&p='+IntToStr(ComboBox1.ItemIndex) + '&s='+inttostr(ComboBox2.Itemindex - 1); // send HTTP-GET Request, and parse the HTML Respons if send_request(url) then begin Memo2.Lines.Clear; // analyse HTML response for I := 0 to Memo1.Lines.Count - 1 do begin if (pos('powerstate', Memo1.Lines[i]) > 0) then begin meta := Memo1.Lines[i]; delete(meta, 1, pos('content="', Memo1.Lines[i])+8); portname := copy(meta, 1, pos(',', meta)-1); portstate := copy(meta, pos(',', meta)+1, 1); Memo2.Lines.Add('Name: "' + portname + '", State: "'+portstate+'"'); end; end; end; end;
- Hinweis: das oben stehende Beispiel wird wie im Quelltext angegeben unter der BSD Lizenz veröffentlicht
Mbachem 11:42, 1. Aug 2007 (CEST)
