Zum 10-millionsten Download der Corona-Warn-App hatte ich mal Interesse an Bluetooth. Da die Corona-Warn-App mit Bluetooth arbeitet und der Quellcode und Doku auf github zu finden ist. Also erst mal eine Mindmap zum Thema Bluetooth:
Danke Dr.Kleinhirn.eu für die Erlaubnis zur Veröffentlichung der Mindmap
Dann fangen wir mal ganz einfach an mit ein Bluetooth-Scann mit dem Raspberry Pi und Auswertung der Daten mit Wireshark. Wir brauchen nicht viel. Einen Raspberry Pi und eine Bluetooth USB Stick und 1-2 Stunden Zeit. Ich habe z.B. diesen Bluethooth-USB-Adapter verwendet:
Erst mal das Rasbian-Linux-System updaten und ein paar Programme installieren, wenn sie nicht schon vorhanden sind:
1 2 3 4 |
sudo apt-get update sudo apt-get upgrade sudo apt-get autoremove sudo apt-get install bluetooth bluez-utils blueman bluez libbluetooth-dev libudev-dev |
Erst schauen wir mal, ob der USB-Bluetooth Stick erkannt wird mit lsusb:
lsusb
Das Ergebnis:
1 2 3 4 |
Bus 001 Device 004: ID 050d:0012 Belkin Components F8T012 Bluetooth Adapter Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub |
Ok, der Adapter wird erkannt als Belkin F8T012.
Bus 001 Device 004: ID 050d:0012 Belkin Components F8T012 Bluetooth Adapter
Hier mal ein paar Daten aus der Betriebsanleitung zu diesem „alten“ Stick, besser währe ein neuerer, aber der tut es erstmal auch:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
USB Adapter SpecificationsBluetooth® Technology Compliance: Version 2.0 Physical Interface: USB UHCI/OHCI 2.0-compliant Operating Frequency: 2.4 to 2.4835GHz Output Power: (F8T012) 4~20 dBm, Class I(F8T013) -6~4 dBm, Class II Sensitivity: <0.1% BER @ -80 dBm Data Rate: 3Mbps (effective throughput of 2.2 Mbps) Typical PowerConsumption: (F8T012) Tx: 150mA, Rx 80mA(F8T013) Tx: 65mA, Rx 45mA Operating Range: (F8T012) 100-meter radius indoors(F8T013) 10-meter radius indoors Network Topology: Point-to-MultipointPacket Support: 1/3/5 Slots Packet Operation: Master/Slave Frequency Stability: +/- 10PPM Supply Voltage: 5.0V DC Nominal Current: 100mA Spread Spectrum: FHSS (Frequency Hopping Spread Spectrum) Modulation: GFSK (Gussian Frequency Shift Keying) Certifications: FCC, CE, ICES, C-Tick, BQB, WHQL for XP |
Als nächstes checken wir, ob der Bluetooth Service läuft:
systemctl status bluetooth
Ok, der ist Aktiv:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
bluetooth.service - Bluetooth service Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2021-09-18 22:30:01 CEST; 14h ago Docs: man:bluetoothd(8) Main PID: 309 (bluetoothd) Status: "Running" Memory: 3.0M CGroup: /system.slice/bluetooth.service └─309 /usr/lib/bluetooth/bluetoothd Jun 18 22:30:00 pi-bplus systemd[1]: Starting Bluetooth service... Jun 18 22:30:01 pi-bplus bluetoothd[309]: Bluetooth daemon 5.50 Jun 18 22:30:01 pi-bplus systemd[1]: Started Bluetooth service. Jun 18 22:30:01 pi-bplus bluetoothd[309]: Starting SDP server Jun 18 22:30:01 pi-bplus bluetoothd[309]: Bluetooth management interface 1.14 initialized Jun 18 22:30:01 pi-bplus bluetoothd[309]: Sap driver initialization failed. Jun 18 22:30:01 pi-bplus bluetoothd[309]: sap-server: Operation not permitted (1) |
Jetzt lassen wir uns mal die lokalen Geräte mit hcitool ausgeben:
hcitool dev
1 2 |
Devices: hci0 00:00:xx:xx:11:7D |
Jetzt können wir nach Geräten in Reichweite suchen mit hcitool scan.
hcitool scan
1 2 |
Scanning ... 37:00:00:00:xx:xx BT-SPEAKER |
Ok, er hat ein Gerät gefunden. Mein Bluetooth Lautsprecher. Super. Nun können wir ihn auch mal fünf mal anpingen:
sudo l2ping -c 5 -v 37:00:00:00:xx:xx
Das Ergebnis, er ist erreichbar:
1 2 3 4 5 6 7 |
Ping: 37:00:00:00:xx:xx from 00:00:3A:69:xx:xx (data size 44) ... 44 bytes from 37:00:00:00:8E:C4 id 0 time 13.09ms 44 bytes from 37:00:00:00:8E:C4 id 1 time 12.32ms 44 bytes from 37:00:00:00:8E:C4 id 2 time 11.16ms 44 bytes from 37:00:00:00:8E:C4 id 3 time 12.23ms 44 bytes from 37:00:00:00:8E:C4 id 4 time 12.43ms 5 sent, 5 received, 0% loss |
Ist das Gerät nicht erreichbar, bzw. ausgeschaltet dann kommt:
Can’t connect: Host is down
Ok, dann starten wir mal ein Scann im Hintergrund mit btmon:
sudo btmon &
So der Monitor läuft …
1 2 3 4 5 6 7 8 9 |
[1] 1889 pi@pi-bplus:~$ Bluetooth monitor ver 5.50 = Note: Linux version 4.19.118+ (armv6l) 0.938716 = Note: Bluetooth subsystem version 2.22 0.938736 = New Index: 00:00:3A:69:xx:xx (Primary,USB,hci0) [hci0] 0.938741 = Open Index: 00:00:3A:69:xx:xx [hci0] 0.938745 = Index Info: 00:00:3A:69:xx:xx (Broadcom Corporation) [hci0] 0.938750 @ MGMT Open: bluetoothd (privileged) version 1.14 {0x0001} 0.938763 @ MGMT Open: btmon (privileged) version 1.14 |
In einer neuen Konsole starten wir
sudo bluetoothctl
Auf der Konsolen starten wir den Scann dann mit:
scan on
Und schon läuft im anderen Fenster der Scann durch:
Wir unterbrechen den Task mit (sudo ps -all und dann sudo kill nr (oder Control +c, wenn nicht im Hintergrund) um die Daten für die weitere Auswertung in eine Datei (btmon-scann.btmon) zu schreiben. Wir starten mit
sudo btmon -w btmon-scan.btmon &
Nach ein paar Minuten Laufzeit unterbrechen wir denn Scann und laden die Datei in Wireshark. Für Bluetooth gibt es ein eigenes Profil, welches unten rechts ausgewählt werden kann:
Wenn die Datei geladen wird, kann sie mit Wireshark ausgewertet werden:
Wie man sehen kann, hatte ich mein Handy kurz an, das wurde dann gleich vom Bluetooth-Scanner erfasst.
Oben im Menü Wireless gibt es auch noch weitere Statistiken zu der erfassten Datei, die in diesem Fall nur ein paar Minuten lief:
So einfach kann mal Bluetooth Daten mitschneiden. Später mal ein paar weitere Details. Für heute „Freut euch immer!“ und haltet Abstand, sonst …