Surveillez facilement l'environnement intérieur-② Capturez le signal publicitaire Bluetooth LE avec Java (Bluetooth LE / bluez-dbus) -

introduction

Puisque nous avons sélectionné Java / Raspberry Pi 3B comme plate-forme, nous rechercherons une bibliothèque Java qui communique avec divers capteurs dans cet environnement.

Tout d'abord, à propos de Bluetooth LE. Ces dernières années, des appareils capables d'acquérir des données de capteurs via la communication BLE sont apparus. Cette fois, j'ai sélectionné le principal Texas Instruments SensorTag CC2650. Le CC2650 est un appareil BLE alimenté par pile bouton d'une taille d'environ 5 cm x 4 cm qui peut mesurer la température, l'humidité, l'éclairement, la pression, la vitesse angulaire, l'accélération et le magnétisme.

L'utilisation de CC2650 est la suivante.

  1. Mettez le CC2650 (périphérique) sous tension et envoyez un signal publicitaire.
  2. Central attrape le signal publicitaire et se connecte au CC2650 (CC2650 arrête le signal publicitaire)
  3. Central acquiert les données de capteur du CC2650 à l'aide du profil BLE GATT

Le CC2650 s'éteindra automatiquement s'il n'est pas connecté de n'importe où dans les 3 minutes suivant le début de l'envoi du signal publicitaire. Vous devez donc le réactiver pour préparer la connexion. Cette fois, nous avons adopté bluez-dbus comme bibliothèque Java qui prend en charge la communication BLE lors de la capture de signaux publicitaires avec Java.

J'écrivais du code en Java pour obtenir des données de capteur à partir de CC2650 à titre d'essai. À cette époque, bluez-dbus n'était pas encore disponible, et c'était à peu près au moment où Intel TinyB a été publié comme une autre bibliothèque pour la communication BLE avec Java. fait. Cependant, TinyB, qui venait de sortir, était instable et, à ce moment-là, la fonction de notification de BLE ne pouvait pas être utilisée. Surtout, le fichier de définition dbus I / F publié par bluez est automatiquement converti en code C / C ++ (plus de 10000 lignes de code sont automatiquement générées), et TinyB est créé en le modifiant davantage. J'ai senti que la maintenabilité était très faible.

Lors de l'utilisation de BLE avec dbus I / F, dbus lui-même est défini sur le socket de domaine UNIX, donc essentiellement, seule cette partie de socket de domaine UNIX est écrite en JNI et définie dessus. Je pensais que le protocole dbus pour bluez était simple à implémenter en appelant ce JNI.

À ce moment-là, je n'avais pas d'autre choix que d'écrire du code Java reliant diverses commandes bluez en tant que processus résident, et je l'ai surpassé. C'est une architecture compliquée, et j'ai trouvé que c'était gênant. J'ai oublié le code à ce moment-là, mais cette impression de merde demeure.

Les jours ont passé depuis lors, et maintenant une bibliothèque appelée bluez-dbus qui prend en charge BLE a été publiée. Quand je lis les motivations des développeurs écrites sur Github, c'est comme je le pensais. (Eh bien, je pense que oui ...)

Donc, cette fois, j'ai écrit le code en privé avec une architecture simple qui a adopté bluez-dbus. L'introduction est plus longue, mais le texte est plus court. En gros, c'est exactement ce que vous avez écrit dans Github. Voir le code pour plus de détails.

Installation du système d'exploitation

Raspbian Buster Lite OS (2019-07-10) est utilisé comme système d'exploitation de Raspberry Pi 3B. Ce système d'exploitation inclut BlueZ 5.50, qui est supporté par bluez-dbus, depuis le début, il n'est donc pas nécessaire de reconstruire BlueZ.

Installation de Java

