Python Programmierung TCP/IP / UNSPEC

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
jann0r
User
Beiträge: 7
Registriert: Dienstag 28. November 2023, 11:55

Hallo zusammen,

ich starte gerade in die Python Programmierung und habe direkt ein Problem, für das ich bis dato keine Lösung finden konnte.

Ich möchte mittels TCP/IP mit einem externen Gerät kommunizieren. Das Funktioniert mittels TeraTerm (Terminal Emulator) wunderbar. Dort muss ich als "Protocol" UNSPEC angeben. Dort bekomme ich dann vom externen Gerät saubere Antworten. Über welche Methode lässt sich das mittels Python realisieren? Mein Versuch war aus dem PythonWiki kopiert:

#!/usr/bin/env python

import socket


TCP_IP = '127.0.0.1'
TCP_PORT = 5005
BUFFER_SIZE = 1024
MESSAGE = "Hello, World!"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(MESSAGE)
data = s.recv(BUFFER_SIZE)
s.close()

print "received data:", data

wobei ich die IP/Port natürlich ersetzt habe.

VIele Grüße,

Jannßr
jann0r
User
Beiträge: 7
Registriert: Dienstag 28. November 2023, 11:55

Zur Vervollständigung hier die Einstellungen in TeraTerm:

Bild
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

UNSPEC ist kein Protokoll, sondern steht fuer "unspezifiziert". Also nix. Was deinen Code angeht, enthaelt der die ueblichen zwei Fehler:

- send statt sendall zu benutzen, was nicht grarantiert, das alle Daten abgeliefert werden.
- recv zu benutzen mit einer Buffergroesse, das aber auch nicht garantiert, alle Daten zu bekommen. Da bietet sich socket.makefile an, um dann mittels "read(BUFFER_SIZE)" arbeiten zu koennen.

Und dann ist die Frage, was du hier erwartest. Wir kennen das Geraet ja nicht. Welches Protokoll spricht das denn? Denn auch wenn in TeraTerms keines angegeben ist, dann unterliegt dem eins. ZB fehlt bei dir wahrscheinlich ein Zeilenendezeichen. Und einlesen muss ggf. auch bis zum Zeilenende erfolgen. ZB via readline, wenn man das erwaenhte makefile benutzt hat.
jann0r
User
Beiträge: 7
Registriert: Dienstag 28. November 2023, 11:55

Hi,

danke für deine Hilfe. EtherNet/IP ist das Protokoll - bis eben wusste ich nicht, dass es sich dabei um ein Protokoll handelt... Das erklärt es vermutlich auch.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@jann0r: EtherNet und IP sind *zwei* Protokolle. Und beides beantwortet nicht die Frage welches Protokoll das Gerät dann *über* diese Protokolle spricht. Das ist geschichtet. Ethernet ist das Protokoll das zwischen der Hardware (Ethernet-Port) gesprochen wird. Darüber läuft dann IP was die Betriebssysteme miteineinander sprechen. Und nun ist die Frage was die Anwendung(en) auf beiden Geräten miteinander für ein Protokoll über TCP/IP sprechen. In Tera Term hast Du ”unspezifiziert” ausgewählt, das heisst Tera Term macht da nichts weiter als das einfach an Dich als Person durchzureichen. Und da ist jetzt die Frage welches Protokoll *Du* mit der Software auf der anderen Seite der Verbindung sprichst.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
jann0r
User
Beiträge: 7
Registriert: Dienstag 28. November 2023, 11:55

Wenn Wikipedia nicht lügt, ist Ethernet/IP sehr wohl ein Protokoll: EtherNet/IP (EtherNet Industrial Protocol, oft auch nur EIP genannt) ist ein Echtzeit-Ethernet, welches hauptsächlich in der Automatisierungstechnik verwendet wird.

https://de.wikipedia.org/wiki/EtherNet/IP
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Niemand hat behauptet, das es keine Protokolle waeren. Es sind aber nicht die Protokolle, die hier relevant sind. Sondern was - aufsetzend auf TCP/IP - dein Gereaet fuer eines spricht. Der Frage sind wir kein Stueck naeher, aber schoen, dass du die Wikipedia zitierst hast, obwohl's da keinen Dissenz gab...
jann0r
User
Beiträge: 7
Registriert: Dienstag 28. November 2023, 11:55

