Seite 1 von 1

Python3 - Telnet - ascii error

Verfasst: Freitag 30. Dezember 2022, 17:28
von DF7RG
Hallo Python Forum

Ich schlage mich jetzt schon Wochenlang mit einem Telnet Problem herum.
Ich weis im Prinzip das es ein Dekodierungsfehler ist, aber ich weis nicht wie ich das in meinem "3-Zeiler" entsprechend lösen kann.

Ich logge mich hier per Telnet bei dxc.pi4cc.nl 8000 per Telnet ein und empfange dann entsprechende Meldungen von PI4CC

Wenn ich den Telnet Befehl im Terminal eingebe, geht das einwandfrei, läuft tagelang...

Bei dem untenstehenden Python Script kommt es in unregelmässigen Abständen zu einer Fehlermeldung die etwas mit der Codierung zu tun hat.

Ich weis im Prinzip das es ein Codierungsfehler ist, ich habe aber Null Plan wie ich das lösen kann...

Eventuell kann mir hier jemand weiterhelfen. Bitte keine gut gemeinten Hinweise lese dies und das, ich habe bereits dies und das in den letzten Wochen gelesen und probiert, ich komme einfach nicht weiter.

Sollte mir tatsächlich jemand weiterhelfen können, ich habe kein Problem damit, dass ich dem Helfer ein paar "Unertl Weissbier" zukomme lasse :-))

Grüsse und einen guten Rutsch uns neue Jahr 2023

Georg

btw: Python Newbie - bis jetzt nur Excel VBA

---------------------------------------------------------------------
Code
--------

from telnetlib import Telnet

host = 'dxc.pi4cc.nl'
port = 8000
user = 'df7rg'

with Telnet(host, port) as tn:

tn.read_until(b"login: ")
tn.write(user.encode('ascii') + b"\n")

tn.interact()



Shell Ausgabe
-----------------------

DF7RG de PI4CC 30-Dec-2022 1504Z dxspider >
DX de OM1AN: 14081.8 G4WXZ tnx QSO 73 HNY Andy 1504Z
DX de IU3MAG: 10136.0 IZ0IMR CDM I* 1504Z
DX de F6KBK: 7059.0 F4GYM/P FFF 1799 1504Z
DX de CX8DS: 24936.0 IK3VUT cq 58 1504Z
DX de NB1N: 21027.2 HG5D YOTA CW TNX ES HNY! 1504Z
DX de K3LU: 18075.5 IZ8FAV 1504Z
DX de AA2AS: 28422.0 LU2TAO weak in NJ but workable 1504Z
DX de HS0YNM: 3573.0 RV9CX Thanks ft8 1504Z
Traceback (most recent call last):
File "/home/pi/.local/share/WSJT-X/telnetclient.py", line 13, in <module>
tn.interact()
File "/usr/lib/python3.7/telnetlib.py", line 553, in interact
sys.stdout.write(text.decode('ascii'))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 46: ordinal not in range(128)
>>>

Re: Python3 - Telnet - ascii error

Verfasst: Freitag 30. Dezember 2022, 17:59
von __deets__
Da das ASCII-encoding fest verdrahtet ist in der Bibliothek, kannst du das von außen nicht beeinflussen. Zusätzlich ist die Library inzwischen deprecated - wahrscheinlich wegen solchen Qualitätsmängeln.

Es gibt aber https://telnetlib3.readthedocs.io/en/la ... t.encoding - damit kannst du das passende encoding angeben. Musst den Code halt auf die Bibliothek umschreiben.

Falls der Fehler aber sporadisch vorkommt (und auch ein echter Fehler ist, weil die Frage ja ist: welches encoding soll es denn sein, oder ist das ein Fehler im System?), kannst du natürlich auch einfach den Fehler abfangen, und wieder von vorne aufsetzen. Falls der Datenverlust verschmerzbar ist.

Re: Python3 - Telnet - ascii error

Verfasst: Freitag 30. Dezember 2022, 18:02
von __blackjack__
@DF7RG: Da scheint Text zu kommen der nicht ASCII-kodiert ist. Das müsste ein Fehler auf der Gegenseite sein.

@__deets__: Telnet ist ASCII only soweit ich weiss. An sich also kein Problem da ASCII hart zu kodieren, solange die Gegenseite sich an die Spezifikation hält. Tut sie das nicht ist in der Tat die Frage nach der Kodierung interessant, denn die *müsste* ja ASCII sein.

Re: Python3 - Telnet - ascii error

Verfasst: Freitag 30. Dezember 2022, 18:51
von DF7RG
Hallo an die beiden Antworter.

Richtig glücklich bin ich jetzt nicht, hihi

Ich werd mir das auf der telnetlib3 Seite mal ansehen, eventuell komme ich da ja weiter.
Das ganze ist ja wie geschrieben nur sporadisch, geht mal 5 Minuten, geht aber auch 5 Stunden.
Ich habe hier das Gefühl, dass hier nach einer beliebigen Meldung mit einem bestimmten Zeichen einfach ein Zeichen kommt das sich mit Python nicht verträgt.

Es ist ja nicht so, dass es nicht funktioniert, wenn ich das ganze über die Konsole eingebe geht das ja tagelang.....

An dem Cluster, hier PI4CC.nl, wird man nix ändern, von diesen Clustern in der Art gibt es ja tausende weltweit, ist also mein Problem ... ;-(

Trotzdem, vielen Dank für die Rückmeldung, werd mal sehen wie ich zurechtkomme, wenn mal jemand im Oberbayrischen Raum ist, gibts auch die Belohnung mit dem "Unertl" :--)

Grüsse,
Georg

Re: Python3 - Telnet - ascii error

Verfasst: Freitag 30. Dezember 2022, 18:59
von __deets__
Die Konsole kennt halt keinen Abbruch durch Fehler. Aber sie kennt sehr wohl zB Terminal Kommandos, durch die dein Terminal dann in seltsame Modi verfallen kann. So Dinge sieht man, wenn man mal aus versehen ein binärfile via cat oder so ausgegeben hat. Könnte auch hier passieren. Das ist also immer noch ein Problem der Gegenstelle. Das du die nich beeinflussen kannst -klar. Aber Python macht da an sich nix falsch. Leider muss man dann eben drumrum arbeiten.

Wie gesagt, das einfachste ist ein abfangen & neu aufsetzen der Verbindung. Dann musst du am wenigsten machen. Wenn das hingegen darum geht so viel Daten wie möglich abzugreifen, dann ist der Ansatz, ein 8-Bit encoding wie zB iso8859-1 zu wählen, der bessere. Da hast du dann Texte mit ‘komischen” Zeichen drin, aber so kamen die halt an. Kann man nix machen.

Re: Python3 - Telnet - ascii error

Verfasst: Freitag 30. Dezember 2022, 19:24
von sparrow
@DF7RG: Das ist nicht wirklich ein Problem, das nur Python betrifft.

Um das ganze technisch ein bisschen einzugrenzen:
Eine Telnet-Verbindung verwendent als Kodierung ASCII. Das ist nicht besonders kompliziert. Über die Verbindung laufen Werte von 0 bis 127 und jedem Wert is ein Zeichen zugeodnet. Auf der Wikipedia-Seite kannst du eine Übersicht sehen. Die "berühmte" ASCII-Zeichentabelle. 128 Zeichen (davon 33 nicht druckbar sondern zu Steuerung) ist nicht besonders viel, wenn man bedenkt, dass unser Alphabet bereits über 50 Zeichen hat (Groß/Kleinbuchstaben) und man vielleicht auch das eine oder andere Satzzeichen da rein passen muss.
Das ist das, was über Telnet übertragen werden kann laut Spezifikation

Laut deiner Fehlermeldung ehälst du aber ein Byte mit dem Wert 0xa0 (also dezimal 160). 160 ist aber kein Wert 0-127.

Gibt es eine Spezifikation, was von da normalerweise kommt?

Re: Python3 - Telnet - ascii error

Verfasst: Freitag 30. Dezember 2022, 20:14
von DF7RG
Hallo sparrow

