Ich benutze in einer Java App die BlueCove Bibliothek um einen Bluetooth HID Dienst zu erstellen. Dabei habe ich das Problem, dass das Bluetooth Attribut "ClassDescriptorData" im Attribut "HIDDescriptorList" nicht korrekt von der Bibliothek interpretiert wird.
Die Hid Spec auf Seite 87 sagt dazu:
Zum einfachen Testen habe das erstmal mit konstanten Dateninhalt in verschiedenen Zahlenbereichen umgesetzt (der Dateninhalt des Descriptors ist nicht "gültig", würde der Bluetooth Stack sagen wenn sich ein Client darauf verbindet)
Gemäß der BlueCove Beschreibung der Datentypen füge ich ein String Element hinzu, wobei die Bytes gemäß dem "ISO_8859_1" Encoding als einzelne Bytes enthalten sein sollten.
Das Ergebnis wenn ich das Attribut "HIDDescriptorList" des so konfigurierten/erstellten Bluetooth Service von der sddb auf meinen RPi4 mit Raspbian GNU/Linux 10 (buster) in XML zurücklese ist:
Irgendwie erweitert das Encoding (das eigentlich nur ein Byte benutzen darf) alle negativen Byte-Werte um ein zweites vorangestelltes Byte?!
Warum passiert das? Gibt es ein anderes Encoding das wirklich nur ein Byte benutzt?
Liegt das vielleicht am XML export?
Oder habe ich die Spec missverstanden? Wenn ich die Bytes nicht als Byte sondern als Ascii Symbole (0-f) übergebe, fehlt im XML die Angabe "encoding="hex"". Das scheint mir aber auch falsch zu sein, weil in allen Beispielen für XML Descriptoren dieses Attribut immer "encoding="hex"" enthält.
Die Hid Spec auf Seite 87 sagt dazu:
Ich soll also einen String bereitstellen, der aus unsigned Bytes bestehen soll.The second element, called ClassDescriptorData, is a byte array that contains the descriptor identified by the first element. Descriptors are 8-bit unsigned arrays (Data Element Type = Text String (4), Data Element Size = array (5, 6, or 7)).
Zum einfachen Testen habe das erstmal mit konstanten Dateninhalt in verschiedenen Zahlenbereichen umgesetzt (der Dateninhalt des Descriptors ist nicht "gültig", würde der Bluetooth Stack sagen wenn sich ein Client darauf verbindet)
Java:
byte[] test = new byte[]{(byte)0x01,(byte)0x05,(byte)0x08,(byte)0x7f,(byte)0x80,(byte)0x81, (byte)0xc0,(byte)0xa5};
btHIDDescriptor.addElement(new DataElement(DataElement.STRING, new String(test, StandardCharsets.ISO_8859_1)));
Gemäß der BlueCove Beschreibung der Datentypen füge ich ein String Element hinzu, wobei die Bytes gemäß dem "ISO_8859_1" Encoding als einzelne Bytes enthalten sein sollten.
Das Ergebnis wenn ich das Attribut "HIDDescriptorList" des so konfigurierten/erstellten Bluetooth Service von der sddb auf meinen RPi4 mit Raspbian GNU/Linux 10 (buster) in XML zurücklese ist:
XML:
<attribute id="0x0206">
<sequence>
<sequence>
<uint8 value="0x22" />
<text encoding="hex" value="0105087fc280c281c380c2a5" />
</sequence>
</sequence>
</attribute>
Irgendwie erweitert das Encoding (das eigentlich nur ein Byte benutzen darf) alle negativen Byte-Werte um ein zweites vorangestelltes Byte?!
Warum passiert das? Gibt es ein anderes Encoding das wirklich nur ein Byte benutzt?
Liegt das vielleicht am XML export?
Oder habe ich die Spec missverstanden? Wenn ich die Bytes nicht als Byte sondern als Ascii Symbole (0-f) übergebe, fehlt im XML die Angabe "encoding="hex"". Das scheint mir aber auch falsch zu sein, weil in allen Beispielen für XML Descriptoren dieses Attribut immer "encoding="hex"" enthält.