Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
tcp / udp können ja über den EibPC gesendet werden.
Ich würde allerdings gerne eine http Adresse senden, so als würde ich eine Eingabe im Browser vornehmen.
Geht das?!
Schau Dir mal die EnertexTCP.lib an (für den Yamaha hat das hier auch schon jemand gemacht). Da ist ein XMLParser-Makro und eine einfach TCP Kommunikation quasi als Vorlage...
irgendwie komme ich mit dem Versenden und Empfangen von TCP Protokollen nicht weiter. Um die Funktion nutzen zu können, habe ich mir die Option NP gekauft und den Freischaltcode eingespielt.
Um Zugriff auf einen Siemens Webserver (OZW672 fuer die Heizungssteuerung) zu bekommen, habe ich folgenden Code geschrieben (leider bin ich mit der EnertexTCP.lib nicht klargekommen, speziell beim XMLParse Makro bin ich an einer Fehlermeldung gescheitert).
Die Verbindung zum Siemens Webserver scheint zu klappen, da der ConnenctionState auf 0 geht und das Programm in if Abfrage "if ConnectionState==0" reingeht: CheckSendtcp wird auf EIN gesetzt. Allerdings sehe mit Wireshark keine Anfrage vom EibPC zum Siemens Webserver raus und reingehen.
if cycle(00,30) then ConnectionState = connecttcp(Siemens_WebServer_Port, Siemens_WebServer_IP) endif
if ConnectionState==0 then \\
sendtcp(Siemens_WebServer_Port, Siemens_WebServer_IP, StringGet);\\
CheckSendtcp=EIN \\
endif
if event(readudp(RemotePort, RemoteIP, RawDataIn)) and (RemoteIP == Siemens_WebServer_IP) then {
Abfrage=EIN;
PosAnfang = find(RawDataIn, $"$, 2u16);
PosEnde = PosAnfang + 36u16;
SessionID_String = split(RawDataIn, PosAnfang, PosEnde)
} endif
if after(Abfrage,10000u64) then closetcp(Siemens_WebServer_Port, Siemens_WebServer_IP); Abfrage=AUS; ConnectionState=10 endif
if after(CheckSendtcp,15000u64) then closetcp(Siemens_WebServer_Port, Siemens_WebServer_IP); CheckSendtcp=AUS; Abfrage=AUS; ConnectionState=11 endif
2017-06-05: Wireshark Anwendungsfehler eines Laien (ich)
Der EibPC ist mit dem Siemens Webserver über einen D-Link Switch verbunden. Habe nun das Port Mirroring im Switch eingestellt und sehe nun, das Traffic vom EibPC an den Webserver geht und umgekehrt (s.a. https://wiki.wireshark.org/CaptureSetup/Ethernet)
Leider werde ich aber aus dem Traffic auch nicht viel schlauer.
2017-06-06: Ich konnte die Session ID sowie die erste Temperatur parsen. Soweit scheint es erst einmal zu klappen. Verständnisfragen habe jedoch noch zum Makro. Die formuliere ich in einer neuen Antwort.
Die aus meiner Sicht nicht notwendigen Codezeilen habe ich als Kommentar umgeschrieben (fett markiert)
Ist die Variable "Name^CRLF" in der aktuellen Software noch notwendig? In einem anderem Beitrag habe ich die Info "CRLF is now as predefined Constant" gefunden.
Den rot markierten Part habe ich mit dem darunter ersetzt. Dann funktioniert es bei mir.
Warum muss man den Befehl "Name^CRLF" eigentlich 3x am Ende eingeben?
In meiner Programmierung frage ich ca. 10 Größen ab. Muss ich jedes mal den Part "Close TCP Connection" ausführen? Eigentlich hätte ich gedacht, dass ich nachdem "if event(readtcp..." auf EIN geht, ich damit die nächste Abfrage ansteuern kann. Irgendwie funktioniert dies jedoch noch nicht.
Generell ist die Umsetzung einer Programmierung mit UDP oder TCP Abfragen sehr umständlich gelöst. Unzählige Programmierungen notwendig. Auch das Debuggen des Codes ist nicht State of the Art.
Name^CRLF=tostring(0x0D,0x0A)
Name^Port=80u16
// Initialisieren mit dem Wert 10 => Nach der Erstinitialsierung wird
// der Wert auf 11 gehen (== bereit)
Name^ConnectionState=10
Name^Get = AUS; //Name^StringGet= $GET $+Directory+ $ HTTP/1.1$ + Name^CRLF+ \\
// $User-Agent: Wget/ 1.0$ + Name^CRLF + \\
// $Accept: */*$ + Name^CRLF+ \\
// $Connection: keep-alive$ + Name^CRLF+ \\
// Name^CRLF+ Name^CRLF;
Name^StringGet= $GET $+Directory+ $ HTTP/1.1$ + Name^CRLF+ \\
$Host: 192.168.0.10$ + Name^CRLF + \\
$Connection: keep-alive$ + Name^CRLF+ \\
Name^CRLF+ Name^CRLF;
Name^RawData=$$c^RecieveBytes //Name^RawDataIn=$$c^RecieveBytes
Name^RemotePort=0u16
Name^RemoteIP=0u32
Name^Recieved=AUS //Name^DateIn=AUS
//Name^InternRecieved=AUS
// Built up TCP Connection
if Start then Name^ConnectionState = connecttcp(Name^Port, IP) endif
if change(Name^ConnectionState) and Name^ConnectionState == 0u08 then {
Name^Get = EIN; // Name^RawData=$$c^RecieveBytes;
// Name^Recieved=AUS;
}endif
// Send Request to TCP Server
if Name^Get then {
sendtcparray(Name^Port, IP, Name^StringGet, size(Name^StringGet));
} endif
if event(readtcp(Name^RemotePort,Name^RemoteIP,Name^R awData)) and Name^Get then {
Name^RawData=Name^RawData+Name^RawDataIn; // Was genau macht dieser Befehl?
}endif
// Close TCP Connection after 3 seconds after the maximum Transfertime
if after(Name^Get,ResponseTime^u64+500u64) then {
closetcp(Name^Port, IP);
Start=AUS;
// Initialisierungsprozess?
Name^ConnectionState=11;
Name^Recieved=EIN;
Name^Get = AUS;
} endif
Hallo,[*]Ist die Variable "Name^CRLF" in der aktuellen Software noch notwendig? In einem anderem Beitrag habe ich die Info "CRLF is now as predefined Constant" gefunden.
Ja, du kannst dann diese CRLF Variable nutzen.
[*]Warum muss man den Befehl "Name^CRLF" eigentlich 3x am Ende eingeben?
Vermutlich reicht hier auch 1x. Letztlich hängt das von der Gegenstelle ab.
[*]In meiner Programmierung frage ich ca. 10 Größen ab. Muss ich jedes mal den Part "Close TCP Connection" ausführen?
Hängt auch von der Gegenstelle ab. Das Verhalten kann so sein, dazu muss man mehr von der Gegenstelle wissen. Vielleicht braucht diese nach jedem Kommando noch ein ACK etc. Oft schickt aber eine Anfrage genau nur eine Anweisung.
Das kannst du mit dem Wireshark und einem Testrechner überprüfen.
Eigentlich hätte ich gedacht, dass ich nachdem "if event(readtcp..." auf EIN geht, ich damit die nächste Abfrage ansteuern kann. Irgendwie funktioniert dies jedoch noch nicht.[/LIST]
Generell ist die Umsetzung einer Programmierung mit UDP oder TCP Abfragen sehr umständlich gelöst. Unzählige Programmierungen notwendig. Auch das Debuggen des Codes ist nicht State of the Art.
Die Netzwerkprogrammierung für TCP Client/Server Verbindungen ist wohl kaum anders zu gestalten. Ich setzte aber mal einen Merker für die EnertexTCP.lib.
UDP ist m.E. per se einfach. Zum Debuggen bei zeitkritischen Dingen wie dem Aufbauen einer Serververbindung kann man dieses Makro nutzen
Es schickt dann einfach an die 192.168.33.118 den Debugstring, den man z.B. mit netcat abfangen kann.
Zur Frage: Was macht das:
Code:
if event(readtcp(Name^RemotePort,Name^RemoteIP,Name^RawDataIn)) and Name^Get then {
Name^RawData=Name^RawData+Name^RawDataIn;
}endif
Eine Nachricht trifft ein und wird dann in Name^RawDataIn geschrieben. Theoretisch kann der Sender Nachrichten zerstückeln, sodass Name^RawData=Name^RawData+Name^RawDataIn
die Nutzdaten aneinander kopiert. Die Verarbeitung des Strings muss hinterher den String ggf. kürzen.
War das Weglassen von $User-Agent: Wget/ 1.0$ denn wirklich notwendig?
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar