Ich hab hier ein Pulsoxymeter welches eine Serielle Schnittstelle hat
und per USB und Bluetooth erreichbar ist.
Ich habe den original demo source code gefunden, weil der Hersteller den
offenbar mit in den Installer der Binaries gepackt hat.
Allerdings werden hier nur 4 Befehle verwendet.
Durch ausprobieren hab ich schon ein paar mehr herausgefunden, aber
dieses Protokoll ist so verwirrend und immer etwas anders, dass ich
gerne mal eine komplette Referenz hätte.
Der Hersteller scheint seit ein paar Jahren im U-Boot Modus zu sein und
antwortet auf keine Mails.
Ein paar Informationen zu dem Gerät findet man auf
https://fccid.io/P6S-RX101
Im inneren werkelt ein TI MSP430F247.
Ich glaube, dass sie ein eigenes Protokoll entwickelt haben und hab
daher wenig Hoffnung, dass ich das komplett entschlüsseln kann. Zumal
ich auch schon einmal das Gerät eingefroren hab und nur durch Zufall
wieder resetten konnte (Ich könnte zwar auch die Batterie ablöten und
mir so einen Hardreset bauen...).
Was mich wirklich interessieren würde, sind Befehle mit denen ich auf
dem Gerät schreiben kann.
Aber zum Protokoll selber: lt. dem original Source code ist das ganze
Paket basiert und Pakete sind immer 9 Byte lang.
Das Format ist in etwa
1 | | Type | Signflag | Data_0 | Data_1 | .... | Data_6 |
|
Das Signflag ist dabei am MSB immer 1 und wenn das i-te bit 0 ist, dann
wird von Data_i 128 abgezogen.
Um zu senden, setzt man den Typ auf 0x7d und in Data_0 wird dann der
request geschrieben. Die anderen Data bytes sind 0.
Ein Command lt. original Source ist zB;
1 | 0x7d 0x81 0xa1 0x80 0x80 0x80 0x80 0x80 0x80
|
Das signflag ist hier 0b10000001, also bleibt 0xa1 und 0x80 wird zu 0x00
dekodiert.
Allerdings scheint die Länge vom Paket nicht immer 9 byte zu sein. Ich
hab Antworten gesehen die nur 8 byte, 4byte oder sogar nur 2 byte sind.
Die Länge wird allerdings scheinbar nirgends kodiert.
Ebenfalls reagiert das Gerät auf Kommandos mit unterschiedlicher Länge
gleich. dH man kann die 6byte padding hinten einfach weglassen und es
klappt trotzdem.
Auf Anfrangen im Data_0 reagiert das Gerät zwischen 0x00 und 0x7f gar
nicht, ab 0x80 gibt es bei Befehlen die es gar nicht kenn ein 0x0b 0x81
0xNN 0x85 zurück, 0xNN ist dann das was man gefragt hat.
Ab 0xa0 kommen dann die funktionierenden Befehle und am 0xb1 geht wieder
nix.
Ich hab auch probiert das Sign Flag auf 0x80 zu setzn. Dann erhält man
wieder zwischen 0x00 und 0x7f keine Antwort und zwischen 0x80 und 0xff
nur den Fehlercode.
Ist das also - wie ich vermute - ein selbstgebasteltes Protokoll oder
gibt es da tatsächlich irgendwo Anhaltspunkte welche Befehle man
probieren könnte?