2016-01-08 20 views
5

Lasciatemi fare un piccolo retroscena su quello che sto cercando di realizzare.C'è un modo per fare una connessione TCP ad un IP con javascript?

Ho un dispositivo (terminale di chip e pin) che ha un indirizzo IP locale, è stato programmato per ricevere determinati dati ed elaborarli.

esempio: invio la stringa "05" nell'esagono "30 35" e il terminale lo legge e si riavvierà.

Ho provato a utilizzare SockJS-Client e allo WebSockets integrato.

Tuttavia utilizzando WebSockets ho notato che il browser sta inviando:

GET/HTTP/1.1 
Host: IP:PORT 
Connection: Upgrade 
Pragma: no-cache 
Cache-Control: no-cache 
Upgrade: websocket 
Origin: MYIP 
Sec-WebSocket-Version: 13 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8 
Sec-WebSocket-Key: A1CeTMFnQCZv4GNZbLFnyQ== 
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits 

Quando il mio codice è simile al seguente:

var exampleSocket = new WebSocket("ws://IP:PORT"); 

exampleSocket.send("05"); 

Se cambio il codice a questo:

var exampleSocket = new WebSocket("wss://IP:PORT"); 

exampleSocket.send("05"); 

Ho appena ricevuto 3 tag inviati: SYN(0x0016) ETX(0x0003) SOH(0x0001)

Ora non sono sicuro che sia necessario un server WebSocket per poter interpretare i dati in entrata.

SockJS fa la stessa cosa con l'invio di informazioni aggiuntive su se stessa e il broswer:

GET /info?t=1452272641278 HTTP/1.1 
Host: IP:PORT 
Connection: keep-alive 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36 
Origin: MYIP 
Accept: */* 
Referer: MYIP 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8 

Quindi credo che la mia domanda è. C'è un modo per inviare esattamente quello che voglio? senza dati aggiuntivi?

Ho completato questo in Objective-C e C#, non sono sicuro se javascript può farlo?

Si prega di chiedere se qualcosa non è chiaro e cercherò di chiarire.

+0

Perché è importante connettersi al dispositivo di rete locale tramite JS? Non sarebbe possibile farlo sul server e condurre la transazione tramite eventi AJAX? – Nathan

+0

Seleziona un'altra lingua, solo di qualsiasi altra lingua, e la sua relativamente semplice, ma (browser) JavaScript semplicemente non lo fa in base alla progettazione. Altrimenti sarebbe un gioco da ragazzi portare a termine attacchi riflessi. – symcbean

risposta

0

Alla fine ho trovato una soluzione.

Quello che dovevo fare era creare un'applicazione Windows che fungesse da server websocket.

Quando si installa il programma sarà creare uno schema URI per essere in grado di chiamare se stesso da un link come myapp://start

ecco il codice per modificare il Registro di sistema per aggiungere uno schema URI personalizzato:

static void Main(string[] args) { 

      try { 

       // SET PATH OF SERVER 
       String path = Environment.GetCommandLineArgs()[0]; 

       // GET KEY 
       RegistryKey key = Registry.ClassesRoot.OpenSubKey("myApp"); 

       // CHECK FOR KEY 
       if (key == null) { 


        // SET KEY 
        key = Registry.ClassesRoot.CreateSubKey("myApp"); 
        key.SetValue(string.Empty, "URL: myApp Protocol"); 
        key.SetValue("URL Protocol", string.Empty); 

        // SET COMMAND 
        key = key.CreateSubKey(@"shell\open\command"); 
        key.SetValue(string.Empty, path + " " + "%1"); 
        //%1 represents the argument - this tells windows to open this program with an argument/parameter 


       } 

       // CLOSE 
       key.Close(); 

      } catch (Exception ex) { 
       Console.WriteLine(ex.Message); 
       Console.ReadKey(); 

      } 



} 

Quindi nel browser chiamerà quell'URL che avvia il programma. Il websocket verrà creato e inviato al localhost: programma port server in esecuzione.

Il programma di Windows farà tutto il possibile per ottenere i dati e inviarli come byte raw tcp/ip al terminale. Una volta che il terminale invia i dati al programma Windows, il programma Windows lo inoltrerà nuovamente al websocket per il browser per gestire le informazioni.

Il programma di Windows quindi interromperà tutte le connessioni e uscirà.

0

Hai provato a utilizzare in questo modo:

var exampleSocket = new WebSocket('wss://IP:PORT', ['soap', 'xmpp']); 

// When the connection is open, send some data to the server 
exampleSocket.onopen = function() { 
    exampleSocket.send('05'); 
}; 

// Log errors 
exampleSocket.onerror = function (error) { 
    console.log('WebSocket Error ' + error); 
}; 

// Log messages from the server 
exampleSocket.onmessage = function (e) { 
    console.log('Server: ' + e.data); 
}; 

speranza che potrebbe essere utile!

+0

Quando cambio il mio codice, vedo che sta inviando gli stessi tag, SYN ETX SOH – Derek

+0

Questa è una risposta ASCII !! SYN-> inattivo sincrono, ETX-> fine del testo e SOH-> inizio dell'intestazione .. Questo non ha molto senso per me ... cosa dovrebbe fare questo chip con il "05" che si sta inviando ad esso? Qual è il protocollo della risposta fatta dal chip? –

+0

Il terminale leggerà "05" in esadecimale, che è "3035". La macchina riconoscerà tale comando e si riavvierà da solo. Non riesco a riprogrammare come il terminale interagisce con i dati che sta ricevendo. So solo che non ho bisogno di inviare caratteri esadecimali in più per l'inizio del testo o la fine del testo. Esiste comunque la possibilità di spogliarlo, quindi invio dati "grezzi" senza tag extra? – Derek

6

Non è possibile effettuare una semplice connessione TCP da Javascript in un browser che consenta di inviare dati nel proprio formato o protocollo di dati. Il browser semplicemente non lo supporta.

Consente solo di effettuare richieste Ajax e connessioni WebSocket. Entrambe le richieste Ajax e WebSocket iniziano come una richiesta HTTP. Nel caso della richiesta webSocket, la richiesta HTTP può quindi essere "aggiornata" al protocollo webSocket dopo che entrambe le parti sono d'accordo, ma i dati iniziali inviati al server saranno una richiesta HTTP legale. È possibile vedere this MDN reference per un intero schema di come il protocollo webSocket funziona dalla connessione al formato di pacchetto effettivo. Anche una volta aggiornato al protocollo webSocket, deve utilizzare il formato di frame WebSocket per tutti i dati che sono descritti here.

Ecco una descrizione dei WebSocket formato di frame di dati:

0     1     2     3 
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-------+-+-------------+-------------------------------+ 
|F|R|R|R| opcode|M| Payload len | Extended payload length | 
|I|S|S|S| (4) |A|  (7)  |    (16/64)   | 
|N|V|V|V|  |S|    | (if payload len==126/127) | 
| |1|2|3|  |K|    |        | 
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + 
|  Extended payload length continued, if payload len == 127 | 
+ - - - - - - - - - - - - - - - +-------------------------------+ 
|        |Masking-key, if MASK set to 1 | 
+-------------------------------+-------------------------------+ 
| Masking-key (continued)  |   Payload Data   | 
+-------------------------------- - - - - - - - - - - - - - - - + 
:      Payload Data continued ...    : 
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 
|      Payload Data continued ...    | 
+---------------------------------------------------------------+ 

Quindi, a meno che il punto finale parla HTTP o il protocollo WebSocket, non è possibile connettersi direttamente ad esso dal browser Javascript.

Quello che vedete nella vostra domanda come la richiesta HTTP iniziale è l'inizio di una connessione webSocket. Ecco come funziona

Se si utilizza Javascript in un ambiente non browser come node.js, è possibile utilizzare il modulo "net" per creare un semplice socket TCP che è possibile utilizzare con qualsiasi protocollo desiderato.

+0

Ottima spiegazione. in breve, in un browser, non è possibile stabilire una connessione TCP pura in quanto il protocollo è un livello di applicazione HTTP superiore. –

+0

Perché il downvote? Quale parte di questo non è corretta o deve essere migliorata? – jfriend00