Forum: Mikrocontroller und Digitale Elektronik Inkbird Bluetooth Thermometer auslesen


von Paul G. (paul_g210) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo

Ich bin auf die fixe Idee gekommen mein Inkbird BBQ Bluetooth 
Thermometer
unter Linux auszulesen. Mich interessiert eigentlich nur der 
Temperaturwert.

Erstaunlicherweise gibt es anscheinend so gut wie keinen Code mit dem 
sich jemand schon mal daran versucht hat. Auf Github 
(https://github.com/sworisbreathing/go-ibbq) gibt es nur ein kleines 
Projekt das aber auf "GOLANG" basiert und dazu noch auf ein anderes 
GOLANG BLE Code Fragment (https://github.com/go-ble/ble), komplett ohne 
irgendwelche Dokumentationen...

Also habe ich versucht selbst tätig zu werden und mit dem Teil 
kommuniziert und Pakete mit der Android internen HCI-SNOOP Funktion 
gesnifft während ich die BBQ App auf dem Smartphone verbunden habe. Dann 
das ganze in Wireshark angeschaut, insbesondere das ATT Protokol. Dort 
habe ich diverse Pakete gefunden "Rcvd Handle Value Notification" die 
einen Value zurückgeliefert haben der die Temperatur sein könnte.

"dc000000" = dezimal 220 also vermutlich 22°C die auch das Thermometer 
anzeigt.

Später habe ich den Fühler berührt und der Wert änderte sich mit der 
Zeit auf

"22010000" = dezimal 290 = 29°C.

Das scheint schon mal zu klappen. Die Frage ist nun wie bringe ich das 
Gerät dazu diese Value Notification zu senden? Ziel wäre für mich am 
besten die Werte mit einem Python Skript abzufragen.

Da ich unter Linux bin habe ich das Gerät erstmal mit gatttool 
abgefragt.
1
primary
2
3
attr handle: 0x0001, end grp handle: 0x000b uuid: 00001800-0000-1000-8000-00805f9b34fb
4
attr handle: 0x000c, end grp handle: 0x000f uuid: 00001801-0000-1000-8000-00805f9b34fb
5
attr handle: 0x0010, end grp handle: 0x0022 uuid: 0000180a-0000-1000-8000-00805f9b34fb
6
attr handle: 0x0023, end grp handle: 0xffff uuid: 0000fff0-0000-1000-8000-00805f9b34fb
7
8
characteristics
9
10
handle: 0x0002, char properties: 0x02, char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
11
handle: 0x0004, char properties: 0x02, char value handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb  
12
handle: 0x0006, char properties: 0x0a, char value handle: 0x0007, uuid: 00002a02-0000-1000-8000-00805f9b34fb  
13
handle: 0x0008, char properties: 0x08, char value handle: 0x0009, uuid: 00002a03-0000-1000-8000-00805f9b34fb  
14
handle: 0x000a, char properties: 0x02, char value handle: 0x000b, uuid: 00002a04-0000-1000-8000-00805f9b34fb  
15
handle: 0x000d, char properties: 0x20, char value handle: 0x000e, uuid: 00002a05-0000-1000-8000-00805f9b34fb  
16
handle: 0x0011, char properties: 0x02, char value handle: 0x0012, uuid: 00002a23-0000-1000-8000-00805f9b34fb  
17
handle: 0x0013, char properties: 0x02, char value handle: 0x0014, uuid: 00002a24-0000-1000-8000-00805f9b34fb  
18
handle: 0x0015, char properties: 0x02, char value handle: 0x0016, uuid: 00002a25-0000-1000-8000-00805f9b34fb  
19
handle: 0x0017, char properties: 0x02, char value handle: 0x0018, uuid: 00002a26-0000-1000-8000-00805f9b34fb  
20
handle: 0x0019, char properties: 0x02, char value handle: 0x001a, uuid: 00002a27-0000-1000-8000-00805f9b34fb  
21
handle: 0x001b, char properties: 0x02, char value handle: 0x001c, uuid: 00002a28-0000-1000-8000-00805f9b34fb  
22
handle: 0x001d, char properties: 0x02, char value handle: 0x001e, uuid: 00002a29-0000-1000-8000-00805f9b34fb  
23
handle: 0x001f, char properties: 0x02, char value handle: 0x0020, uuid: 00002a2a-0000-1000-8000-00805f9b34fb  
24
handle: 0x0021, char properties: 0x02, char value handle: 0x0022, uuid: 00002a50-0000-1000-8000-00805f9b34fb  
25
handle: 0x0024, char properties: 0x10, char value handle: 0x0025, uuid: 0000fff1-0000-1000-8000-00805f9b34fb  
26
handle: 0x0028, char properties: 0x08, char value handle: 0x0029, uuid: 0000fff2-0000-1000-8000-00805f9b34fb  
27
handle: 0x002b, char properties: 0x10, char value handle: 0x002c, uuid: 0000fff3-0000-1000-8000-00805f9b34fb  
28
handle: 0x002f, char properties: 0x10, char value handle: 0x0030, uuid: 0000fff4-0000-1000-8000-00805f9b34fb  
29
handle: 0x0033, char properties: 0x08, char value handle: 0x0034, uuid: 0000fff5-0000-1000-8000-00805f9b34fb
Das Temperatur Paket scheint also mit der Service UUID 0xFFF0 und mit 
dem Characteristic UUID 0xFFF4 und dem Handle 0x0030 zusammen zu hängen 
(siehe Bild). Hat jemand Ahnung von dem ganzen was ich denn jetzt mit 
gatttool senden muss damit er mir die Temperatur ausgibt?

von #!/bin/BASH (Gast)


Lesenswert?

So oder so ähnlich funktioniert es mit einem Herzfrequenzsensor:

1
while [ true ]; do 
2
 echo restart
3
  stdbuf --output=L gatttool -i hci1 -b 00:22:D0:25:12:34  --char-write-req --handle=0x12  --value=0100 --listen|while read line; do 
4
  echo "`date +%Y-%m-%d_%H:%M:%S` $line"
5
  sleep 0.1
6
 done
7
 sleep 1
8
done

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Hallo Paul,
eine GATT Characteristic besteht aus mehreren Attributes. Damit ein GATT 
Server Dir Notifications für eine Characteristic sendet, musst Du Dich 
auf diese subscriben. Innerhalb des Handle-Bereichs Deiner 
Characteristic muss es einen Client Characteristic Configuration 
Descriptor (das ist ein Attribute) mit der UUID 0x2902 geben. Notfalls 
könntest Du mal das Bonding zu dem Gerät löschen und dann das Pairing 
mit-sniffen.

An diese Characteristic musst Du den Wert 1 schreiben, wenn Du mit dem 
Gerät verbunden bist.

Edit: Oder Du probierst es mal auf gut-Glück mit dem Handle 0x0031

mfg Torsten

: Bearbeitet durch User
von Paul G. (paul_g210) Benutzerseite


Lesenswert?

Ah ja, danke. Das deckt sich mit dem was ich gestern noch gelesen habe 
(https://stackoverflow.com/questions/15657007/bluetooth-low-energy-listening-for-notifications-indications-in-linux).
Der Notification Prozess muss erst aktiviert werden, nennt sich glaube 
ich CCCD (Client Characteristic Configuration Descriptor)...

Ich bin mir jetzt nicht sicher ob das Gerät dazu ge-paired sein muss.
Ich versuche gerade das Thermometer mit dem PC zu pairen aber 
bluetoothctl will eine Pin von mir obwohl ich das Pairing mit dem 
Smartphone überlicherweise nur mit einem Knopf bestätige...

von P. S. (sandl)


Lesenswert?

Wenn du es erstmal etwas vereinfacht probieren willst kann ich dir auch 
die Android-Version von nRF Connect sehr empfehlen, damit kann man sich 
sehr einfach auf eine Characteristic subscriben und schauen ob dadurch 
Notifys gesendet werden. :-)

von Paul G. (paul_g210) Benutzerseite


Lesenswert?

Danke Torsten, ich hatte 2902 schon mal ausgelesen:
1
gatttool -b 0C:AE:7D:XX:XX:XX -I
2
> connect
3
[LE]> char-read-uuid 2902
4
5
handle: 0x000f   value: 02 00 
6
handle: 0x0026   value: 00 00 
7
handle: 0x002d   value: 00 00 
8
handle: 0x0031   value: 00 00

Und auch versucht zu setzen aber an den Values hat sich bisher nix 
ändern lassen. Aber seit dem ich das Thermometer vom Smartphone 
un-bounded habe steht nun im 0x000f eine Zwei drinn.

von Joachim S. (oyo)


Lesenswert?

Wie es in Python oder mit dem gatttool funktioniert, kann ich Dir nicht 
sagen.
In Node.js mit installiertem "simble"-Paket für Bluetooth-Unterstützung 
würde vermutlich folgendes kurzes Programm genügen:
1
require("simble").subscribe_to_characteristic(0xFFF0, 0xFFF4, (data) => {
2
  temperature = (((data[1] << 8) + data[0]) / 10);
3
  console.log(`Temperature: ${temperature}`);
4
});

In Python unter Linux würdest Du vermutlich die "bluepy"-Library für die 
Bluetooth-Kommunikation nehmen. 
(http://ianharvey.github.io/bluepy-doc/notifications.html#example-code) 
Mit der habe ich keine Erfahrung, daher kann ich Dir kein fertiges 
Code-Fragment nennen, aber der grundsätzliche Ablauf dürfte eh immer 
gleich sein:

1. Du verbindest Dich mit dem gewünschten Gerät (bzw. dem GATT-Server 
des Geräts), also in diesem Fall Deinem Bluetooth-Thermometer.
2. Du forderst davon den Service 0xFFF0 an
3. Du forderst davon die Characteristic 0xFFF4 an.
4. Du "subscribst" auf diese Characteristic
5. Immer wenn ein Update dieser Characteristic kommt, parst Du die als 
Byte-Array gelieferten Daten

Pairing oder so ist meiner Erfahrung nach bei fast keinem 
Bluetooth-LE-Gerät nötig.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Paul G. schrieb:

> Ich bin mir jetzt nicht sicher ob das Gerät dazu ge-paired sein muss.
> Ich versuche gerade das Thermometer mit dem PC zu pairen aber
> bluetoothctl will eine Pin von mir obwohl ich das Pairing mit dem
> Smartphone überlicherweise nur mit einem Knopf bestätige...

Das wird Dir das Gerät, beim Versuch, auf den CCCD zu schreiben selbst 
sagen (mit einem entsprechenden ATT-Fehlercode).

Der Tipp von Philipp ist auf jeden Fall gut. nRF Connect gibt es auch 
für iOS (und OS/X).

Die Auswahl der Pairing-Methode hängt an den Möglichkeiten, beider 
Geräte. Vielleicht hat Dein Telefon da vorher etwas nicht richtig 
gemacht.

von Paul G. (paul_g210) Benutzerseite



Lesenswert?

Ich habe mal ein wireshark log angehangen, da ist (sollte) der 
Pairing-Prozess enthalten sein. Die letzten wiederholenden ATT Pakete 
sind allein die Temperatur Readings (dc000000).

Ich steh gerade etwas auf dem Schlauch. Mit dem Pairing, also das 
Display des Thermometers hat ein Wifi-Ikon das fängt an zu blinken wenn 
ich per gatttool oder nRF verbinde. Die Verbindung wird aber immer nach 
4 bis 10 Sekunden unterbrochen und ich muss neu connecten. Wenn das 
Thermometer mit dem Smartphone gepaired wird dann geht das Ikon vom 
blinken in dauerleuchten über nachdem mich die App aufgefordert hat den 
Knopf zu drücken. Das tut es aber nur wenn ich es mit der BBQ App 
paire...

Wenn ich versuche per bluetoothctl zu pairen fragt er mich nach einer 
PIN und da habe ich schon alle wie 0000,1234,9999 ausprobiert und 
schlägt fehl.

Nachdem ich das Thermometer aus der App gelöscht habe war ich dann in 
der Lage die Handles des "2902" mit gatttool zu setzen:

gatttool -b 0C:AE:7D:XX:XX:XX --char-write-req --handle=0x0031 
--value=0100 --listen

handle: 0x000f   value: 02 00
handle: 0x0026   value: 01 00
handle: 0x002d   value: 01 00
handle: 0x0031   value: 01 00

Wobei sich der erste handle nur auf 0200 oder 0000 setzen ließ. Nach 
jedem setzten Befehl hab ich gewartet ob da eine Antwort kam, aber nix.

Mit der nRF App weiss ich nicht so recht was ich machen soll. Ist zwar 
schön übersichtlich aber ich kapier nicht was ich dort senden oder 
abfragen soll, vor allem kann ich in der App ja nicht sehen ob er die 
Temperatur Pakete auch wirklich sendet, mit "gatttool --listen" müsste 
das ja gehen.

Joachim S. schrieb:
> 1. Du verbindest Dich mit dem gewünschten Gerät (bzw. dem GATT-Server
> des Geräts), also in diesem Fall Deinem Bluetooth-Thermometer.
> 2. Du forderst davon den Service 0xFFF0 an
> 3. Du forderst davon die Characteristic 0xFFF4 an.
> 4. Du "subscribst" auf diese Characteristic
> 5. Immer wenn ein Update dieser Characteristic kommt, parst Du die als
> Byte-Array gelieferten Daten

Ja, die Frage ist wie "fordere" ich einen Service/Characteristic an bzw 
subscribe etwas mit dem gatttool.

Ich habe dort nur:

char-read-hnd   <handle>                       Characteristics 
Value/Descriptor Read by handle
char-read-uuid  <UUID> [start hnd] [end hnd]   Characteristics 
Value/Descriptor Read by UUID
char-write-req  <handle> <new value>           Characteristic Value 
Write (Write Request)
char-write-cmd  <handle> <new value>           Characteristic Value 
Write (No response)

Mir ist das ganze Konzept Service/Characteristic/Handle völlig abstrus.

von Joachim S. (oyo)


Lesenswert?

Paul G. schrieb:
> Mir ist das ganze Konzept Service/Characteristic/Handle völlig abstrus.

Das Grundprinzip ist eigentlich simpel:
Vereinfacht gesagt ist jedes Bluetooth LE-Gerät unterteilt in mehrere 
"Services", die das Gerät anbietet, und jeder dieser "Services" ist 
wiederum unterteilt in eine Reihe von "Characteristics".

Jeder Bluetooth-Herzfrequenz-Sensor bietet beispielsweise den 
standardisierten (GATT-)Service "Heart Rate Service" mit der (UU)ID 
0x180D an. Zu diesem Service gehören zwei Characteristiken: Die 
Characteristic "Body Sensor Location" mit der (UU)ID 0x2A38, die 
Auskunft gibt, an welcher Stelle am Körper der Sensor angebracht ist, 
und die "Heart Rate Measurement"-Characteristic mit der (UU)ID 0x2A37, 
über die permanent der aktuelleste Herzfrequenz-Messwert gesendet wird.

Diese "Characteristics" sind das, womit man es fast ausschliesslich zu 
tun hat; die "Services" sind im Grunde nur die Gruppierung inhaltlich 
zusammengehöriger "Characteristics" unter einem Dach.

Jeder Service und jede Characteristic hat eine eindeutige (UU)ID, über 
die es referenziert werden kann. Die Temperatur-Daten Deines Gerätes 
bspw. werden offenbar über die (nicht standardisierte) Characteristic 
mit der ID 0xFFF4 gesendet.

Es gibt aber noch eine andere Möglichkeit, Characteristics zu 
referenzieren: Über ihre "Handles".

Grob vereinfacht gesagt sind die Handles dazu da, um die Menge der zu 
übertragenden Daten zu minimieren. Da die IDs der Services und 
Characteristics UUIDs sind, können sie nämlich bis zu 128 Bit lang sein. 
Müsste man jedes mal, wenn man eine bestimmte Characteristic 
lesen/schreiben will, deren komplette 128 Bit-UUID übertragen, wäre das 
viel unnötiger Overhead. Die Handles hingegen sind 16-Bit-Werte. Daher 
läuft es in der Praxis ungefähr so ab: Nachdem man die Verbindung zu 
einem Bluetooth LE-Gerät aufgebaut wurde, werden daher am Anfang oft 
sinngemäss einige Anfragen a la "Hallo Bluetooth LE-Gerät, ich möchte 
auf die Characteristic mit der (UUID) xy zugreifen. Wie ist denn das 
zugehörige Handle?" ausgetauscht. Und statt über die lange (UU)ID 
verwendet werden die Characteristics fortan über das kurze Handle 
referenziert.

Die Handles sind also eigentlich gar nicht nötig; sie sind eher eine Art 
low-level-Implementierungsdetail, um die Menge der zu übertragenden 
Daten zu minimieren. Bei vielen High-level-Bluetooth-LE-Libraries kommt 
man mit diesen Handles gar nicht mehr in Kontakt; die Characteristics 
werden ausschliesslich über ihre feste (UU)ID referenziert, um die 
benötigten Handles kümmert sich die Bluetooth-LE-Library von selbst.

Auch in der nRF-Toolbox, die Du ja bereits benutzt hast, sind die 
Handles höchstens irgendwo versteckt zu finden, normalerweise wird nur 
die feste (UU)ID der Services und Characteristics angezeigt.

Das von Dir verwendete "gatttool" hingegen ist ziemlich low-level, daher 
musst Du Dich da viel mit Handles herumplagen.

von Paul G. (paul_g210) Benutzerseite


Lesenswert?

Vielen Dank für die Erklärung Joachim.

Ich werde nochmal den Verkehr sniffen und zwar nur bis zu dem Punkt wo 
ich die Taste am Thermometer zum Pairen drücken soll, mal sehen ob ich 
dann im Nachhinein die Kommunikation Paket für Paket mit dem gatttool 
nachspielen kann, denn ich werde das gefühl nicht los das ich ohne 
Pairing keine Daten bekommen werde...

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Paul G. schrieb:
> Ich habe mal ein wireshark log angehangen, da ist (sollte) der
> Pairing-Prozess enthalten sein. Die letzten wiederholenden ATT Pakete
> sind allein die Temperatur Readings (dc000000).

Da sind ja auch schon Value Notifications drinnen. Das mit dem 
Subscriben hat also schon mal geklappt.

Für mich sieht das so aus, als käme der Disconnect von Deiner Seite 
(Event 585).


> Wobei sich der erste handle nur auf 0200 oder 0000 setzen ließ. Nach
> jedem setzten Befehl hab ich gewartet ob da eine Antwort kam, aber nix.

Das liegt wahrscheinlich daran, dass die erste Characteristic 
Indications sendet (Notifications mit Handshake).


> Mit der nRF App weiss ich nicht so recht was ich machen soll. Ist zwar
> schön übersichtlich aber ich kapier nicht was ich dort senden oder
> abfragen soll, vor allem kann ich in der App ja nicht sehen ob er die
> Temperatur Pakete auch wirklich sendet, mit "gatttool --listen" müsste
> das ja gehen.

Du must bei der Characteristic, auf die Du Dich subscriben möchtest, 
neben dem CCCD auf den Pfeil drücken, dann solltest Du Notifications 
bekommen. (Oder auf die 3-fach Pfeile).

von Paul G. (paul_g210) Benutzerseite


Lesenswert?

Torsten R. schrieb:
> Da sind ja auch schon Value Notifications drinnen. Das mit dem
> Subscriben hat also schon mal geklappt.

Das Logfile enthält nur den Traffic zwischen meinem Android (BBQ APP) 
und dem Thermometer, da gehe ich davon aus das das klappt ;)

von Paul G. (paul_g210) Benutzerseite


Lesenswert?

ERFOLG :)

Nachdem ich mir das btsnoop log nochmal Paket für Paket angeschaut habe, 
habe ich parallel dazu alle write-req mit dem gatttool an das 
Thermometer
gesendet:
1
char-write-req 0x0026 0100
2
char-write-req 0x0029 200706050403020101010101000000
Mit dem folgenden Paket scheint sich mein Linux mit dem Thermometer
zu pairen, das Antennenlogo blinkt nun nicht mehr und leuchtet 
dauerhaft. Ausserdem disconnected das Gerät nicht mehr.
1
char-write-req 0x0029 2107060504030201b8220000000000
1
char-write-req 0x0031 0100
Und mit diesem wird das Notification aktiviert und ich bekomme 
fortlaufend meine Temperatur :)
1
char-write-req 0x0034 0b0100000000 
2
Characteristic value was written successfully 
3
Notification handle = 0x0025 value: ff 0b 00 00 00 00  
4
Notification handle = 0x0030 value: dc 00 00 00  
5
Notification handle = 0x0030 value: dc 00 00 00  
6
Notification handle = 0x0030 value: dc 00 00 00  
7
Notification handle = 0x0030 value: dc 00 00 00  
8
Notification handle = 0x0030 value: dc 00 00 00  
9
Notification handle = 0x0030 value: dc 00 00 00
10
...

