Montag, Mai 25, 2020

python-senden/empfangen von hex-Daten über TCP-socket

Habe ich ein ethenet access control Gerät, das angeblich in der Lage zu kommunizieren über TCP.


Wie kann ich senden Sie ein pachet durch die Eingabe der HEX-Daten, da dies ist, was ich von Ihr Handbuch (standard-format für die Kommunikation empfangene und gesendete Pakete nach jedem Befehl)

Können Sie bitte zeigen Sie einige Beispiel-code oder links, um zu beginnen….

standard zurück Paket vom terminal 
Größe (bytes) 
BS (0x08) : ASCII-Zeichen 1 
STX (0x02) : ASCII-Zeichen 1 
LÄNGE : die Länge von BS ETX 4 
TID : system-einzigartig I. D. 1 
ERGEBNIS 1 
DATEN : zurückgegebene parameter N 
PRÜFSUMME : byte-Summe von BS-DATEN 1 
ETX (0x03) : ASCII-Zeichen 1 
Standard-Befehls-Paket zum terminal 
Größe (bytes) 
ACK (0x06) : ASCII-Zeichen 1 
STX (0x02) : ASCII-Zeichen 1 
LÄNGE : die Länge von der ACK ETX 4 
TID : system-einzigartig I. D. (ex: 1) 1 
BEFEHL 1 
Access Key(Optional) 6 
DATEN : Befehl parameter N 
PRÜFSUMME : byte-Summe von ACK nach DATEN 1 
ETX (0x03) : ASCII-Zeichen 1 

Dieses Paket aus startet ACK. 
In diesem Paket werden mehrere byte-Wert gestartet werden muss von MSB. 
Zum Beispiel, wenn die Länge war 10, LÄNGE 0x00 0x00 0x00 0x0a. 
  • und wenn ich die gesendeten Daten mit s.senden, bekomme ich die Antwort von s ist.recv, wie kann ich zeigen, was kommt zurück in HEX mit „drucken“ ?
  • verwenden Sie struct.unpack (für die 8-byte-start-der-Antwort-Paket) – wieder, um sicherzustellen, dass Sie immer die ganze Antwort ist der Schlüssel, wie TCP ist ein stream-Protokoll, NICHT ein Datagramm-Protokoll, so könnte beliebig kürzen Dinge-wahrscheinlich nicht, aber warum das Risiko eingehen? Genauso, wie Sie Sie verwenden sollten sendall statt send um sicherzustellen, dass die ganze verpackt übermittelt wird, wie ich bereits in der Antwort zu Ihrem Kommentar auf meine Antwort.
InformationsquelleAutor Mike | 2010-03-14

2 Kommentare

  1. 4

    Ich würde verwenden struct.pack zur Vorbereitung der string von bytes zu senden, aus den Daten, die Sie senden möchten. Werden Sie sicher, dass zum start der Verpackung-format mit > zu bedeuten, Sie wollen „big-endian“ Bestell-und standard-Größen, da Sie dokumentieren, dass so klar!

    So (ich weiß nicht, was „optional“ bedeutet, dass für den Zugriff auf die Schlüssel nehme ich an, dass es bedeutet, dass das Feld werden alle null-bytes wenn Sie keinen Zugriff auf die Schlüssel), wenn „Daten“ ist bereits ein string von bytes und „Befehl“ eine kleine Ganzzahl zum Beispiel, etwas wie…:

    def stringfor(command, data, accesskey='\0'*6, tid=1):
      length = 16 + len(data)
      prefix = struct.pack('>BBIBB6s', 6, 2, length, tid, command, accesskey)
      checksum = sum(ord(c) for c in prefix) &0xFF
      return prefix + chr(checksum) + chr(3)
    • sehr schön 🙂 danke. und dann senden Sie diese mit s an.schicken???
    • sicher, oder s.sendall (wahrscheinlich besser als Sie sein wollen, 100% sicher, dass alle das Paket gesendet wird — aber dann die MTU der Verbindung ist wohl groß genug, dass dies keinen Unterschied macht), finden Sie unter docs.python.org/library/… .
  2. 6

    Nur codieren, die hex-Daten in eine Zeichenfolge:

    '\x34\x82\xf6'
    • und wenn die hex-Daten nicht über ein ASCII-äquivalent ist das ein problem ?
    • Sie repräsentieren die raw-bytes. str nicht darum kümmern, ob oder nicht, es ist ASCII; nur Dinge wie print tun.

Kostenlose Online-Tests