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.
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.
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.
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
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
Cette série comprend les articles suivants:
[2019.11.16] Pour obtenir les dernières informations sur les outils simples, veuillez consulter ici.
Recommended Posts