Jetzt muss ich das ganze nur noch handlich in ein python script packen.
Um den Batteriestatus und den zweiten Temperaturfühler kann ich mich 
später mal kümmern, brauch ich aber im Moment nicht.

: Bearbeitet durch User
von Joachim S. (oyo)


Lesenswert?

Paul G. schrieb:
>
1
> char-write-req 0x0026 0100
2
> char-write-req 0x0029 200706050403020101010101000000
3
>
> Mit dem folgenden Paket scheint sich mein Linux mit dem Thermometer
> zu pairen, das Antennenlogo blinkt nun nicht mehr und leuchtet
> dauerhaft. Ausserdem disconnected das Gerät nicht mehr.
>
1
> char-write-req 0x0029 2107060504030201b8220000000000
2
>

Ich bezweifle ehrlich gesagt, ob es sich dabei wirklich um ein Pairing 
im eigentlichen Sinn handelt.
Ich gehe momentan eher davon aus, dass das einfach eine Art 
Initialisierungssequenz ist, die jedes Mal nach dem Verbinden mit dem 
Thermometer durchgeführt wird/werden muss.

Möglicherweise ist es übrigens nicht ausreichend (oder sinnvoll), die 
immer gleiche Byte-Folge 2107060504030201b8220000000000 zu senden.
Mir ist nämlich folgendes aufgefallen:
Mit
>
1
> char-write-req 0x0026 0100
2
>
wird zunächst auf die Characteristic 0xFFF1 subscribt.
Dann wird mit
>
1
> char-write-req 0x0029 200706050403020101010101000000
2
>
die Characteristic 0xFFF2 auf 200706050403020101010101000000 gesetzt.