Je pense qu'il y a du Java pour la version ARM Linux, mais j'ai changé jdk11 de BELLSOFT en [apt-get](https: //apt.bell-sw). Je l'ai mis dans .com /).

# 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

Qu'est-ce que le scanner Bluetooth?

Ce module est destiné à capturer les signaux publicitaires BLE. Le but est de reconnaître dynamiquement qu'un dispositif BLE est entré dans la plage de communication BLE centrale. Plus précisément, le CC2650 approche et Central reconnaît son existence et déclenche la connexion.

De plus, le CC2650 connecté sort de la plage de communication de la centrale et la communication BLE est déconnectée (le signal publicitaire est redémarré), puis il se rapproche et la centrale capte le signal publicitaire et bascule automatiquement sur le CC2650. Il est également censé être un déclencheur pour se reconnecter.

** bluetooth-scanner ** La clé de traitement est dbus-java Préparez une classe qui est ʻextends de ʻAbstractPropertiesChangedHandler.java fournie par, et implémentezpublic void handle (propriétés PropertiesChanged). Consultez le code sur Github pour plus d'informations. Vous trouverez ci-dessous un exemple d'utilisation du ** bluetooth-scanner **. Implémentez ʻIScanHandlerʻinterface pour créer une instance de ScanProcess.java et appelez start ().

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());
    }
}

Un exemple du journal d'exécution est le suivant. Le début de la ligne est omis.

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

Une série d'articles

Cette série comprend les articles suivants:

  1. Motivation et concept
  2. ** Capturez le signal publicitaire Bluetooth LE avec Java (Bluetooth LE / bluez-dbus) (cette fois) ** Le Github associé est ici.
  3. Obtenir la température / l'humidité / l'éclairement à partir du TI SensorTag CC2650 avec Java (Bluetooth LE / bluez-dbus) Le Github associé est ici.
  4. Obtenir la concentration de CO2 du MH-Z19B avec Java (communication série / jSerialComm) Le Github associé est ici.
  5. Obtenir la concentration de PM2,5 à partir de PPD42NS en Java (GPIO / Pi4J) Le Github associé est ici.
  6. Obtenir des informations sur le fonctionnement des équipements d'automatisation industrielle en Java (OPC-UA / Eclipse Milo) Le Github associé est ici.
  7. Collectez dans un outil simple Le Github associé est ici.
  8. Postscript

Postscript

[2019.11.16] Pour obtenir les dernières informations sur les outils simples, veuillez consulter ici.

Recommended Posts

Surveillez facilement l'environnement intérieur-② Capturez le signal publicitaire Bluetooth LE avec Java (Bluetooth LE / bluez-dbus) -
Surveillez facilement l'environnement intérieur ~ ③ Obtenez la température / l'humidité / l'éclairement, etc. de TI SensorTag CC2650 avec Java (Bluetooth LE / bluez-dbus) ~
Surveillez facilement l'environnement intérieur-⑪ Obtenez l'éclairement avec Java à partir de BH1750FVI (substitut) - (I2C / Pi4J) -
Surveillez facilement l'environnement intérieur ~ ⑧ Postscript ~
Surveillez facilement l'environnement intérieur-⑤ Obtenez la concentration de PM2,5 à partir du PPD42NS avec Java (GPIO / Pi4J) -
Surveillez facilement l'environnement intérieur - (1) Motivation et concept -
Surveillez facilement l'environnement intérieur - ⑩ Obtenez température / humidité / pression à partir du BME280 (substitut) avec Java (I2C / Pi4J) -
Surveillez facilement l'environnement intérieur ~ ⑨ Obtenez la détection de mouvement (HC-SR501 / RCWL-0516) avec Java (GPIO / Pi4J) ~
Surveillez facilement l'environnement intérieur - ⑦ Résumez dans un outil simple -
Surveillez facilement l'environnement intérieur-⑥ Acquérez les informations de fonctionnement des équipements d'automatisation industrielle en Java (OPC-UA / Eclipse Milo) -
Surveillez l'état interne des programmes Java avec Kubernetes
Préparer l'environnement pour java11 et javaFx avec Ubuntu 18.4