Pytanie w sprawie websocket, xmlhttprequest, tizen, can-bus – Najlepszy sposób wyświetlania szybkich danych z interfejsu telnet w widoku sieci web?

3

Chciałbym wyświetlić dane pochodzące z interfejsu telnet w widoku sieci web. Mam działającego demona, który odczytuje dane z magistrali CAN i produkuje około 500 linii po ~ 40 znaków na sekundę na porcie telnet. To kilka wiadomości o częstotliwości 100 Hz, a większość innych o częstotliwości 10 lub 5 Hz, więc w sumie jest to około 500 / sekundę. Chcę pobrać najnowsze wartości z każdego pakietu i wyświetlić je na stronie internetowej. Strona internetowa jest ładowana lokalnie (nie przez HTTP), a demon może znajdować się na innym hoście, więc istnieje komunikacja między domenami.

Oto co próbowałem i nie udało mi się:

Użyj XMLHttpRequest. Mogę otworzyć połączenie i odczytać dane, ale nie mogę wyczyścić pola responseText wcześniejszych wartości, gdy dostanę zdarzenie onprogress. Nie mogę sobie pozwolić na przeanalizowanie textText dla najnowszej wartości, ponieważ rośnie bardzo szybko. Wpadnę także na problemy z pamięcią, więc to nie ma sensu.
WebSockets i Socket.IO: żaden z nich nie odniósł sukcesu w łączeniu się z interfejsem telnet, ponieważ oczekuje, że HTTP będzie najpierw konwertowany na bezpośrednie gniazdo.

Moje pytanie brzmi: jak najlepiej to osiągnąć? Niektóre opcje widzę, ale jestem pewien, że jest ich więcej:

Dodaj konwersję HTTP do gniazda w demonie canlogserver, do którego próbuję dołączyć. W jaki sposób? (jest to C open source, więc mogę dodać do niego)Napisz interfejs PHP, który dołącza się do demona za pośrednictwem telnetu i może przesyłać dane z powrotem do widoku sieciowego za pośrednictwem protokołu HTTP. Wydaje się to rażąco nieefektywne w przypadku wielu podróży przez stos IP. <Czy jest coś jeszcze w kodzie klienta JS, aby obejść mój bufor i odczytać wiadomości z serwera telnet, wyświetlić dane, a następnie zrzucić bufor? Muszę się upewnićwszystko komunikaty po otwarciu gniazda, więc otwieranie, zamykanie, ponowne otwieranie nie będzie działać, ponieważ oznacza to, że wiadomości zostaną utracone.

Dzięki,

Tim

Twoja odpowiedź

2   odpowiedź
2

W rzeczywistości WebSockets mają handshake podobny do HTTP, a następnie mają pewne ramki dla każdej wiadomości (nie są surowymi gniazdami po uzgadnianiu).

Możesz jednak użyćzablokować sieć most między klientem WebSocket (przeglądarką) a zwykłym gniazdem TCP. Websockify umożliwia również wysyłanie / odbieranie danych binarnych do / z serwera TCP, nawet jeśli protokół WebSocket (np. Hixie) lub przeglądarka nie obsługuje bezpośrednio typów binarnych (np. Tablice typowane).

noVNC używa websockify, aby móc łączyć się bezpośrednio z serwerem VNC, który nie ma jeszcze wbudowanej obsługi WebSocket. Websockify zawiera nawet mały test, który demonstruje połączenie prostego emulatora terminala opartego na przeglądarce z serwerem telnetd.Zrzeczenie się: Zrobiłem websockify i noVNC.

1

Najlepszym rozwiązaniem jest użycie WebSockets, jeśli chcesz czystego HTML5 bez żadnych wtyczek. Pamiętaj o obsługiwanych przeglądarkach dla takiej technologii, które możesz znaleźćlista obsługiwanych przeglądarek i wersja protokołu tutaj.

WebSockets muszą wykonywać handshake, gdy połączenie jest ustanowione, są to zwykle linie http. Następnie wszystkie wiadomości powinny mieć kadrowanie, gdy są odbierane i wysyłane. Przeglądarka robi to automatycznie, ale musisz zaimplementować dla swojego demona tę funkcjonalność.

Istnieją gotowe rozwiązania, w zależności od używanego języka.

Jeśli chcesz zaimplementować protokół WebSockets samodzielnie, sprawdź na przykład źródła implementacji Java i użyj oficjalnej specyfikacji:RFC6455

Wierzę, że WebSockets to najlepszy sposób. Java / Silverlight / Flash może być innym rozwiązaniem, ale wymaga więcej wysiłku i może nie być łatwy do skalowania, jak implementacja WebSockets, która będzie przetwarzać wiadomości i tworzyć elementy DOM, takie jak DIV w innym kontenerze DIV z otrzymanymi wiadomościami.

Powiązane pytania