Dann vergehen erst einmal ca. zwei Sekunden - und direkt bevor er wie 
von Dir gepostet dann per
>
1
> char-write-req 0x0029 2107060504030201b8220000000000
2
>
die Characteristic 0xFFFF2 auf 2107060504030201 b822 0000000000 setzt, 
empfängt er noch eine Notification von der Characteristic 0xFFF1, auf 
die ja subscribt wurde, mit dem Wert "20 b8 22 00 00 00".

Da die Byte-Folge 0xb8 0x22 in beiden Paketen vorkommt, und der 
Write-Request unmittelbar nach dem Empfang der Notification rausgeht, 
scheint es mir so zu sein, dass die App die Byte-Folge 
2107060504030201b8220000000000 als unmittelbare Reaktion auf den Empfang 
dieser "20 b8 22 00 00 00"-Notification gesendet hat, und die gesendete 
Byte-Folge vom Inhalt dieser Notification abhing.

Tipp: Ich würde an Deiner Stelle noch ein paar zusätzliche btsnoop-Logs 
erzeugen und die miteinander vergleichen, ob bzw. was sich direkt nach 
dem Verbindungsaufbau ändert etc. Wenn es sich wirklich um ein Pairing 
handelt, dann sollte dieser Pairing-Schritt in den späteren logs ja z.B. 
nicht mehr vorkommen, weil Smartphone und Thermometer dann ja bereits 
gepairt wären.

