Wie verpacke ich Befehle, um sie an ein Modem zu senden?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tobitobitobi123
User
Beiträge: 3
Registriert: Mittwoch 1. Februar 2017, 13:34

Hallo Forum!

Ich arbeite gerade an an einem kleinen "Reverse Engineering"-Projekt, wo ich die Kommunikation zwischen Steuerungs-PC und Modem entschlüsseln möchte. Die Kommunikation erfolgt über eine Serielle Schnittstelle. Mein Ansatz ist einfach einzelne Befehle auszuführen und abzuhören, was hin- und hergeschickt wird. Dies hat mit dem Modul PySerial so weit geklappt und ich habe jeweils bytestrings aus Hexadezimalen Code, gemischt mit ASCII-Zeichen erhalten, wie zum Beispiel

Code: Alles auswählen

b'\x1d\x1d\x11\xf2\x1dQ\xfa\x1d0\xff\x1d0\xf0}\x10\xf0=p\xe5=Q\xe5=Q\xe5=0\xe5!'
Nun versuche ich mit meinem eigenen PC die Steuerungssoftware zu imitieren. Beispielbefehle, die ich testen möchte, habe ich bereits vorbereitet. Wie das geht habe ich auch geklärt, nämlich mit serial.write von PySerial. Meine Frage ist nun:
In welchem Format kann das Modem mich verstehen?
Reicht es, wenn ich die ASCII-Zeichen im oben genannten bytestring in Hexadezimal konvertiere (sodass alles gleich codiert ist) und losschicke? Oder funktioniert nur Binärcode?
In beiden Fällen: wäre das dann als bytestring, string oder integer?
Und wenn die Antwort vom Modem abhängen sollte: wie finde das am besten heraus? In der Anleitung steht so etwas natürlich nicht.

Es wäre super, wenn mir jemand einen Tipp geben könnte. Vielen Dank im Voraus!

Tobi
BlackJack

@tobitobitobi123: Wenn das da Daten sind die Du abgefangen hast, dann erwartet das Modem(?) genau solche Daten. `Serial.write()` erwartet Bytes, denn das ist alles was grundsätzlich über so eine serielle Schnittstelle versendet werden kann.
tobitobitobi123
User
Beiträge: 3
Registriert: Mittwoch 1. Februar 2017, 13:34

BlackJack hat geschrieben:@tobitobitobi123: Wenn das da Daten sind die Du abgefangen hast, dann erwartet das Modem(?) genau solche Daten. `Serial.write()` erwartet Bytes, denn das ist alles was grundsätzlich über so eine serielle Schnittstelle versendet werden kann.
Vielen Dank für die Antwort. Okay, also dann wäre es also schon einmal ein Bytestring, was ich versende?

Mein Problem ist jetzt nur noch dieses, das hab ich in meiner Frage etwas schlecht verpackt: So weit ich das verstehe, ich mein Mix aus Hex und ASCII nur das, was Python interpretiert hat und anzeigt - es sich hierbei also gar nicht um das "Rohformat", was ich benötige handelt. Also dass Python mir alle Hexadezimalen Codes bis 255 automatisch zu ASCII umwandelt, wie in meinem empfangenen Beispielcode. Stimmt das?
BlackJack

@tobitobitobi123: Das ”Rohformat” kannst Du ja gar nicht eingeben und Python (oder irgendein anderes Programm) gar nicht ausgeben, denn wie sollte ein Nullbyte denn auch angezeigt werden. Und bei allem ausserhalb von ASCII müsste man die Kodierung dazu sagen/wissen. Darum stellt Python ASCII-Werte als die entsprechenden Zeichen dar und alles ausserhalb von ASCII als Hex-Escape. Ausgenommen ein paar andere spezielle Escapes wie beispielsweise den Zeilenvorschub ('\n') oder den Wagenrücklauf ('\r').

Das was Da ausgegeben wurde kannst Du auch genau so eingeben. Also zum Beispiel in den Quelltext kopieren. Du kannst aber auch alles als Hex-Escapes angeben wenn Du magst. Oder mittels `bytes()` aus einer Liste (oder anderen iterierbaren Objekten) mit Bytewerten erstellen. Die wiederrum kannst Du als dezimale, hexadezimale, oktale, oder binäre Zahlliterale angeben.
tobitobitobi123
User
Beiträge: 3
Registriert: Mittwoch 1. Februar 2017, 13:34

BlackJack hat geschrieben:@tobitobitobi123: Das ”Rohformat” kannst Du ja gar nicht eingeben und Python (oder irgendein anderes Programm) gar nicht ausgeben, denn wie sollte ein Nullbyte denn auch angezeigt werden. Und bei allem ausserhalb von ASCII müsste man die Kodierung dazu sagen/wissen. Darum stellt Python ASCII-Werte als die entsprechenden Zeichen dar und alles ausserhalb von ASCII als Hex-Escape. Ausgenommen ein paar andere spezielle Escapes wie beispielsweise den Zeilenvorschub ('\n') oder den Wagenrücklauf ('\r').

Das was Da ausgegeben wurde kannst Du auch genau so eingeben. Also zum Beispiel in den Quelltext kopieren. Du kannst aber auch alles als Hex-Escapes angeben wenn Du magst. Oder mittels `bytes()` aus einer Liste (oder anderen iterierbaren Objekten) mit Bytewerten erstellen. Die wiederrum kannst Du als dezimale, hexadezimale, oktale, oder binäre Zahlliterale angeben.
Super, das hilft mir weiter. War mir so nicht klar. Vielen Dank!
Antworten