Autor Tema: Websocket  (Leído 1932 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Websocket
« en: 03 de Febrero de 2016, 01:05:52 »
Recientemente compre un modulo TCP-Serial, el modulo tiene varias funciones y una de ellas es "web to serial" pero para eso crea websocket, el problema aquí el es algoritmo SHA1 para aceptar la petición.
¿Alguien tiene algún material para dar la respuesta al handsnake desde el pic?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Websocket
« Respuesta #1 en: 03 de Febrero de 2016, 01:29:48 »
Es imposible ayudarte con la informacion que diste. Ni siquiera sabemos cual es el modulo, ni que software tiene, ni siquiera el integrado que posee como para buscarlo.

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Re:Websocket
« Respuesta #2 en: 03 de Febrero de 2016, 12:12:57 »
Es imposible ayudarte con la informacion que diste. Ni siquiera sabemos cual es el modulo, ni que software tiene, ni siquiera el integrado que posee como para buscarlo.


Tienes razón, lo que pasa es que es muy transparente el modulo.
http://www.usriot.com/Product/129.html se llama K3

Solo es conectar RX,TX y una conexión  TCP... y ya tienes una conexión transparente... ahí no hay problema... porque incluso hay ejemplos de C# client y server. Pero busco una solución en web como java o ASP o PHP...
Tengo el siguiente código que es genial, pero es con websocket, ahí el problema es responder el Handsnake, desde el PIC, basicamente el problema es el algoritmo base64.

Este código se puede probar, cambiando la ip y puerto, con el programa hercules se configura un servidor.

Código: [Seleccionar]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" style="padding:0px;">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="style2.css" />
</head>
<script type="text/javascript" language="JavaScript"><!--
var socket;
function connectx(){
// alert(window.location.host);
    try{

        socket=new WebSocket('ws://192.168.1.10:6432');
socket.binaryType = "arraybuffer";




    }catch(e){
        alert('error');
        return;
    }
    socket.onopen = sOpen;
    socket.onerror=sError;
    socket.onmessage=sMessage;
    socket.onclose=sClose;
 
}
function sOpen(){
    alert('connect success!');
}
function sError(){
    alert('connect error');
}
function sMessage(msg){
if (msg.data instanceof ArrayBuffer)
{
var hexValRead=document.getElementById("UartReadHexText_id");
var gbuf = new Uint8Array(msg.data, 0);
if(hexValRead.length>=10240)
{
hexValRead.value = "";
}
var dat = "";
for (var i in gbuf)
dat += "0x"+gbuf[i].toString(16) + " ";
hexValRead.value +="Receive HEX: "+ dat+ "\r\n";
}else
{
var hexValRead=document.getElementById("UartReadHexText_id");
var AsciiValRead=document.getElementById("UartReadAsciiText_id");
if(hexValRead.length>=10240)
{
hexValRead.value = "";
}
var dat = "";
for (var i in msg.data)
dat += "0x"+msg.data.charCodeAt(i).toString(16) + " ";
hexValRead.value +=dat;
AsciiValRead.value +=msg.data;
}
}
 
function sClose(){
    alert('connect close')
}
function send(){
var hexValInput=document.getElementById("Write_uart_data_text_id");
    socket.send(hexValInput.value);
}
function wssendBinary()
{
var hexValInput=document.getElementById("Write_uart_data_text_id");
var byteArray = new Uint8Array(hexValInput.value.length);
if(hexValInput.value.length%2 !=0)
{
var sendArray = new Uint8Array((hexValInput.value.length+1)/2);
}
else
{
var sendArray = new Uint8Array(hexValInput.value.length/2);
}
var i;
byteArray =hexValInput.value

for(i=0;i<sendArray.length;i++)
{
if((byteArray[i*2]>='0' && byteArray[i*2]<='9')||(byteArray[i*2]>='A' && byteArray[i*2]<='F')||(byteArray[i*2]>='a' && byteArray[i*2]<='f'))
sendArray[i]=parseInt(byteArray[i*2], 16)*16+parseInt(byteArray[i*2+1], 16);
else
alert('Can not transfer into HEX format!');
}
socket.send(sendArray);   
}
function close(){
    socket.close();
}
function Clear()
{
var hexValRead=document.getElementById("UartReadHexText_id");
var asciiValRead=document.getElementById("UartReadAsciiText_id");
hexValRead.value="";
asciiValRead.value="";
}
//-->
</script>

<style>
html { overflow-x:hidden; }
</style>
<body>

<form>
  <div class="top_content" style="height:auto">
<div class="top">
<p>parameter</p>
</div>

<div>
<button id="connect1" type="button" onclick="connectx()">Connect</button>
<button id="close" type="button" onClick="close();">Close</button>
</div>
<div>
<textarea id="UartReadHexText_id" cols="64" rows="8">
Receive hex data
</textarea>
</div>
<div>
<textarea id="UartReadAsciiText_id" cols="64" rows="8">
Receive ascii data
</textarea>
</div>
<div>
<ul>
  <textarea cols="64" rows="8" id="Write_uart_data_text_id"></textarea>
</ul>
<ul>
<input type=button value="send ascii data" onClick="send();" id="Uart_send_id" />
<input type=button value="send hex data" onClick="wssendBinary();" id="Uart_wssend_id" />
    <input name="button" type=button id="Uart_clear_id"" onclick="Clear()" value="clear" />
</ul>
</div>

</div>
</form>
<div id="sidebar">
      <ul>
        <li>help</li>
      </ul>
  <div id="help">
    <div align="left">
      <ul>
        <li id="lia">Webs to serial: </li>
        <li id="lib">use websocket to fulfill the function of web to serial, after connection established, we could send and recevie data between webpage and serial port.</li>
          </ul>
        </div>
  </div>
    </div>
</div>
</body>
</html>





Ejemplo:
Cuando corro el código, el navegador envía esto:
Código: [Seleccionar]
GET / HTTP/1.1
Host: 192.168.0.176:6432
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: file://
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: es-419,es;q=0.8
Sec-WebSocket-Key: MaEEbyqxUXzDWc5Eb7xDjw==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits


Ahí, el client (el pic) debe responder para establecer la comunicación.
Mi conocimiento es muy básico, pero entiendo que esa es la forma para encriptar la comunicación.
muchas gracias por cualquier pista que me den.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Websocket
« Respuesta #3 en: 03 de Febrero de 2016, 12:31:19 »
Cuando tenga un tiempo miro el codigo.

Citar
Pero busco una solución en web como java o ASP o PHP...

Si tu idea es implantar un webserver en el micro, deberias tener el motor PHP/ASP etc en el micro, Lo cual lo veo bastante complicado. Lo que si se podria hacer es SSI , o usar JS para para generar el contenido asi pide a otras "paginas" del micro. Aunque supuestamente el modulo que tenes si posee este motor php, mediante un httpd. Lo que no se es como definis esas paginas ni como interactuar con el modulo, ya que no se que transmite ni recibe y el manual no dice NADA de NADA.

Respecto a tu codigo JavaScript que tenes ahi, se ejecuta del lado del cliente, es decir tu micro/modulo solo sostiene el codigo, lo envia, el navegador lo recibe y ahi se ejecuta el JS.

Peeero el JS crea un websockets que es tu pregunta original. El handshake es el siguiente:

Cliente envia en la cabecera HTTP:

Código: [Seleccionar]
Sec-WebSocket-Key: MaEEbyqxUXzDWc5Eb7xDjw==
Servidor recibe eso. Concatena ese valor con el valor: "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"  ( es unico no varia esto) quedando:

Código: [Seleccionar]
MaEEbyqxUXzDWc5Eb7xDjw==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
Luego debe realizar un SHA-1 de este

Código: [Seleccionar]
0x67 0x19 0x7c 0xe4 0xd8 0x89 0x42 0x27 0x24 0x43 0xae 0x75 0xe1 0xd9 0x61 0xbc 0x35 0x9a 0x6f 0xf7
Pasarlo a base-64, ( lo de arriba es un hex ), segun la primer pagina que me encontre:

Código: [Seleccionar]
Zw==
Y esto deberia ser devuelto por el server con una respuesta 101 quedando el header HTTP como este:

Código: [Seleccionar]
        HTTP/1.1 101 Switching Protocols
        Upgrade: websocket
        Connection: Upgrade
        Sec-WebSocket-Accept: Zw==

Esto es solo para que el servidor no tome conexiones de websockets si es que no lo permite.

Fuentes:
websocket:
http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17
base-64
http://tools.ietf.org/html/rfc4648#section-4
Websocket API:
https://developer.mozilla.org/es/docs/Web/API/WebSocket
Sha1 code C:
http://oauth.googlecode.com/svn/code/c/liboauth/src/sha1.c

Igual... el websocket es usado por JS y tranquilamente podrias usar XMLHttpRequest de JS y no meterte con los websockets. De todas formas alguien con mayor conocimiento sobre Web seria mejor.
« Última modificación: 03 de Febrero de 2016, 15:28:08 por KILLERJC »

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Re:Websocket
« Respuesta #4 en: 03 de Febrero de 2016, 16:26:36 »
Cuando tenga un tiempo miro el codigo.

Citar
Pero busco una solución en web como java o ASP o PHP...

Si tu idea es implantar un webserver en el micro, deberias tener el motor PHP/ASP etc en el micro, Lo cual lo veo bastante imposible. Lo que si se podria hacer es SSI , o usar JS para para generar el contenido pidiendolo a otras "paginas" del micro.


El modulo lo tengo conectado a un adaptador  usb/serial, por lo que la comunicación es transparente, si se trabaja con un conexión simple TCP, no hay problema.
El problema surge cuando uso websocket con JS,  por ejemplo la ip del modulo es 192.168.1.10  con el puerto 5050.
ahí el navegador o el modulo( que trabaja como server) envía esa trama al puerto serial.
Se supone que le debo responder desde el pic la respuesta a esta llave:
Código: [Seleccionar]
Sec-WebSocket-Key: MaEEbyqxUXzDWc5Eb7xDjw==
mi problema lo  puedo solucionar con solo una conexión TPC simple (es transparente), pero en realidad busco es usar websokets por lo fácil o eso es lo que creo.

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Re:Websocket
« Respuesta #5 en: 03 de Febrero de 2016, 17:03:46 »
Cuando tenga un tiempo miro el codigo.

Citar
Pero busco una solución en web como java o ASP o PHP...

Si tu idea es implantar un webserver en el micro, deberias tener el motor PHP/ASP etc en el micro, Lo cual lo veo bastante imposible. Lo que si se podria hacer es SSI , o usar JS para para generar el contenido pidiendolo a otras "paginas" del micro.


El modulo lo tengo conectado a un adaptador  usb/serial, por lo que la comunicación es transparente, si se trabaja con un conexión simple TCP, no hay problema.
El problema surge cuando uso websocket con JS,  por ejemplo la ip del modulo es 192.168.1.10  con el puerto 5050.
ahí el navegador o el modulo( que trabaja como server) envía esa trama al puerto serial.
Se supone que le debo responder desde el pic la respuesta a esta llave:
Código: [Seleccionar]
Sec-WebSocket-Key: MaEEbyqxUXzDWc5Eb7xDjw==
mi problema lo  puedo solucionar con solo una conexión TPC simple (es transparente), pero en realidad busco es usar websokets por lo fácil o eso es lo que creo.

Si, has resumido justamente lo que estoy necesitando ... voy a documentarme sobre base64.
muchas gracias!


 

anything