Ich muss zugeben, der Wald lichtet sich...
Das mit der ASCII Zeichentabelle ist mir schon klar, mir war aber jetzt nicht klar das Fehlermeldung 0xa0, also 160, nicht mehr in dem Wertebereich liegt. Hätte eigentlich selber drauf kommen können....

Was von da normalerweise kommt..... Spezifikation gibt es sicher, mindestens 35 Jahre alt, aber bewährt... Dieses Protokoll (DX-Cluster) gibt es seit Mitte der 80er Jahre und ist bei den Funkamateuren als sogenanntes DX-Cluster bekannt.
Das wurde mal von schlauen Leuten erfunden und gab es schon im sogenannten Packet Radio System mit 1200 Baud , Änderungen gibts da keine (oder mir nicht bekannt). Hier kommen im Prinzip nur Textmeldungen wie ganz oben aufgeführt.

Wenn jetzt da jemand auch Mist überträgt (was mit a/f Text möglich ist), dann kommt auch der Mist hinten raus....

Naja, ich werd mal sehen was ich daraus machen kann, eventuell lasse ich das Script über eine, ääähhmm Batch Datei ?? , eben halt mit Datei.sh laufen...


Recht herzlichen Dank nochmal an alle, sollte tatsächlich irgendwie eine andere Lösung funktionieren werd ich hier Meldung geben :-)

Viele Grüsse, oder wie heisst es bei den Funkamateuren, vy 73
Georg , DF7RG

Re: Python3 - Telnet - ascii error

Verfasst: Samstag 31. Dezember 2022, 19:28
von DF7RG
Hallo allerseits, speziell @ __deets__

Hab mir das heute alles nochmal durchgelesen.
Bitte halte mich jetzt nicht zu faul um was zu lesen oder zu suchen, aber das lässt mich nicht los...

Du schreibst

Zitat:
Wenn das hingegen darum geht so viel Daten wie möglich abzugreifen, dann ist der Ansatz, ein 8-Bit encoding wie zB iso8859-1 zu wählen, der bessere. Da hast du dann Texte mit ‘komischen” Zeichen drin, aber so kamen die halt an. Kann man nix machen.
Zitat Ende:

Kannst du mir bitte erklären wie ich diesen Zeichensatz, 8-bit encoding iso 8859-1, in meinen 3-Zeiler implementiere.

Mir reicht auch im Prinzip ein Suchbegriff oder eine Seite wo ich das nachlesen kann wie ich das machen soll.

Grüsse und einen guten Rutsch an alle

Georg

Re: Python3 - Telnet - ascii error

Verfasst: Samstag 31. Dezember 2022, 19:46
von __deets__
Das geht nur mit der alternativen Bibliothek, darauf musst du umstellen.

Gelöst - Re: Python3 - Telnet - ascii error

Verfasst: Donnerstag 19. Januar 2023, 10:56
von DF7RG
Problem gelöst !

Falls von allgemeinen Interesse, dieses Problem wurde zumindest für meine Anforderungen gelöst.

Bei der Fehlermeldung gibts ja den Hinweis wo die telnetlib abgespeichert ist und in welcher Zeile der Fehler auftritt.

Lösung

Zu allererst die Datei telnetlib unter einem anderen Namen sichern.
Die telnetlib im Editor öffnen, die betreffenden Zeilen suchen (hier Zeile 553 und 556) und in den betreffenden Zeilen den Begriff "ascii" gegen "latin-1" austauschen.
Datei speichern und fertig. Ist vermutlich eine Pfusch Lösung, aber funktioniert :-)

Bei meiner Anwendung läuft das jetzt seit einer Woche ohne Probleme

Re: Python3 - Telnet - ascii error

Verfasst: Donnerstag 19. Januar 2023, 11:06
von Kebap
Für Telnet empfehle ich Mudlet. Das ist zwar eigentlich für Textabenteuer gemacht, aber hat viel Funktionalität um dem veralteten Telnet Standard neues Leben einzuhauchen, diverse Textkodierungen darzustellen, Verbindungen verschlüsseln, übliche Tätigkeiten zu automatisieren und vereinfachen, lässt sich in Lua programmieren, uvm.