Ankündigung

Einklappen
Keine Ankündigung bisher.

http über EibPC senden

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    http über EibPC senden

    Hallo zusammen,

    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?!

    #2
    Willst Du eine Seite auswerten oder was willst Du da genau machen?
    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
    Enertex Produkte kaufen

    Kommentar


      #3
      Ich möchte netzwerkfähige Geräte damit steuern.
      Hiermit kann ich bspw. den AV Receiver einschalten:
      http://192.168.188.22/goform/formiPh....xml?1+Poweron

      Kommentar


        #4
        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...
        offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
        Enertex Produkte kaufen

        Kommentar


          #5
          Hallo,

          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.

          Was mache ich falsch?

          Siemens_WebServer_Port=80u16
          Siemens_WebServer_IP=192.168.0.10
          ConnectionState=10
          StringGet = $GET /api/auth/login.json?user=XXX&pwd=YYY HTTP/1.1$
          RawDataIn=$$c200
          SessionID_String=$$c36
          RemotePort=0u16
          RemoteIP=0u32
          PosAnfang=0u16
          PosEnde=0u16
          Abfrage=AUS
          CheckSendtcp=AUS

          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.
          Zuletzt geändert von JAK; 06.06.2017, 09:26.

          Kommentar


            #6
            Ich bin gerade im Urlaub, (und einige vom Support auch), aber es wird sicherlich hilfreich sein wenn du den WireShark Mitschnitt hier mal postest
            offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
            Enertex Produkte kaufen

            Kommentar


              #7
              Hallo,

              folgende Verständnisfragen zum Makro.
              • 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

              :end
              Zuletzt geändert von JAK; 13.06.2017, 20:23.

              Kommentar


                #8
                Zitat von JAK Beitrag anzeigen
                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
                Code:
                :begin vmDebugUDP(cString)
                 :return  {
                          sendudp(9000u16, 192.168.33.118, cString+CRLF);
                 }
                 :end
                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?
                offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                Enertex Produkte kaufen

                Kommentar

                Lädt...
                X