: Bearbeitet durch User
von Blau (Gast)


Lesenswert?

Paul G. schrieb:
> char-write-req 0x0029 200706050403020101010101000000

Kann man vielleicht einen Temperaturalarm am Gerät via app 
konfigurieren?

von Paul G. (paul_g210) Benutzerseite


Lesenswert?

Blau schrieb:
> Paul G. schrieb:
>> char-write-req 0x0029 200706050403020101010101000000
>
> Kann man vielleicht einen Temperaturalarm am Gerät via app
> konfigurieren?
Wie kommst du darauf?

Ja, es gibt verschiedene Temperatur Profile (Steak blutig, Steak 
steinhart...) und man kann selbst die Zieltemperatur eingeben aber der
das Teil ALARM schreit und vibriert, mich interessiert aber nur die 
aktuelle Temperatur.

: Bearbeitet durch User
von Joachim S. (oyo)


Lesenswert?

Noch ein kleiner Tipp, der Dir mglw. helfen könnte:

Du hast ja im Eröffnungsposting bereits auf eine in Go geschriebene und 
auf Github veröffentlichte Software verlinkt.
Da gibt es diese Datei hier mit Konstanten:
https://github.com/sworisbreathing/go-ibbq/blob/master/ibbq/const.go

Da finden sich z.B. Hinweise darauf, für was die verschiedenen 
Characteristics offenbar genutzt werden:

Characteristic 0xFFF1: SettingResult (NOTIFY)
Characteristic 0xFFF2: AccountAndVerify (WRITE)
Characteristic 0xFFF3: HistoryData (NOTIFY)
Characteristic 0xFFF4: RealTimeData (NOTIFY)
Characteristic 0xFFF5: SettingData (WRITE)

Weiterhin finden sich dort auch einige Byte-Sequenzen, um z.B. zwischen 
Celsius und Fahrenheit umzuschalten, den Batteriezustand abzufragen usw.

Auch die Byte-Folge "21 07 06 05 04 03 02 01 b8 22 00 00 00 00 00" 
findet sich da 1:1 wieder, und wird dort als "login credentials" 
bezeichnet. Wobei ich mich ein wenig wundere, wieso diese "login 
credentials" offenbar eine Konstante und bei jedem Exemplar identisch 
sind.

: Bearbeitet durch User
von Paul G. (paul_g210) Benutzerseite


Lesenswert?

Im Grunde reicht es sogar aus wenn ich nur diese beiden Pakete sende, 
und ich hatte das Thermometer vorher mit dem Android gebunden und die 
Bindung wieder gelöscht:

char-write-req 0x0029 2107060504030201b8220000000000
char-write-req 0x0034 0b0100000000

und sofort sendet er mir meine Temperatur...

von Steffen R. (Firma: Privat) (old_toby)


Angehängte Dateien:

Lesenswert?

Hallo in die Runde,

ich hoffe, Ihr seid noch da, und das Thema ist noch aktiv, zumindest für 
mich ;-)

Ich will von meinem Raspi einfach nur (ab und zu) die Temperaturwerte 
von einem IBT-2X auslesen.
Mein erster Ansatz war, mit Hilfe von Python (bluepy) zu arbeiten.
Hier bin ich jedoch am connect mit dem Inkbird gescheitert (trotz 
zahlreicher Tips aus dem Netz).

