Einfache Überwachung der Innenumgebung - ② Erfassen Sie das Bluetooth LE-Werbesignal mit Java (Bluetooth LE / bluez-dbus) -

Einführung

Da wir Java / Raspberry Pi 3B als Plattform ausgewählt haben, werden wir nach einer Java-Bibliothek suchen, die mit verschiedenen Sensoren in dieser Umgebung kommuniziert.

Zunächst zu Bluetooth LE. In den letzten Jahren sind Geräte aufgetaucht, die Sensordaten über BLE-Kommunikation erfassen können. Dieses Mal habe ich den wichtigsten [Texas Instruments SensorTag CC2650] ausgewählt (http://processors.wiki.ti.com/index.php/CC2650_SensorTag_User's_Guide). Das CC2650 ist ein batteriebetriebenes BLE-Gerät mit einer Größe von ca. 5 cm x 4 cm, mit dem Temperatur, Luftfeuchtigkeit, Beleuchtungsstärke, Druck, Winkelgeschwindigkeit, Beschleunigung und Magnetismus gemessen werden können.

Die Verwendung von CC2650 ist wie folgt.

  1. Schalten Sie den CC2650 (Peripheriegerät) ein und senden Sie ein Werbesignal.
  2. Central fängt das Werbesignal ab und stellt eine Verbindung zum CC2650 her (CC2650 stoppt das Werbesignal).
  3. Central erfasst Sensordaten vom CC2650 mithilfe des BLE GATT-Profils

Darüber hinaus schaltet der CC2650 die Stromversorgung automatisch aus, wenn er nicht innerhalb von 3 Minuten nach Beginn der Übertragung des Werbesignals von irgendwoher angeschlossen wird. Sie müssen es also erneut einschalten, um die Verbindung vorzubereiten. Dieses Mal haben wir bluez-dbus als Java-Bibliothek übernommen, die die BLE-Kommunikation beim Abfangen von Werbesignalen mit Java unterstützt.

Ich habe früher Code in Java geschrieben, um probeweise Sensordaten von CC2650 zu erhalten. Zu diesem Zeitpunkt war bluez-dbus noch nicht verfügbar, und es war ungefähr zu der Zeit, als Intel TinyB als eine weitere Bibliothek für die BLE-Kommunikation mit Java veröffentlicht wurde. tat. TinyB, das gerade veröffentlicht worden war, war jedoch instabil, und zu diesem Zeitpunkt konnte die Benachrichtigungsfunktion von BLE nicht verwendet werden. Vor allem die von bluez veröffentlichte dbus I / F-Definitionsdatei wird automatisch in C / C ++ - Code konvertiert (mehr als 10.000 Codezeilen werden automatisch generiert), und TinyB wird durch weitere Änderung erstellt. Ich hatte das Gefühl, dass die Wartbarkeit sehr gering war.

Bei Verwendung von BLE mit dbus I / F wird dbus selbst auf dem UNIX-Domänensocket definiert, sodass im Wesentlichen nur dieser UNIX-Domänensocket-Teil in JNI geschrieben und darauf definiert wird. Ich dachte, dass das dbus-Protokoll für bluez durch den Aufruf dieses JNI einfach zu implementieren ist.

Zu dieser Zeit hatte ich keine andere Wahl, als Java-Code zu schreiben, der verschiedene bluez-Befehle als residenten Prozess verknüpft, und ich habe ihn übertroffen. Es ist eine komplizierte Architektur, und ich fand sie umständlich. Ich habe den Code damals vergessen, aber dieser beschissene Eindruck bleibt immer noch.

Die Tage sind seitdem vergangen und jetzt wurde eine Bibliothek namens bluez-dbus veröffentlicht, die BLE unterstützt. Wenn ich die auf Github geschriebenen Entwicklermotive lese, ist es genau so, wie ich dachte. (Nun, ich denke schon ...)

Also schrieb ich diesmal den Code privat mit einer einfachen Architektur, die bluez-dbus übernahm. Die Einführung ist länger, aber der Text ist kürzer. Grundsätzlich ist es genau das, was Sie in Github geschrieben haben. Einzelheiten finden Sie im Code.

Installation des Betriebssystems

Raspbian Buster Lite OS (2019-07-10) wird als Betriebssystem von Raspberry Pi 3B verwendet. Dieses Betriebssystem enthält BlueZ 5.50, das von Anfang an von bluez-dbus unterstützt wird, sodass BlueZ nicht erneut erstellt werden muss.

Java-Installation

Ich denke, es gibt Java für die ARM-Version Linux, aber ich habe jdk11 von BELLSOFT in [apt-get](https: //apt.bell-sw) geändert. Ich habe es in .com /) gestellt.

# wget -q -O - https://download.bell-sw.com/pki/GPG-KEY-bellsoft | apt-key add -
# echo "deb [arch=armhf] https://apt.bell-sw.com/ stable main" | tee /etc/apt/sources.list.d/bellsoft.list
# apt-get update
# apt-get install bellsoft-java11

Was ist ein Bluetooth-Scanner?

Dieses Modul dient zum Abfangen von BLE-Werbesignalen. Der Zweck besteht darin, dynamisch zu erkennen, dass ein BLE-Gerät in den Bereich der zentralen BLE-Kommunikation eingetreten ist. Insbesondere nähert sich der CC2650 und Central erkennt seine Existenz und löst die Verbindung aus.

Außerdem verlässt der angeschlossene CC2650 den Kommunikationsbereich von Central, die BLE-Kommunikation wird getrennt (das Ankündigungssignal wird neu gestartet), und dann nähert er sich erneut, Central fängt das Werbesignal ab und wird automatisch zu CC2650. Es soll auch als Auslöser für die Wiederverbindung dienen.

** Bluetooth-Scanner ** Der Schlüssel zur Verarbeitung ist dbus-java Es soll eine Klasse vorbereitet werden, die die AbstractPropertiesChangedHandler.java, die von "public void handle (PropertiesChanged properties)" bereitgestellt wird, erweitert und implementiert. Weitere Informationen finden Sie im Code unter Github. Unten finden Sie ein Beispiel für die Verwendung von ** Bluetooth-Scanner **. Implementieren Sie die IScanHandler-Schnittstelle, um eine Instanz von ScanProcess.java zu erstellen, und rufen Sie start () auf.

import com.github.hypfvieh.bluetooth.DiscoveryFilter;
import com.github.hypfvieh.bluetooth.DiscoveryTransport;
import com.github.hypfvieh.bluetooth.wrapper.BluetoothDevice;

import io.github.s5uishida.iot.bluetooth.scanner.IScanHandler;
import io.github.s5uishida.iot.bluetooth.scanner.ScanData;
import io.github.s5uishida.iot.bluetooth.scanner.ScanProcess;

public class MyScan {
    public static void main(String[] args) throws IOException, InterruptedException {
        Map<DiscoveryFilter, Object> filter = new HashMap<DiscoveryFilter, Object>();
        filter.put(DiscoveryFilter.Transport, DiscoveryTransport.LE);
        
        ScanProcess scanProcess = new ScanProcess("hci0", new MyScanHandler(), filter);
        scanProcess.start();
    }
}

class MyScanHandler implements IScanHandler {
    private static final Logger LOG = LoggerFactory.getLogger(MyScanHandler.class);
    
    @Override
    public void handle(BluetoothDevice device, ScanData data) {
        LOG.info(device.toString());
        LOG.info(data.toString());
    }
}

Ein Beispiel für das Ausführungsprotokoll lautet wie folgt. Der Zeilenanfang wird weggelassen.

MyScanHandler handle - BluetoothDevice [device=org.bluez:/org/bluez/hci0/dev_24_71_89_06_9D_82:interface org.bluez.Device1, adapter=/org/bluez/hci0, getBluetoothType()=DEVICE, getDbusPath()=/org/bluez/hci0/dev_24_71_89_06_9D_82] 
MyScanHandler handle - [hci0] 24:71:89:06:9D:82 name:CC2650 SensorTag rssi:-63 txPower:0 date:2019-09-03 22:40:25.483

Eine Reihe von Artikeln

Diese Reihe besteht aus folgenden Artikeln:

  1. Motivation und Konzept
  2. ** Bluetooth LE-Werbesignal mit Java (Bluetooth LE / bluez-dbus) abfangen (diesmal) ** Der zugehörige Github ist hier.
  3. Temperatur / Luftfeuchtigkeit / Beleuchtungsstärke usw. vom TI SensorTag CC2650 mit Java (Bluetooth LE / bluez-dbus) abrufen Der zugehörige Github ist hier.
  4. CO2-Konzentration von MH-Z19B mit Java abrufen (serielle Kommunikation / jSerialComm) Der zugehörige Github ist hier.
  5. PM2.5-Konzentration von PPD42NS in Java (GPIO / Pi4J) abrufen Der zugehörige Github ist hier.
  6. Betriebsinformationen zu industriellen Automatisierungsgeräten in Java (OPC-UA / Eclipse Milo) abrufen Der verwandte Github ist hier.
  7. In einem einfachen Tool sammeln Der verwandte Github ist hier.
  8. Postscript

Nachtrag

[2019.11.16] Die neuesten Informationen zu einfachen Tools finden Sie unter hier.

Recommended Posts

Einfache Überwachung der Innenumgebung - ② Erfassen Sie das Bluetooth LE-Werbesignal mit Java (Bluetooth LE / bluez-dbus) -
Einfache Überwachung des Innenraumklimas ~ ③ Beziehen Sie Temperatur / Luftfeuchtigkeit / Beleuchtungsstärke usw. vom TI SensorTag CC2650 mit Java (Bluetooth LE / bluez-dbus) ~
Überwachen Sie einfach das Raumklima. ⑪ Erhalten Sie die Beleuchtungsstärke mit Java von BH1750FVI (Ersatz) - (I2C / Pi4J) -
Überwachen Sie einfach das Raumklima ~ ⑧ Postscript ~
Einfache Überwachung des Innenraumklimas - ⑤ Erhalten Sie die PM2.5-Konzentration von PPD42NS mit Java (GPIO / Pi4J) -
Überwachen Sie einfach das Raumklima. (1) Motivation und Konzept.
Einfache Überwachung des Innenraumklimas - ⑩ Beziehen Sie Temperatur / Luftfeuchtigkeit / Druck von BME280 (Ersatz) mit Java (I2C / Pi4J) -
Einfache Überwachung der Innenumgebung - ⑨ Erfassen Sie die Bewegungserkennung (HC-SR501 / RCWL-0516) mit Java (GPIO / Pi4J) -
Einfache Überwachung des Raumklimas - ⑦ Mit einem einfachen Tool zusammenfassen -
Einfache Überwachung des Innenraumklimas - ⑥ Erfassen von Betriebsinformationen für industrielle Automatisierungsgeräte in Java (OPC-UA / Eclipse Milo) -
Überwachen Sie den internen Status von Java-Programmen mit Kubernetes
Bereiten Sie die Umgebung für Java11 und JavaFx mit Ubuntu 18.4 vor