webentwicklung-frage-antwort-db.com.de

Verwendung von bluetoothctl wie hcitool lescan zum Melden wiederholter Proximity Beacons

Ich kann hcitool lescan mit dem Flag --duplicates verwenden, um periodische LE Advertising Reports (Proximity Beacons) von zwei benachbarten BLE-Geräten zu erfassen:

$ Sudo hcitool lescan --duplicates
LE Scan ...
C8:0F:10:29:4D:98 MI1S
C8:0F:10:29:4E:75 MI1S
C8:0F:10:29:4E:75 MI1S
C8:0F:10:29:4D:98 MI1S
C8:0F:10:29:4E:75 MI1S
C8:0F:10:29:4D:98 MI1S
<snip>

Hier ist dieser Scan erneut, mit Zeitstempeln, die die Periodizität anzeigen:

$ Sudo stdbuf -i0 -o0 -e0 hcitool lescan --duplicates | Perl -nle 'print scalar(localtime), " ", $_'
Wed Apr 13 13:46:45 2016 LE Scan ...
Wed Apr 13 13:46:46 2016 C8:0F:10:29:4E:75 MI1S
Wed Apr 13 13:46:47 2016 C8:0F:10:29:4D:98 MI1S
Wed Apr 13 13:46:48 2016 C8:0F:10:29:4E:75 MI1S
Wed Apr 13 13:46:48 2016 C8:0F:10:29:4D:98 MI1S
Wed Apr 13 13:46:50 2016 C8:0F:10:29:4D:98 MI1S
Wed Apr 13 13:46:52 2016 C8:0F:10:29:4E:75 MI1S
<snip>

Auf der Embedded Linux Conference und dem IoT Summit letzte Woche (April 2016) sagte ein Moderator, der am BlueZ-Stack arbeitet, hcitool nicht mehr und stattdessen bluetoothctl.

Ich habe das heute ausprobiert, aber es zeigt nur den ersten LE Advertising Report für ein Gerät (wie hcitool auf die Option --duplicates verzichtet):

$ Sudo bluetoothctl
[NEW] Controller 5C:F3:70:62:68:28 BlueZ 5.38 [default]

[bluetooth]# power on
Changing power on succeeded
[CHG] Controller 5C:F3:70:62:68:28 Powered: yes

[bluetooth]# scan on
Discovery started
[CHG] Controller 5C:F3:70:62:68:28 Discovering: yes
[CHG] Device C8:0F:10:29:4E:75 RSSI: -72
[CHG] Device C8:0F:10:29:4D:98 RSSI: -65

[bluetooth]# devices
Device C8:0F:10:29:4D:98 MI1S
Device C8:0F:10:29:4E:75 MI1S

Wie können Sie mit bluetoothctl wiederholte LE-Werbeberichte von demselben Gerät erfassen, wie dies bei hcitool mit der Option --duplicates der Fall ist?

11
jfathman

Habe gerade folgendes für mich gefunden (Ubuntu 18.04.1, bluez 5.48):

$ bluetoothctl
[bluetooth]# scan on
[bluetooth]# menu scan
[bluetooth]# clear
SetDiscoveryFilter success
[NEW] Device de:ad:be:ef:ca:fe SampleDev
[CHG] Device de:ad:be:ef:ca:fe RSSI: -73
[CHG] Device de:ad:be:ef:ca:fe RSSI: -73
[CHG] Device de:ad:be:ef:ca:fe RSSI: -74

Sieht aus, als wäre ein Standard-Scanfilter aktiv, der die meisten Ankündigungen blockiert.

1
Florian Echtler

Danke Florian für deinen Vorschlag.

Seit meinem ursprünglichen Beitrag bin ich zu einer Ubuntu 16.04.4 Embedded Linux-Distribution mit bluez 5.42 migriert. Leider erkennt bluetoothctl mit dieser Version 'Menü-Scan' oder 'Löschen' nicht:

[bluetooth]# menu scan
Invalid command

[bluetooth]# clear
Invalid command