Dann hab ich mich eine Ebene tiefer begeben, gatt + bluetooth und Co, 
wobei das komplettes Neuland für mich ist.

Mit gatttool scheitere ich komplett beim connect:
1
pi@force:~ $ sudo gatttool -I -t random -b 24:56:00:00:05:F1
2
[24:56:00:00:05:F1][LE]> connect
3
Attempting to connect to 24:56:00:00:05:F1
4
Error: connect error: Connection refused (111)
oder auch:
1
...
2
Error: connect error: Software caused connection abort (103)

Mit bluetooth komme ich deutlich weiter:
1
pi@force:~ $ sudo bluetoothctl
2
Agent registered
3
[bluetooth]# power on
4
Changing power on succeeded
5
[bluetooth]# agent on
6
Agent is already registered
7
[bluetooth]# default-agent
8
Default agent request successful
9
[bluetooth]# scan on
10
Discovery started
11
...
12
[CHG] Device 24:56:00:00:05:F1 RSSI: -72
13
[CHG] Device 24:56:00:00:05:F1 TxPower: 0
14
[bluetooth]#
15
[bluetooth]# scan off
16
Discovery stopped
17
[bluetooth]# list-attributes 24:56:00:00:05:F1
18
Primary Service
19
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service001f
20
        0000fff0-0000-1000-8000-00805f9b34fb
21
        Unknown
22
Characteristic
23
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service001f/char002f
24
        0000fff5-0000-1000-8000-00805f9b34fb
25
        Unknown
26
Descriptor
27
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service001f/char002f/desc0031
28
        00002901-0000-1000-8000-00805f9b34fb
29
        Characteristic User Description
30
Characteristic
31
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service001f/char002b
32
        0000fff4-0000-1000-8000-00805f9b34fb
33
        Unknown
34
Descriptor
35
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service001f/char002b/desc002e
36
        00002901-0000-1000-8000-00805f9b34fb
37
        Characteristic User Description
38
Descriptor
39
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service001f/char002b/desc002d
40
        00002902-0000-1000-8000-00805f9b34fb
41
        Client Characteristic Configuration
42
Characteristic
43
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service001f/char0027
44
        0000fff3-0000-1000-8000-00805f9b34fb
45
        Unknown
46
Descriptor
47
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service001f/char0027/desc002a
48
        00002901-0000-1000-8000-00805f9b34fb
49
        Characteristic User Description
50
Descriptor
51
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service001f/char0027/desc0029
52
        00002902-0000-1000-8000-00805f9b34fb
53
        Client Characteristic Configuration
54
Characteristic
55
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service001f/char0024
56
        0000fff2-0000-1000-8000-00805f9b34fb
57
        Unknown
58
Descriptor
59
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service001f/char0024/desc0026
60
        00002901-0000-1000-8000-00805f9b34fb
61
        Characteristic User Description
62
Characteristic
63
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service001f/char0020
64
        0000fff1-0000-1000-8000-00805f9b34fb
65
        Unknown
66
Descriptor
67
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service001f/char0020/desc0023
68
        00002901-0000-1000-8000-00805f9b34fb
69
        Characteristic User Description
70
Descriptor
71
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service001f/char0020/desc0022
72
        00002902-0000-1000-8000-00805f9b34fb
73
        Client Characteristic Configuration
74
Primary Service
75
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service000c
76
        0000180a-0000-1000-8000-00805f9b34fb
77
        Device Information
78
Characteristic
79
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service000c/char001d
80
        00002a50-0000-1000-8000-00805f9b34fb
81
        PnP ID
82
Characteristic
83
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service000c/char001b
84
        00002a2a-0000-1000-8000-00805f9b34fb
85
        IEEE 11073-20601 Regulatory Cert. Data List
86
Characteristic
87
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service000c/char0019
88
        00002a29-0000-1000-8000-00805f9b34fb
89
        Manufacturer Name String
90
Characteristic
91
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service000c/char0017
92
        00002a28-0000-1000-8000-00805f9b34fb
93
        Software Revision String
94
Characteristic
95
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service000c/char0015
96
        00002a27-0000-1000-8000-00805f9b34fb
97
        Hardware Revision String
98
Characteristic
99
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service000c/char0013
100
        00002a26-0000-1000-8000-00805f9b34fb
101
        Firmware Revision String
102
Characteristic
103
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service000c/char0011
104
        00002a25-0000-1000-8000-00805f9b34fb
105
        Serial Number String
106
Characteristic
107
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service000c/char000f
108
        00002a24-0000-1000-8000-00805f9b34fb
109
        Model Number String
110
Characteristic
111
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service000c/char000d
112
        00002a23-0000-1000-8000-00805f9b34fb
113
        System ID
114
Primary Service
115
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service0008
116
        00001801-0000-1000-8000-00805f9b34fb
117
        Generic Attribute Profile
118
Characteristic
119
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service0008/char0009
120
        00002a05-0000-1000-8000-00805f9b34fb
121
        Service Changed
122
Descriptor
123
        /org/bluez/hci0/dev_24_56_00_00_05_F1/service0008/char0009/desc000b
124
        00002902-0000-1000-8000-00805f9b34fb
125
        Client Characteristic Configuration

Und ab jetzt beginnt mein Problem, ich hab keine Idee, wie ich was und 
mit welchem Kommando setzen muss, um die Temperaturwerte zu erfragen.
Ich hänge mal meine Erkenntnisse aus der nRF Connect App mit dran.

Ich wäre für ein paar Hinweise von Euch wirklich sehr dankbar...

Schönen Sonntag noch
Steffen

von Steffen R. (Firma: Privat) (old_toby)


