Beste Möglichkeit, Hochgeschwindigkeitsdaten von einer Telnet-Schnittstelle in einer Webansicht anzuzeigen?

Ich möchte Daten, die von einer Telnet-Schnittstelle stammen, in einer Webansicht anzeigen. Ich habe einen Daemon, der CAN-Bus-Daten liest und ungefähr 500 Zeilen mit ~ 40 Zeichen pro Sekunde auf einem Telnet-Port erzeugt. Es sind ein paar Nachrichten, die mit 100 Hz und die meisten anderen mit 10 oder 5 Hz laufen, also in der Summe sind es ungefähr 500 / Sekunde. Ich möchte die neuesten Werte in jedem Paket abrufen und diese auf einer Webseite anzeigen. Die Webseite wird lokal geladen (nicht über HTTP) und der Dämon befindet sich möglicherweise auf einem anderen Host, sodass eine domänenübergreifende Kommunikation besteht.

Folgendes habe ich versucht und nicht getan:

Verwenden Sie XMLHttpRequest. Ich kann die Verbindung öffnen und die Daten lesen, aber ich kann das Feld responseText nicht mit den vorherigen Werten löschen, wenn ich das Ereignis onprogress erhalte. Ich kann es mir nicht leisten, den responseText auf den neuesten Wert zu analysieren, da dieser sehr schnell wächst. Ich werde auch auf Speicherprobleme stoßen, also ist dies ein No-Go.
WebSockets und Socket.IO: Keines hat sich beim Herstellen einer Verbindung zu einer Telnet-Schnittstelle als erfolgreich erwiesen, da erwartet wird, dass HTTP zuerst in ein direktes Socket konvertiert wird.

Meine Frage ist also, wie ich das am besten bewerkstellige. Einige Optionen, die ich sehe, aber ich bin sicher, dass es mehr gibt:

Fügen Sie im canlogserver-Daemon, mit dem ich eine Verbindung herstellen möchte, HTTP zur Socket-Konvertierung hinzu. Wie? (Es ist Open Source C, also könnte ich es ergänzen.)Schreiben Sie eine PHP-Schnittstelle, die über Telnet eine Verbindung zum Dämon herstellt und Daten über HTTP zurück in die Webansicht pumpen kann. Dies scheint bei mehreren Trips durch den IP-Stack äußerst ineffizient zu seinGibt es sonst noch etwas im JS-Client-Code, um mein Pufferproblem zu umgehen und Nachrichten vom Telnet-Server zu lesen, Daten anzuzeigen und dann den Puffer zu sichern? Ich muss sicherstellen, dass ich es bekommealles Sobald der Socket geöffnet ist, können die Nachrichten nicht mehr geöffnet, geschlossen oder erneut geöffnet werden, da dies bedeutet, dass Nachrichten verloren gehen.

Vielen Dank,

Tim

Antworten auf die Frage(2)

wenn Sie reines HTML5 ohne Plugins wünschen. Beachten Sie die unterstützten Browser für diese Technologie, die Sie finden könnenListe der unterstützten Browser und Protokollversion hier.

WebSockets müssen beim Verbindungsaufbau einen Handshake ausführen, es handelt sich um übliche http-Leitungen. Danach sollten alle Nachrichten eingerahmt sein, wann sie empfangen und wann sie gesendet werden. Der Browser macht das automatisch, aber Sie müssen diese Funktionalität für Ihren Daemon implementieren.

Es gibt fertige Lösungen, je nachdem, welche Sprache Sie verwenden.

Wenn Sie das WebSockets-Protokoll selbst implementieren möchten, überprüfen Sie beispielsweise die Quellen der Java-Implementierung und verwenden Sie die offizielle Spezifikation:RFC6455

Ich glaube, dass WebSockets der beste Weg ist. Java / Silverlight / Flash ist möglicherweise eine andere Lösung, erfordert jedoch mehr Aufwand und ist möglicherweise nicht einfach skalierbar wie die WebSockets-Implementierung, da nur Nachrichten verarbeitet und DOM-Elemente wie DIVs in einem anderen DIV-Container mit empfangenen Nachrichten erstellt werden.

inen Rahmen für jede Nachricht (sie sind nach dem Handshake keine Raw-Sockets).

Sie könnten jedoch verwendenwebsockify um eine Brücke zwischen einem WebSocket-Client (Browser) und einem einfachen TCP-Socket zu bauen. Mit Websockify können Sie auch dann Binärdaten zum / vom TCP-Server senden / empfangen, wenn das WebSocket-Protokoll (z. B. Hixie) oder der Browser Binärtypen nicht direkt unterstützt (z. B. typisierte Arrays).

noVNC verwendet websockify, um eine direkte Verbindung zu einem VNC-Server herzustellen, der noch keine WebSocket-Unterstützung integriert hat. In Websockify ist sogar ein kleiner Test enthalten, der die Verbindung eines einfachen browserbasierten Terminalemulators mit einem Telnetd-Server demonstriert.Haftungsausschluss: Ich habe websockify und noVNC gemacht.

Ihre Antwort auf die Frage