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 solltensendall
stattsend
um sicherzustellen, dass die ganze verpackt übermittelt wird, wie ich bereits in der Antwort zu Ihrem Kommentar auf meine Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
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...:
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/... .Nur codieren, die hex-Daten in eine Zeichenfolge:
str
nicht darum kümmern, ob oder nicht, es ist ASCII; nur Dinge wieprint
tun.