Angehängte Dateien:

Lesenswert?

Hallo,

ich nochmal, ich hab die Informationen aus der nRF Connect App mal 
ver-excelt, aber so richtig ein Licht ist mir dabei nicht aufgegangen.
Ich bin wirklich gespannt, ob einer von Euch hier anspringt...

Viele Grüße
Steffen

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Die Temperatur wird wahrscheinlich in einem der Characteristiken im 
"Unknown Service" mit der UUDI 0xfff0. Bei allen Charakteristiken in dem 
Service, subscribe Dich mal auf Notifications und Indication und dann 
ändere mal die Temperatur und guck' Dir an, ob das irgendwo mit den 
Notifications / Indication korreliert.

von Steffen R. (Firma: Privat) (old_toby)


Lesenswert?

Hi Torsten,

danke für die schnelle Reaktion!

Gut, die von Dir erwähnten Characteristics wären dann:
1
Unknown Characteristic  FFF1    Notify
2
Unknown Characteristic  FFF3    Notify
3
Unknown Characteristic  FFF4    Notify

Wenn Du jetzt noch für "bluetooth" eine (zumindest beispielhafte) 
Kommandosequenz hättest (wie ich hier konkret verfahren sollte), wär das 
toll.
Wie zu Beginn erwähnt, das ist fremdes Territorium für mich.

Danke und schönen Restsonntag
Steffen

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Steffen R. schrieb:

> Wenn Du jetzt noch für "bluetooth" eine (zumindest beispielhafte)
> Kommandosequenz hättest (wie ich hier konkret verfahren sollte), wär das
> toll.

Du möchtest was mit Bluetooth Low Energy machen. Zum Verständnis gibt es 
einige Quellen, in denen Du Dich einlesen könntest (Hier z.B. die ganz 
gute Doku von Apple: 
https://developer.apple.com/library/archive/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/AboutCoreBluetooth/Introduction.html) 
(Die wichtigsten Begriffe sind GATT, Service, Characteristic)

Deine PC, ist ein GATT Client (Central) und Dein Thermometer ist ein 
GATT Server (Peripheral). Das unverbundene Thermometer wird Advertising 
Data senden. Danach must Du suchen (scanning) und Dich dann Verbinden. 
Dabei must Du dann anhand der Advertising Data des Thermometers 
erkennen, dass das das Gerät ist, mit dem Du Dich verbinden möchtest. Am 
einfachsten wäre es über die MAC Adresse. Ansonsten sucht man 
typischerweise nach etwas, dass einen bestimmten Service anbietet 
(Service-UUID).

Sobald dein PC mit dem Thermometer verbunden ist, stößt der BLE 
(Bluetooth Low Energy) stack Deins PC ein service and characteristic 
discovery an und dann solltest Du in Deiner BLE Library irgend wie 
darauf zurück greifen können. Sehe es mir bitte nach, dass ich mich 
jetzt nicht durch die Dokumentation von Bluepy lese.

HTH Torsten

von Steffen R. (Firma: Privat) (old_toby)


Lesenswert?

Hallo,

ich hab etwas gefunden, was mir geholfen hat:
BLE on Linux with bluetoothctl - Link 
https://budimir.cc/2020/02/27/ble-on-linux-with-bluetoothctl/amp/

Cheers

von Steffen R. (Firma: Privat) (old_toby)


Lesenswert?

Guten Morgen,

letzter Versuch...

Was ich gemacht habe:
2 ESP32, je als Server und Client, Read, Write und Notify erfolgreich 
implementiert und getestet.
Dann den Server durch das IBT-2X ersetzt...

Folgender Stand:
1
09:46:55.867 -> BLE Advertised Device found: Name: xBBQ, Address: 24:56:00:00:05:f1, manufacturer data: 01000000f105000056240b01ffff, serviceUUID: 0000fff0-0000-1000-8000-00805f9b34fb, txPower: 0
2
09:46:55.867 -> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3
09:46:58.859 -> Forming a connection to 24:56:00:00:05:f1
4
09:46:58.859 ->  - Created client
5
09:46:59.289 ->  - Connected to server
6
09:46:59.994 ->  - Found our service: 0000fff0-0000-1000-8000-00805f9b34fb
7
09:47:00.042 ->  - Found our characteristic: 0000fff4-0000-1000-8000-00805f9b34fb
8
09:47:00.090 -> !!!!!!!!!!!CAN_NOTIFY!!!!!!!!!!!(do before activating indication)
9
09:47:00.090 -> We are now connected to the BLE Server.
10
09:47:00.090 -> !!!!!!!!!!!NOTIFIES!!!!!!!!!!!

Sprich, ich konnte das Inkbird connect-en, habe Service und 
Characteristic gefunden, welche die Property Notify unterstützt.

Und jetzt hatte ich erwartet, hiernach die ersehnten Temperatur-Values 
zu empfangen:
1
// Activate the Notify property of the Characteristic
2
      pRemoteCharacteristic->getDescriptor(BLEUUID((uint16_t)0x2902))->writeValue((uint8_t*)notificationOn, 2, true);
3
      Serial.println("!!!!!!!!!!!NOTIFIES!!!!!!!!!!!");

Doch weit gefehlt :-(
Da kommt nix...

Falls jemand von Euch noch einen Hinweis hat, bitte her damit...

Ansonsten allen ein schönes Wochenende
Steffen

von Steffen R. (Firma: Privat) (old_toby)


Lesenswert?

UPDATE:

Wenn ich das Inkbird temporär mit der App verbínde, diese dann 
disconnect-e, kann ich anschliessend TempValues via Notification am 
ESP32 Client empfangen ;-)

Sobald ich das Inkbird neu starte (Batterie raus), ist es wieder vorbei.

Meine Idee,
1
Credentials = []byte{0x21, 0x07, 0x06,
2
    0x05, 0x04, 0x03, 0x02, 0x01, 0xb8, 0x22,
3
    0x00, 0x00, 0x00, 0x00, 0x00}

via nRF Connect App an die
1
Characteristic 0xFFF2: AccountAndVerify (WRITE)

zu schicken, hat nicht den gleichen Effekt gehabt, seeeeehr schade...

Cheers Steffen

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Steffen R. schrieb:
> letzter Versuch...

Ach komm! Nicht so schnell aufgeben! ;-)

