Ankündigung

Einklappen
Keine Ankündigung bisher.

WebSocket Implementierung als eibPC Makro

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

    WebSocket Implementierung als eibPC Makro

    Hallo,

    nachdem ich nun so langsam bei eibPC HomeControl wieder Fahrt aufnehme und das Ganze im eigenen Haus einsetze stellen sich ein paar neue Fragen.

    Die Kommunikation über die Web-Server Brücke "refresher.php" ist ja nicht besonders effizient, wenn man bedenkt, dass bis zum Bus 4 "Hops" stattfinden. Client ruft "writer.php" auf, "writer.php" schreibt in Webserver Socket, "refresher.php" schreibt dann in eibPC und der eibPC schaufelt das dann nach Konvertierung der GA endlich in den Bus ...

    Mit der Release der neuesten HTML 5 Browser haben Websockets endlich Einzug gehalten, damit kann eine TCP Verbindung direkt zwischen Client und eibPC auf offiziellem Weg aufgebaut werden, bidirektional und mit allen Schikanen.

    Aus eibPC Sicht, kann die Verbindung genau so wie jede andere TCP-Verbindung gehandhabt werden. Es muss lediglich protokollseitig ein Handshake wie im folgenden Beispiel durchgeführt werden:

    Code:
    REQUEST:
    GET /Channel HTTP/1.1
    Upgrade: WebSocket
    Connection: Upgrade
    Host: myServer:8876
    Origin: [URL="http://myserver:8876/"]http://myServer:8876[/URL]
    WebSocket-Protocol: mySubprotocol.example.org
    
    
    RESPONSE:
    HTTP/1.1 101 Web Socket Protocol Handshake
    Upgrade: WebSocket
    Connection: Upgrade
    WebSocket-Origin: [URL="http://myserver:8876/"]http://myServer:8876[/URL]
    WebSocket-Location: ws://myServer:8876/Channel
    WebSocket-Protocol: mySubprotocol.example.org
    In der Folge müssen Text Übertragungen zwischen einem 0x00 und einem 0xFF Byte gepackt werden. Das ist aber mit einem eibPC Makro leicht zu bewerkstelligen. Sonstiger Overhead entsteht nicht.

    Nun die Frage: wie könnte man am geschicktesten obiges Handshake in das eibPC Homecontrol Makro packen, so dass man mit einer einfachen Erweiterung die vorhandene Funktionalität nutzen kann?
    Mir fehlen da so ein paar geschickte String Funktionen, um den Handshake zu realisieren. Im Wesentlichen müssen im REQUEST Host, Origin und Protokoll rausgeparst werden, damit sie in der RESPONSE wiederverwendet werden können.

    Gruss
    Arno

    #2
    Zitat von pernozzoli Beitrag anzeigen
    Hallo,
    nachdem ich nun so langsam bei eibPC HomeControl wieder Fahrt aufnehme und das Ganze im eigenen Haus einsetze stellen sich ein paar neue Fragen.
    Wir sind alle sehr gespannt...
    Mir fehlen da so ein paar geschickte String Funktionen, um den Handshake zu realisieren. Im Wesentlichen müssen im REQUEST Host, Origin und Protokoll rausgeparst werden, damit sie in der RESPONSE wiederverwendet werden können.
    Das wäre kein Problem. Zum Verständnis: Der EibPC dient als TCP/IP Client und soll eine Textnachricht an den Server schicken?
    Zum Parsen siehe https://knx-user-forum.de/125792-post15.html.
    Wenn Du mir einfach mal ein Demo der Anfrage schickst (wie genau lautet der String, der über TCP kommt), kann ich da aber auch gerne mehr unterstützen.
    Michael
    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
    Enertex Produkte kaufen

    Kommentar


      #3
      Noch ne Frage eines Dummys: Kann über diese Kommunikation der EibPC dem HTML-Client mitteilen, dass der einen Refresh ausüben soll? Dann könnte man das ja beim eingebauten Webserver nutzen, um den Refresh vom Polling wegzubekommen und vom Programm einen Refresh gezielt zu generieren.
      offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
      Enertex Produkte kaufen

      Kommentar


        #4
        Hallo,

        Noch ne Frage eines Dummys: Kann über diese Kommunikation der EibPC dem HTML-Client mitteilen, dass der einen Refresh ausüben soll? Dann könnte man das ja beim eingebauten Webserver nutzen, um den Refresh vom Polling wegzubekommen und vom Programm einen Refresh gezielt zu generieren.
        ja! Genau das ist damit möglich.

        Websockets ermöglichen bidirektionale Kommunikation zwischen Clients und Server. Im Grunde wird ein ganz normaler TCP Socket geöffnet und ein Minimalprotokoll drübergetülpt. Ein HTTP Header - analog zum Beispiel in meinem Post - wird nur am Anfang bei der Initialisierung der Verbindung verwendet. Der Overhead bei der weiteren Kommunikation beschränkt sich auf ein Minimum (zwei Bytes pro Datenübertragung).

        Bei Implementierung als eibPC Makro bleibt das Problem, dass ich für jede Verbindung "ein eigenes Makro" verwenden muss und vorab die IP-Adressen der Clients wissen muss. Daher bin ich im Moment nicht sicher, ob es wirklich Sinn macht. Eine Implementierung im eibPC selbst wäre natürlich super!

        Gruss
        Arno

        Kommentar


          #5
          Zitat von pernozzoli Beitrag anzeigen
          Websockets ermöglichen bidirektionale Kommunikation zwischen Clients und Server. Im Grunde wird ein ganz normaler TCP Socket geöffnet und ein Minimalprotokoll drübergetülpt. Ein HTTP Header - analog zum Beispiel in meinem Post - wird nur am Anfang bei der Initialisierung der Verbindung verwendet.
          Wie wird die Verbindung da am Leben gehalten, ist da ein Heartbeat, der die Sache am Leben hält?
          Bei Implementierung als eibPC Makro bleibt das Problem, dass ich für jede Verbindung "ein eigenes Makro" verwenden muss und vorab die IP-Adressen der Clients wissen muss. Daher bin ich im Moment nicht sicher, ob es wirklich Sinn macht. Eine Implementierung im eibPC selbst wäre natürlich super!
          Wir müssten das etwas genauer wissen. Wenn ich Dein Beispiel von oben sehe bzw. richtig verstehe, muss doch der EibPC lediglich eine TCP Verbindung zum Browser aufmachen, um dann darüber die Daten auszutauschen, also z.B. GA hat sich geändert oder wie ist denn das. Ich müsste wissen, wie das im Detail ausschaut. Jetzt ist es ja so, dass über das Makro bereits eine TCP/IP Verbindung besteht, d..h das Makro aktualisiert auch von sich aus die Zustände GAs über diese Verbindung.
          Wie wäre das anders? Ich versteh das nicht so ganz .
          Gerne können wir die Diskussion auch ins Betaforum verschieben, wenn Ihr meint.
          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
          Enertex Produkte kaufen

          Kommentar


            #6
            Hallo,

            bei WebSockets macht der Browser eine Verbindung zum WebSocket-Server auf (TCP Socket). Der Client sendet dann einen Header (REQUEST) an den Server, dieser bestätigt den Handshake über die RESPONSE.
            Ab diesem Zeitpunkt sendet / empfängt der Client Daten als binary oder text. Die Kennzeichnung des Typ erfolgt über zwei Bytes am Anfang und am Ende des Datenblocks. Verhalten ist wie bei einer normalen TCP Verbindung.

            Der Server muss dem Client nichts mitteilen, sondern kann direkt Daten an den Client senden. Für die Verarbeitung clientseitig ist natürlich ein wenig Javascript vonnöten.

            Als Beispiel für eine Serverimplementierung kann man sich mod_pywebsocket näher anschauen. Ein einfaches Beispiel ist dort auch zu finden.

            Natürlich kann man das alles mit einem Makro abbilden, es stellen sich dennoch folgende Fragen:
            • wie gehe ich mit mehr als einem Client um?
            • wie gehe ich mit Cross-Domain Zugriffen um? Hier schlagen Sicherheitsmechanismen bei den Browsern zu, die verhindern, dass die Webseite auf dem einen Server liegt, der Websocket jedoch auf einem anderen, nämlich dem eibPC.

            Gruss
            Arno

            Kommentar


              #7
              Zitat von pernozzoli Beitrag anzeigen
              Als Beispiel für eine Serverimplementierung kann man sich mod_pywebsocket näher anschauen. Ein einfaches Beispiel ist dort auch zu finden.
              Wo ist das zu finden?
              Natürlich kann man das alles mit einem Makro abbilden, es stellen sich dennoch folgende Fragen:
              • wie gehe ich mit mehr als einem Client um?
              • wie gehe ich mit Cross-Domain Zugriffen um? Hier schlagen Sicherheitsmechanismen bei den Browsern zu, die verhindern, dass die Webseite auf dem einen Server liegt, der Websocket jedoch auf einem anderen, nämlich dem eibPC.
              Zum ersten: Das dürfte kein Problem sein - ich kann da was exemplarisch code. Zum Zweiten: Du meinst, das HTML File müsste auf den EibPC hochgeladen werden?
              offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
              Enertex Produkte kaufen

              Kommentar

              Lädt...
              X