Bluetooth-Daten eines Sensors auswerten

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Taha
User
Beiträge: 4
Registriert: Freitag 10. Mai 2019, 12:48

Freitag 10. Mai 2019, 12:56

Hallo,

Wie schreibe ich ein Skript der Bluetooth-Daten eines Sensors, in meinem Fall: https://www.bosch-connectivity.com/medi ... otocol.pdf
empfängt und aus diesen Datenpaketen z.B. die Beschleunigungswerte liest. Würde mich über eine Antwort freuen.
__deets__
User
Beiträge: 5351
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 10. Mai 2019, 19:30

Mit so etwas hier & dann der Dokuementation deines Sensors folgen.

https://github.com/adafruit/Adafruit_Python_BluefruitLE
Taha
User
Beiträge: 4
Registriert: Freitag 10. Mai 2019, 12:48

Montag 13. Mai 2019, 10:02

Mein Gerät wird nicht als UART device erkannt. Das Skript findet den Sensor nicht. Obwohl ich z.B. in Windows in den Bluetooth-Geräten den Sensor finde.
__deets__
User
Beiträge: 5351
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 13. Mai 2019, 10:14

Es ist ja auch kein UART. Du musst dich zu den custom characteristics auf Seite 7 verbinden, und deren Daten wie im Datenblatt angegeben interpretieren.
Taha
User
Beiträge: 4
Registriert: Freitag 10. Mai 2019, 12:48

Montag 13. Mai 2019, 11:59

ich weiß gerade nicht was du mit custom characteristics auf Seite 7 meinst, aber probiere das Beispielskript low_level.py umzuprogrammieren, so dass es "normale" BLE findet und nicht UART. Muss ich da die UUID meines Sensors definieren?
__deets__
User
Beiträge: 5351
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 13. Mai 2019, 12:38

Ich kenne das Beispielskripts das du meinst nicht. Und Seite 7 bezieht sich auf das von dir verlinkte Datenblatt.

Du musst erstmal deinen Sensor entdecken, dich dann verbinden, dann die Services aufzählen, dann den nehmen der dich interessiert, dann dessen characteristics aufzählen, und dann die Notifikationen anmelden für due Daten die dich interessieren.
__deets__
User
Beiträge: 5351
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 13. Mai 2019, 12:46

Ich hab das Skript gefunden. Prinzipiell sollte das tun. Du musst halt die UUIDs des Sensors benutzen.

Ich arbeite unterm mac und iOS mit BLE und für ersteres gibt es einen Bluetooth Explorer mit dem man sich sowas auch zusammen sammeln kann. Wobei die Werte ja auch dokumentiert sind.
Taha
User
Beiträge: 4
Registriert: Freitag 10. Mai 2019, 12:48

Montag 13. Mai 2019, 16:38

Ich habe nun über den folgenden Code versucht, Daten des Sensors zu erhalten.



btlib = find_library("bluetooth")
if not btlib:
raise Exception("Can't find required bluetooth libraries")
bluez = CDLL(btlib, use_errno=True)

dev_id = bluez.hci_get_route(None)

sock = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)
sock.bind((dev_id,))

err = bluez.hci_le_set_scan_parameters(sock.fileno(), 0, 0x10, 0x10, 0, 0, 1000);
if err > 0:
raise Exception("Set scan parameters failed")
# occurs when scanning is still enabled from previous call

## allows LE advertising events
hci_filter = struct.pack("<IQH",0x00000010, 0x4000000000000000,0)
sock.setsockopt(SOL_HCI, HCI_FILTER, hci_filter)

err = bluez.hci_le_set_scan_enable(sock.fileno(),
1, # 1: turn on; 0:turn off
0, # 0: filtering disabled; 1: filter out duplicates
1000) # timeout
if err > 0:
errnum = get_errno()
raise Exception("{} {}".format(errno.errorcode[errnum], os.strerror(errnum)))


while True:
data = sock.recv(2048)
print(data)



mit print(data) erhalte ich dann folgendes (ausschnitssweise)

b'\x04>:\x02\x02\x00\x00\x1b\x82\x0eT\x07+\x16\x02\x01\x06\x12\tCISS-Datastreamer\xa8\x00\x01\x7f_,\xb4 q\x0e\x02\x01\x1a\n\xffL\x00\x10\x05\x03\x18o\x17]\xa6'
b'\x04>"\x02\x01\x00\x00\x1b\x82\x0eT\x07+\x16\x02\x01\x06\x12\tCISS-Datastreamer\xb2'
b'\x04>K\x02\x02\x00\x00\x1b\x82\x0eT\x07+\x16\x02\x01\x06\x12\tCISS-Datastreamer\xac\x03\x01\xfe\xc9:\xefG\x02\x1f\x1e\xff\x06\x00\x01\t \x00\x11\x04\xe6\xc5\x95v\x97Q\x95\xbazK\xe6\xa87\xd7\n\xdc&t\x7f9^\xa8'
b'\x04>"\x02\x01\x00\x00\x1b\x82\x0eT\x07+\x16\x02\x01\x06\x12\tCISS-Datastreamer\xac'

Laut der Protokoll-Beschreibung sollte die Information bezüglich der Beschleunigung im ersten Byte stecken. Allerdings bleibt b'\x04> unverändert, egal wie ich den Sensor zum Beispiel bewege.

Erhalte ich die falschen Datenpakete, oder liegt es an etwas anderem?
__deets__
User
Beiträge: 5351
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 13. Mai 2019, 16:44

Ich sehe nicht, das du dich zu der von mir beschriebenen characteristic anmeldest. Was du da siehst ist einfach nur die Advertisement Information. Das andere Skript war da geeigneter.

Such dir mal eine Einführung in BLE. Das ist leider nicht alles so simpel wie ein Socket oder UART. Kann halt mehr. Dann verstehst du auch, was da in dem Datenblatt alles besprochen wird.

Und in Zukunft bitte Code Tags verwenden. So ist der Code kaum entzifferbar.
Antworten