>
1
> // Activate the Notify property of the Characteristic
2
>       pRemoteCharacteristic->getDescriptor(BLEUUID((uint16_t)0x2902))->writeValue((uint8_t*)notificationOn, 
3
> 2, true);
4
>       Serial.println("!!!!!!!!!!!NOTIFIES!!!!!!!!!!!");
5
>

Wo würdest Du die Fehlermeldung sehen, wenn dabei etwas schief gegangen 
ist? Laut BT Core spec. 5.3.  Vol 3. Part G, Kapitel 3.3.3.3 (Tabelle 
3.11), ist der korrekte Wert für "Notification" Bit 0 und damit 1 (und 
nicht 2).

Immer Fehler-Rückgabewerte prüfen, oder zumindest ausgegeben!

Guck Dir das auch mal mit einem Sniffer an. Ansonsten waren da auch noch 
2 andere Characteristics mit Notification Attribute.

HTH Torsten

von Steffen R. (Firma: Privat) (old_toby)


Lesenswert?

Hi Torsten,

danke, dass Du hier mitmachst!

Beim Einschalten der Notification wird:
1
const uint8_t notificationOn[] = {0x1, 0x0};
2
...
3
pRemoteCharacteristic->getDescriptor(BLEUUID((uint16_t)0x2902))->writeValue((uint8_t*)notificationOn, 2, true);

Die "2" ist meinem Verständnis nach die Längenangabe, oder?

Cheers Steffen

von Steffen R. (Firma: Privat) (old_toby)


Lesenswert?

So sieht es jetzt aus:

Nach Connect via App (muss irgendwie wie zuvor erähnt mit den 
credentials zu tun haben)...
...kann mein kleiner ESP32 Client jetzt auch ;-)
1
12:45:27.008 -> Notify callback for characteristic 0000fff4-0000-1000-8000-00805f9b34fb of data length 12
2
12:45:27.054 -> data: 
3
12:45:27.054 -> 23 (das passt ;-))

Ich muss jetzt erstmal was essen :-)

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Steffen R. schrieb:

> Die "2" ist meinem Verständnis nach die Längenangabe, oder?

Ja, dann sollte das so passen.

Bist Du mal an den Hersteller heran getreten und ihn um Dokumentation 
gebeten? In der Regel haben die ja durchaus ein Interesse daran, dass 
man ihre Produkte benutzen kann.

Beitrag #7001671 wurde vom Autor gelöscht.
von Steffen R. (Firma: Privat) (old_toby)


Lesenswert?

HEUREKA!
1
CredentialsMessage[] = {0x21, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0xb8, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00};
2
WRITE auf
3
credUUID("0000fff2-0000-1000-8000-00805f9b34fb");

...und...
1
RealtimeDataEnableMessage[] = { 0x0B, 0x01, 0x00, 0x00, 0x00, 0x00};
2
WRITE auf
3
realUUID("0000fff5-0000-1000-8000-00805f9b34fb");

Und jetzt schönes Wochenende
Steffen

von Steffen R. (Firma: Privat) (old_toby)


Lesenswert?

1
23:37:41.861 -> BLE Advertised Device found: Name: xBBQ, Address: 24:56:00:00:05:f1, manufacturer data: 01000000f105000056240a01ffff, serviceUUID: 0000fff0-0000-1000-8000-00805f9b34fb, txPower: 0
2
23:37:41.909 -> 
3
23:37:41.909 -> BIG BANG
4
23:37:41.909 -> 
5
23:37:44.856 -> Forming a connection to 24:56:00:00:05:f1
6
23:37:44.856 ->  - Created client
7
23:37:46.992 ->  - Connected to server
8
23:37:47.704 ->  - Found our service: 0000fff0-0000-1000-8000-00805f9b34fb
9
23:37:47.752 ->  - Found our characteristic: 0000fff2-0000-1000-8000-00805f9b34fb
10
23:37:47.752 ->    -> can be written
11
23:37:47.800 ->    -> initiate login
12
23:37:47.800 ->  - Found our characteristic: 0000fff5-0000-1000-8000-00805f9b34fb
13
23:37:47.800 ->    -> can be written
14
23:37:47.800 ->    -> enable realtime data
15
23:37:47.895 ->    -> set unit Celsius
16
23:37:47.941 ->    -> request battery level (does not work)
17
23:37:47.941 ->  - Found our characteristic: 0000fff4-0000-1000-8000-00805f9b34fb
18
23:37:47.941 ->    -> can notify (do before activating indication)
19
23:37:47.989 ->    -> notification enabled
20
23:37:47.989 -> We are now connected to the BLE Server.
21
23:37:49.799 -> Notify callback for characteristic 0000fff4-0000-1000-8000-00805f9b34fb of data length 12
22
23:37:49.799 -> TempSensor_1: 26°C
23
23:37:49.799 -> TempSensor_2: n/a

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.