2017-12-07 3 views
0

SAAT-520Wireless-Communication-Programming-Development-Protocol Ich habe versucht, Lowlevel-Befehle an meine RFID zu senden, um Geräteinformationen zu erhalten. Ich benutze wireshark, um die Verbindung zu klopfen und es scheint in Ordnung zu sein, da Pakete scheinen, von meinem PC zu RFID-Gerät zu kommen und umgekehrt.RFID mit Python-Socket (Low-Level-Befehle)

Aber ich kann keine Antwort oder Ausgabe in meinem Programm sehen. Auf dem Gerät habe ich einen Antwortbefehl, ich bin mir nicht sicher, ob ich und/oder wo ich die Befehlsantwort verwenden kann.

Import socket 

TCP_IP = '192.168.0.238' 
TCP_PORT = 7086 
BUFFER_SIZE = 20 
MESSAGE = '0x55, 0x00~0xFF, 0x01, 0x00, 0x00~0xFF' 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
try: 
    s.connect((TCP_IP, TCP_PORT)) 
except: 
    print ('failed' + TCP_IP, 'down') 
s.sendall(MESSAGE) 
data = s.recv(BUFFER_SIZE) 
s.close() 
print 'received', repr(data) 

Ich verstehe nicht, warum es keine Antwort von meinem Programm gibt. Kein Fehler oder Programm ist erfolgreich. Nur Prozess endet nie.

Die Befehle für Befehle finden Sie auch im Anhang.

Systeminformationen Abfragebefehl (0x01H)

img1

Befehl Antwort

img2

+0

Ich denke, Sie senden Format kann falsch sein, ich denke, Sie wollen eine Liste von Zeichenfolgen, nicht ein einziges stark mit Kommas. Lassen Sie es mich wissen, wenn Sie noch Hilfe benötigen, und ich werde meinen Code überprüfen, um zu überprüfen. – SteveJ

+0

Vielen Dank, ich würde mich über Ihre Hilfe freuen. Irgendwie scheint dieser Code von mir keine Antwort zu bekommen –

+0

Ich war falsch - Komma Liste ist, wie ich es auch tue. Sehen Sie sich jedoch Ihre Nachrichtendaten an. Ich glaube nicht, dass Sie buchstäblich '0x00 ~ 0xFF' eingeben sollten. Ich denke, das bedeutet, dass Sie einen einzelnen Wert in diesem Bereich benötigen. Finden Sie in der Dokumentation ein Beispiel für ein erfolgreiches Sendepaket? – SteveJ

Antwort

0

(Aus Ihrer Frage)

s.sendall(MESSAGE) 
data = s.recv(BUFFER_SIZE) 
s.close() 

Sie sind Daten über send senden, sofort Fragen Sie nach den Antwortdaten und schließen Sie dann den Socket. Es ist noch nicht genug Zeit vergangen, um eine Antwort zu erhalten. Versuchen Sie zu Testzwecken eine Zeitverzögerung zwischen.

import time 
s.sendall(MESSAGE) 
time.sleep(5) 
data = s.recv(BUFFER_SIZE) 
print(data) 
s.close() 

Sie können auch auf die eingehenden Daten warten;

import time 
s.sendall(MESSAGE) 
while data is None: 
    data = s.recv(BUFFER_SIZE) 
    print "No data, waiting...." 
    time.sleep(0.5) 

print "Data arrived" 
incoming = data.decode('utf-8') 
print incoming 
# Process Data 

Ich habe persönlich ein Problem, wenn meine Puffergröße zu klein war - ich damit zu tun hatte, um die Timeout-Ausnahme abfangen. Vielleicht versuchen Sie, Ihre Puffergröße zu erhöhen.

Unten ist etwas in der Nähe des tatsächlichen Codes, den ich für meine Anwendung verwende; Es Python 3.x, und Sie müssen es ein wenig konditionieren - aber es funktioniert für mich.

  try: 
       data = s.recv(buf_len) 
       if data is not None and len(data) > 0: 
        while True: 
         new_data = s.recv(buf_len) 
         if new_data is None or len(new_data) == 0: 
          break 
         data = data + new_data 

      except socket.timeout: 
       if data is not None and self.callback is not None: 
        logger.debug(f"Received packet: {data}") 

incoming = data.decode('utf-8') 
print incoming 
# Process Data     
+0

Programm läuft noch, aber keine Ausgabeantwort, wie zuvor. Sollte ich data.decode ('utf-8') verwenden, um meine Ausgabe in Zeichenfolge zu erhalten? Und am'i fehlende Befehlsantwort? –

+0

Ich muss es tatsächlich entschlüsseln - ich habe meine Antwort aktualisiert. – SteveJ

+0

Ich benutze Python 2.7 und immer noch bekomme ich keine Antwort. Nähte wie ich etwas vermisse. \t Ich habe auch versucht, andere Befehle zu senden, um mein Gerät zu aktivieren, funktioniert aber nicht. Sie erhalten eine Antwort für den Code? –