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.
Bluetooth-Daten eines Sensors auswerten
Mit so etwas hier & dann der Dokuementation deines Sensors folgen.
https://github.com/adafruit/Adafruit_Python_BluefruitLE
https://github.com/adafruit/Adafruit_Python_BluefruitLE
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?
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.
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.
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.
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.
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?
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?
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.
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.