Ich habe das nicht gemacht um hier wen zu ärgern, sondern, weil ich es nicht besser weiß. Es gibt in den technischen Unterlagen dazu auch keine weitere Angabe, sowohl im Handbuch, als auch im Katalog nicht:

Bild
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich denke das hier sollte es sein: https://www.keyence.de/download/downloa ... Type=de-DE

Allerdings mag ich mich nicht registrieren, nur um so ein PDF runterzuladen, das muesstest du machen.

Da aber laut deinem Auszug auch eine RS232-Schnittstelle angeboten wird, vermute ich mal stark, dass Befehle (und Antworten) eben mit einem Zeilenende-Zeichen versehen sein muessen, um akzeptiert zu werden. Also

Code: Alles auswählen

"mein befehl\r\n"  #(Windows-Style)
"mein befehl\n" # (UNIX-Style)
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@__deets__: Naja doch: Ich wusste nicht, dass das *ein* Protokoll ist was tatsächlich „EtherNet/IP“ heisst und nicht einfach IP über Ethernet meint. Und das ist ein Anwendungsschicht-Protokoll, das ist nicht mehr Transportschicht.

@jann0r: Ich frage mich aber ob das hier wirklich eingesetzt wird, denn ich sehe nicht wie *das* mit Tera Term und einem unspezifizierten Protokoll funktionieren soll.

Es bleibt also weiterhin die Frage was das da tatsächlich für ein Protokoll spricht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@__blackjack__: ok, das ist an mir vorbeigegangen, dass es um EIN vs ZWEI Protokoll(e) ging. Mea culpa.
jann0r
User
Beiträge: 7
Registriert: Dienstag 28. November 2023, 11:55

__deets__ hat geschrieben: Dienstag 28. November 2023, 15:45 Ich denke das hier sollte es sein: https://www.keyence.de/download/downloa ... Type=de-DE

Allerdings mag ich mich nicht registrieren, nur um so ein PDF runterzuladen, das muesstest du machen.

Da aber laut deinem Auszug auch eine RS232-Schnittstelle angeboten wird, vermute ich mal stark, dass Befehle (und Antworten) eben mit einem Zeilenende-Zeichen versehen sein muessen, um akzeptiert zu werden. Also

Code: Alles auswählen

"mein befehl\r\n"  #(Windows-Style)
"mein befehl\n" # (UNIX-Style)
Das kläre ich, aber soweit ich mich erinnere nicht. Das mit dem TeraTerm habe ich selbst getestet. Es gibt ein "CR" als Prüfzeichen, aber das musste ich nicht senden.

Ich versuche das nochmal über einen anderen Weg zu klären, würde euch aber teilhaben lassen :)

Vielen Dank schonmal!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na hast du im TeraTerm Enter gedrueckt, wenn du dein Kommando abgeschickt hast? Dann war da auch \n oder \r\n implizit dabei.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@jann0r: CR Prüfzeichen? Wenn das am Ende ist, dann ist das „carriage return“ und kein ”Prüfzeichen”. CR ist dafür die übliche Abkürzung aus dem ASCII-Standard und das fällt unter „Steuerzeichen“. Siehe auch https://de.wikipedia.org/wiki/American_ ... nterchange
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
jann0r
User
Beiträge: 7
Registriert: Dienstag 28. November 2023, 11:55

__deets__ hat geschrieben: Dienstag 28. November 2023, 16:32 Na hast du im TeraTerm Enter gedrueckt, wenn du dein Kommando abgeschickt hast? Dann war da auch \n oder \r\n implizit dabei.
Exakt, habe ich :) Das müsste dann hinter jedem meiner geschickten Befehle stehen?
__blackjack__ hat geschrieben: Dienstag 28. November 2023, 17:12 @jann0r: CR Prüfzeichen? Wenn das am Ende ist, dann ist das „carriage return“ und kein ”Prüfzeichen”. CR ist dafür die übliche Abkürzung aus dem ASCII-Standard und das fällt unter „Steuerzeichen“. Siehe auch https://de.wikipedia.org/wiki/American_ ... nterchange
Ja, völlig korrekt, Prüfzeichen ist natürlich quatsch.

Vielen Dank für euren Input :)
Antworten