2016-01-08 3 views
5

Lassen Sie mich ein wenig Hintergrundinformationen darüber geben, was ich erreichen möchte.Gibt es eine Möglichkeit, eine TCP-Verbindung zu einer IP mit Javascript zu machen?

Ich habe ein Gerät (Chip und Pin Terminal), das eine lokale IP-Adresse hat, Es wurde programmiert, bestimmte Daten zu empfangen und zu verarbeiten.

Beispiel: Ich sende die Zeichenfolge "05" in hex "30 35" und das Terminal liest das und wird neu gestartet.

Ich habe versucht mit SockJS-Client sowie die eingebaute WebSockets.

jedoch mit Websockets Ich stelle fest, dass der Browser sendet:

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 

Wenn mein Code sieht wie folgt aus:

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

exampleSocket.send("05"); 

Wenn ich ändern, um diese den Code:

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

exampleSocket.send("05"); 

Ich bekomme nur 3 Tags, die gesendet werden: SYN(0x0016) ETX(0x0003) SOH(0x0001)

Jetzt bin ich mir nicht sicher, ob Sie einen WebSocket Server benötigen, um die eingehenden Daten interpretieren zu können.

SockJS macht das Gleiche durch zusätzliche Informationen über sich selbst zu senden und die 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 

Also ich denke, meine Frage ist. Gibt es eine Möglichkeit, genau das zu schicken, was ich will? ohne zusätzliche Daten?

Ich habe dies in Objective-C sowie C# abgeschlossen, ich bin nur nicht sicher, ob Javascript das tun kann?

Bitte fragen Sie, wenn etwas unklar ist, und ich werde versuchen, zu klären.

+0

Warum ist es wichtig, eine Verbindung mit dem lokalen Netzwerkgerät über JS herzustellen? Wäre es nicht möglich, dies auf dem Server zu tun und die Transaktion über AJAX-Events durchzuführen? – Nathan

+0

Wählen Sie eine andere Sprache, fast jede andere Sprache, und es ist relativ einfach, aber (Browser) JavaScript tut dies einfach nicht durch Design. Sonst wäre es ein Kinderspiel, reflektierte Angriffe auszuführen. – symcbean

Antwort

0

Ich fand schließlich eine Lösung.

Was ich tun musste, war eine Windows-Anwendung erstellen, die als Websocket-Server fungieren wird.

Bei der Installation des Programms wird es ein URI-Schema erstellen zu können, sich von einem Link nennen wie myapp://start

Hier den Code wird zum Bearbeiten der Registrierung eines benutzerdefiniertes URI-Schema hinzuzufügen:

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(); 

      } 



} 

Dann wird im Browser die URL aufgerufen, die das Programm startet. Der Websocket wird erstellt und an das laufende Programm localhost: port server gesendet.

Das Windows-Programm wird alles tun, um die Daten dann als rohe tcp/ip Bytes an das Terminal zu senden. Sobald das Terminal Daten an das Windows-Programm zurücksendet, leitet das Windows-Programm dieses zurück an den Websocket, damit der Browser mit den Informationen umgehen kann.

Das Windows-Programm wird dann alle Verbindungen beenden und beenden.

0

Haben Sie so zu nutzen versucht:

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); 
}; 

Hoffnung, die ich hilfreich sein könnte!

+0

Wenn ich meinen Code zu diesem ändern, sehe ich, dass es die gleichen Tags sendet, SYN ETX SOH – Derek

+0

Dies ist eine ASCII-Antwort! SYN-> synchrone Leerlauf, ETX-> Ende des Textes und SOH-> Start der Überschrift .. Das macht nicht viel Sinn für mich ... Was sollte dieser Chip mit der "05" tun, die Sie an ihn senden? Was ist das Protokoll der Antwort des Chips? –

+0

Das Terminal wird die "05" in Hex lesen, was "3035" ist. Die Maschine wird diesen Befehl kennen und sich selbst neu starten. Ich kann nicht programmieren, wie das Terminal mit den Daten interagiert, die es empfängt. Ich weiß nur, dass ich keine zusätzlichen Hex-Zeichen für den Anfang des Textes oder das Ende des Textes senden muss. Gibt es sowieso Abstreifen, also sende ich ihm "rohe" Daten ohne zusätzliche Tags? – Derek

6

Sie können keine einfache TCP-Verbindung von Javascript in einem Browser herstellen, mit dem Sie Daten in Ihrem eigenen Datenformat oder Protokoll senden können. Der Browser unterstützt das einfach nicht.

Sie können nur Ajax-Anfragen und WebSocket-Verbindungen erstellen. Sowohl Ajax- als auch WebSocket-Anforderungen beginnen als HTTP-Anforderung. Im Fall der webSocket-Anfrage kann die HTTP-Anfrage dann auf das webSocket-Protokoll "hochgerüstet" werden, nachdem beide Seiten übereinstimmen, aber die an den Server gesendeten anfänglichen Daten sind eine legale HTTP-Anfrage. Sie können this MDN reference für eine ganze Übersicht darüber sehen, wie das webSocket-Protokoll von der Verbindung zum tatsächlichen Paketformat funktioniert. Auch wenn es auf das webSocket-Protokoll aktualisiert wird, muss es das webSocket-Rahmenformat für alle Daten verwenden, die beschrieben werden here.

Hier eine Übersicht des WebSocket-Datenrahmenformates:

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 ...    | 
+---------------------------------------------------------------+ 

Also, es sei denn, Ihr Endpunkt spricht HTTP oder das WebSocket-Protokoll, können Sie nicht direkt vom Browser Javascript, um es zu verbinden.

Was Sie in Ihrer Frage als erste HTTP-Anfrage sehen, ist der Anfang einer webSocket-Verbindung. So funktioniert das.

Wenn Sie Javascript in einer Nicht-Browserumgebung wie node.js verwenden, können Sie das Modul "net" verwenden, um einen einfachen TCP-Socket zu erstellen, mit dem Sie dann das gewünschte Protokoll verwenden können.

+0

Hervorragende Erklärung. kurz gesagt, in einem Browser ist es nicht möglich, eine reine TCP-Verbindung herzustellen, da das Protokoll eine höhere Anwendungsschicht HTTP ist. –

+0

Warum der Downvote? Welcher Teil davon ist nicht korrekt oder muss verbessert werden? – jfriend00