Pergunta sobre tizen, xmlhttprequest, websocket, can-bus – Melhor maneira de exibir dados de alta velocidade a partir de uma interface telnet em uma visualização da web?

3

Gostaria de exibir dados provenientes de uma interface telnet em uma visualização da web. Eu tenho um daemon em execução que lê os dados do barramento CAN e produz cerca de 500 linhas de ~ 40 caracteres por segundo em uma porta telnet. São algumas mensagens rodando a 100 Hz e a maioria das outras rodando a 10 ou 5 Hz, então, em suma, é cerca de 500 / segundo. Eu quero pegar os valores mais recentes em cada pacote e exibi-los em uma página da web. A página da web é carregada localmente (não via HTTP) e o daemon pode estar em um host diferente, portanto, há comunicação entre domínios.

Aqui está o que eu tentei e não consegui fazer:

Use XMLHttpRequest. Eu posso abrir a conexão e ler os dados, mas não consigo limpar o campo responseText dos valores anteriores quando obtenho o evento onprogress. Eu não posso dar ao luxo de analisar o responseText para o valor mais recente, pois isso cresce muito rapidamente. Também vou me deparar com problemas de memória, então isso é um não-ir.
WebSockets e Socket.IO: nenhum provou ter sucesso em se conectar a uma interface telnet porque espera que o HTTP primeiro seja convertido em soquete direto.

Então, minha pergunta é: como faço melhor isso? Algumas opções eu vejo, mas tenho certeza que tem mais:

Adicionar HTTP à conversão de soquete no daemon canlogserver ao qual estou tentando conectar. Como? (é open source C, então eu poderia adicionar a ele)Escreva uma interface do PHP que se conecte ao daemon via telnet e possa bombear os dados de volta para a visualização da web via HTTP. Isso parece extremamente ineficiente com várias viagens através da pilha de IPs.Qualquer outra coisa no código do cliente JS para contornar meu problema de buffer e ler mensagens do servidor de telnet, exibir dados e, em seguida, despejar o buffer? Eu preciso ter certeza de que recebotodos as mensagens uma vez que o soquete é aberto, então a abertura, o fechamento e a reabertura não funcionarão, pois isso significará que as mensagens serão perdidas.

Obrigado,

Tim

Sua resposta

2   a resposta
2

Na verdade, os WebSockets têm um aperto de mão semelhante ao HTTP e, em seguida, têm algum enquadramento para cada mensagem (eles não são soquetes não processados ​​após o handshake).

No entanto, você poderia usarwebsockify fazer a ponte entre um cliente WebSocket (navegador) e um soquete TCP simples. O Websockify também permite que você envie / receba dados binários de / para o servidor TCP, mesmo quando o protocolo WebSocket (por exemplo, Hixie) ou o navegador não suporta tipos binários diretamente (por exemplo, Matrizes digitadas).

noVNC usa o websockify para poder conectar-se diretamente a um servidor VNC que ainda não possui suporte interno ao WebSocket. Websockify ainda tem um pequeno teste incluído que demonstra conectar um simples emulador de terminal baseado em navegador a um servidor telnetd.aviso Legal: Eu fiz websockify e noVNC.

1

A melhor solução é usar WebSockets se você quiser HTML5 puro sem nenhum plug-in. Tenha em mente os navegadores suportados por essa tecnologia, você pode encontrarlista de navegadores suportados e versão do protocolo aqui.

WebSockets tem que fazer o aperto de mão quando a conexão é estabelecida, é usual linhas http. Depois disso todas as mensagens devem ter enquadramento, quando receber e quando enviar. O navegador faz isso automaticamente, mas você precisa implementar para o daemon essa funcionalidade.

Há soluções prontas, depende de qual idioma você usa.

Se você deseja implementar o protocolo WebSockets sozinho, verifique as origens da implementação Java, por exemplo, e use a especificação oficial:RFC6455

Eu acredito que WebSockets é o melhor caminho a percorrer. O Java / Silverlight / Flash pode ser outra solução, mas requer mais esforços e pode não ser escalonável, como a implementação do WebSockets, que estará apenas processando mensagens e criando elementos DOM como DIV's em outro contêiner DIV com mensagens recebidas.

Perguntas relacionadas