Hallo,
ich versuche gerade für einen Bekannten ein kleines Python-Programm zu schreiben. Er hat eine Fitdays-Waage, welche ihre Messwerte per BLE an ein Smartphone überträgt. Er würde diese Werte jetzt aber gerne auch mit seinem Pi 4B empfangen. Anscheinend gibt es mehrere alternative, herstellerunabhängige Apps für diese Art Waagen. Also sollte man davon ausgehen dürfen, dass die Übertragung nicht besonders abgesichert ist. Jetzt bin ich im Thema Low Energy nicht gerade sehr fit. Die Waage wird von hcitool lescan auf jeden Fall mal gefunden. sudo gatttool b <mac> -I funktioniert zwar, der Befehl connect scheitert aber nach einiger Zeit mit der Meldung "Connection refused". Bei weiteren Versuchen erfolgt ein Input/Output Error bis man hciconfig hci0 reset ausführt. Jetzt habe ich folgendes Script geschrieben:
from bluepy.btle import Scanner, DefaultDelegate
class ScanDelegate(DefaultDelegate):
def __init__(self):
DefaultDelegate.__init__(self)
def handleDiscovery(self, dev, isNewDev, isNewData):
if isNewDev:
text=(f"Gerät gefunden:{dev.addr}\n"
f"Adress-Typ: {dev.addrType}\n"
f"connectable:{dev.connectable}\n"
f"Signal:{dev.rssi}dB")
print(text)
elif isNewData:
data=f"Broadcast empfangen von {dev.addr}({dev.getValueText(9)}):"
for value in dev.getScanData():
data=f"{data}\n{value}"
print(data)
scanner = Scanner().withDelegate(ScanDelegate())
while True:
scanner.start()
devices = scanner.process(3600.0)
scanner.stop()
Alles anzeigen
das ausführen (mittels sudo) ergibt folgendes:
ZitatGerät gefunden:a0:91:53:e2:58:db
Adress-Typ: public
connectable:False
Signal:-73dB
Und beim Wiegen das:
ZitatBroadcast empfangen von a0:91:53:e2:58:db(AAA006):
(1, 'Flags', '04')
(3, 'Complete 16b Services', '0000ffb0-0000-1000-8000-00805f9b34fb')
(255, 'Manufacturer', 'aca0db58e25391a0a0c9c2780db0')
(9, 'Complete Local Name', 'AAA006')
Da connectable=false ist, gehe ich nach einiger Recherche davon aus, dass die Waage ihre Daten nur per Advertisment überträgt. Und so wie ich das sehe und verstehe, können sie nur in den Manufacturer Data enthalten sein. Jetzt stellt sich mir nur die Frage wie das zu entschlüsseln ist. Zunächst mal bleibt die Länge der Manufacturer-Daten immer gleich (112 bit), egal ob Körpermesswerte (Wasser, Fett, Knochen) mit gemessen wurden oder nur das Gewicht. Dann ist die Mac-Adresse der Waage enthalten, so das nur noch 16 bit vor und 48 bit nach der Mac für Nutzdaten bleiben. Da die Mac-Adresse "verkehrt herum" ist vermute ich mal es handelt sich um Little Endian-Datentypen. Aber egal ob Big oder Little und ob float oder integer oder sonst was (auch nicht ASCII oder UTF-8), ich bekomme aus diesem Bit-Salat egal mit welchen offset ich das auswerten will nichts brauchbares heraus. Da ich aber auch nur viel vermute und wenig weiß hoffe ich jetzt auf einen Tipp von euch. Hat irgend etwas von dem was ich da tue Hand und Fuß? Oder muss man doch irgendwie mit dem Gerät verbinden um Services und characteristics auslesen zu können? Kann man aus den Manufacturer-Daten irgendwas heraus lesen?
Danke schon mal für Tipps