Ermutigt durch Ihre Erwähnung von "Standard-Scanfilter aktiv, der die meisten Werbungen blockiert", experimentierte ich mit den Befehlen, die in meiner Version von bluetoothctl verfügbar sind, wie in der Ausgabe --help zu sehen ist.

[email protected]:~# bluetoothctl
[NEW] Controller 00:1A:7D:DA:71:13 iot #1 [default]
[NEW] Controller 70:2C:1F:31:F4:AF iot 

[bluetooth]# set-scan-filter-clear
SetDiscoveryFilter success

[bluetooth]# set-scan-filter-transport le
SetDiscoveryFilter success

[bluetooth]# scan on
Discovery started

[CHG] Controller 00:1A:7D:DA:71:13 Discovering: yes
[NEW] Device 0F:64:64:EE:E7:C4 0F-64-64-EE-E7-C4
[NEW] Device 0D:6F:45:77:87:F3 0D-6F-45-77-87-F3
[NEW] Device 40:CB:C0:F2:96:27 40-CB-C0-F2-96-27
[CHG] Device 0D:6F:45:77:87:F3 RSSI: -71
[CHG] Device FC:F1:36:73:77:B3 RSSI: -57
[CHG] Device 0F:64:64:EE:E7:C4 RSSI: -49

Es ist ein wenig tippen in bluetoothctl erforderlich, um es so konfigurieren zu können, wie ich es möchte, und diese Eingabe wird durch die Bluetooth-Protokollierungsaktivität in unserer reich an Beacon reichenden Umgebung verdeckt. Also habe ich ein bash-Skript zusammengestellt, das ein Heredoc verwendet, und erwarte, die Befehle an bluetoothctl zu übergeben, und sed/grep/Perl massiert die Ausgabe:

$ cat beacon-scan.sh 
#!/bin/bash

# beacon-scan.sh
# Displays beacons including duplicates in real time.
# Uses expect to automate interaction with bluetoothctl.
# Uses sed to remove bluetoothctl colorization escape characters.
# Uses grep to filter out beacon manufacturer data logging.
# Uses Perl to prefix each beacon with a timestamp.

if [ "$(id -u)" != "0" ]; then
    echo "ERROR: must run as root"
    exit 1
fi

(cat <<'END' | /usr/bin/expect

    set Prompt "#"
    set timeout -1

    spawn bluetoothctl

    expect -re $Prompt
    send "scan off\r"

    expect -re $Prompt
    send "remove *\r"

    expect -re $Prompt
    send "set-scan-filter-clear\r"

    expect -re $Prompt
    send "set-scan-filter-transport le\r"

    expect -re $Prompt
    send "scan on\r"

    trap {
        expect -re $Prompt
        send "scan off\r"

        expect -re $Prompt
        send "remove *\r"

        expect -re $Prompt
        send "quit\r"
    } SIGINT

    expect eof

END
) | sed --unbuffered --quiet --expression 's/^.*Device //p' \
  | grep --line-buffered -v ManufacturerData \
  | Perl -nle 'print scalar(localtime), " ", $_'

Es klappt:

$ Sudo ./beacon-scan.sh 
Wed Aug 22 19:34:07 2018 0F:64:64:EE:E7:C4 RSSI: -59
Wed Aug 22 19:34:07 2018 03:46:00:1D:E9:91 03-46-00-1D-E9-91
Wed Aug 22 19:34:07 2018 4E:20:6B:C7:68:D0 RSSI: -55
Wed Aug 22 19:34:07 2018 76:F1:1A:B9:ED:28 RSSI: -57
Wed Aug 22 19:34:07 2018 32:5D:8C:6A:72:C2 32-5D-8C-6A-72-C2
^C

Wiederholte Beacons werden jetzt von bluetoothctl gemeldet, ähnlich wie wenn hcitool lescan mit der Duplikate-Flag ausgeführt wird.

Ich möchte sagen, dass bluetoothctl einfacher zu verwenden wäre, wenn es über die Befehlszeile konfiguriert werden könnte, ohne es interaktiv konfigurieren zu müssen oder auf komplexere Skripts zurückgreifen zu müssen.

Danke Florian für deine Hilfe.

1
jfathman