2016-06-05 18 views
0

Guten Tag,Kann keine Hex-Antwort von Imatic-Karte empfangen

Dies wird lange dauern. Ich versuche mit der "SainSmart iMatic mit RJ45" Platine zu kommunizieren, die zusammen mit dem "SainSmart 16-Channel 12V Relay Module" verwendet wird.

Grundsätzlich bin ich in der Lage, Hex-Befehle erfolgreich an die Platine zu senden, kann aber bei Bedarf keine Antwort von der Platine erhalten. Was meine ich damit?

Ich habe einen Laptop mit Ubuntu 14.04.4 LTS direkt über ein Ethernet-Straight-Through-Kabel mit der Karte verbunden (nicht mehr Crossover-Typ benötigt). Ich habe eine Konfiguration für diese Art von Netzwerk (nur zwei Geräte). Die IP der Imatic-Karte ist fest, 192.168.1.4 mit Port 3000. Meine Laptop-IP hat eine feste IP von 192.168.1.2, mit Netzmaske 255.255.255.0, und kein Gateway.

Ich benutze Netcat (im TCP-Protokoll-Modus) in meinem Laptop, um Befehle an die Karte in diesem Format im Terminal zu senden: echo '580112000000016C' | xxd -r -p | nc 192.168.1.4 3000 Woher weiß ich, dass es funktioniert? Nun, im Grunde sind die Relais von einer sekundären Platine erfolgreich eingeschaltet ("SainSmart 16-Channel 12V Relay Module").

Es gibt eine Liste von Hex-Befehlen zum Ein- und Ausschalten jedes Relais. In der vorherigen Anweisung sage ich dem Board, die Relay-Nummer 1 einzuschalten und die anderen 15 auszuschalten. Die Zeichenfolge '580112000000016C' wird mit xxd von hex in binär konvertiert und dann in das netcat gesendet. Dieser Teil funktioniert.

Die einzige Anweisung, die nicht funktioniert, ist diese: Echo '580113000000006C' | xxd -r -p | nc 192.168.1.4 3000 Diese Anweisung fragt nur die Karte, welche Relais gerade aus sind und erwartet eine Antwort in diesem Format: 28 01 00 00 00 XX XX HH (XX XX 16 Bit, jedes Bit repräsentiert ein Relais Zustand, "1" zeigt an, "0" gibt OFF an; HH ist die Summe aller vorherigen Daten zusammen, dh es funktioniert als Prüfsumme.)

Ich habe bereits getestet und bewiesen, dass dies kein Problem ist Die Tafel. Ich habe einen Code in visual basic geschrieben, und Windows konnte die Antwort von der Tafel bekommen, aber in meiner ubuntu-Konfiguration stimmt etwas nicht. Ich habe bereits meine Firewall deaktiviert, ufw. Dies ist kein Problem mit dem Ethernet-Kabel. Ich habe bereits andere Befehlsdarstellungen versucht, wie zum Beispiel: echo -n '5801100000000069' | xxd -r -p | nc -v -n -w3 192.168.1.4 3000 | xxd Ich habe bereits netcat verwendet, um alle verfügbaren Ports auf der Platine zu scannen, und nur der Port 3000 wird als verfügbar angezeigt, wie vom Hersteller angegeben. Dies scheint jedoch ein Netzwerkkonfigurationsproblem zu sein, aber in Windows habe ich die gleiche IP und Netzmaske wie in Ubuntu angegeben.

Was vermisse ich hier?

Antwort

0

Netcat wartet auf ein EOF-Zeichen, das niemals von der iMatic-Karte gesendet wird. Das erklärt, warum netcat die Antwort nie erhalten kann.

Auf der anderen Seite schrieb ich ein Python-Skript (Python 2.7.6), das die Daten von der iMatic-Karte erfolgreich empfängt, nachdem es eine bestimmte Anweisung gesendet hat. Hier ist sie:

import socket 
import binascii 

IPADDR = '192.168.1.4' 
PORTNUM = 3000 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((IPADDR, PORTNUM)) 
data = '5801100000000069'.decode('hex') 
s.send(data) 
response= s.recv(8) #Buffer needs to be 8 for the fastest response without losing information 
print binascii.hexlify(response) 
s.close() 

Sie das Board jetzt ohne Router verwenden können, und direkt an einen beliebigen Computer über ein Ethernet-Kabel verbunden sind.

Grüße, Bernext.