web-dev-qa-db-fra.com

Le Raspberry Pi avec dongle BLE peut-il détecter les iBeacons?

J'ai acheté un kit développeur auprès de Radius Networks qui comprend un ioGear GBU521 BLE 4.0 dongle et un Raspberry Pi. J'ai également acheté un de leurs RadBeacon iBeacons. Ils fonctionnent tous les deux comme annoncé, mais j'ai été un peu surpris par ce que j'ai obtenu.

J'avais supposé que le RaspPi pouvait détecter iBeacons. Au lieu de cela, le kit est configuré pour créer un iBeacon. Mon cas d'utilisation est de détecter quand un forklift entre dans une pièce particulière afin que je puisse leur envoyer du travail. Ma pensée était de mettre un iBeacon sur le chariot élévateur puis de mettre un RaspPi à la recherche d'iBeacons. Et lorsqu'un iBeacon (chariot élévateur) a été détecté, vous pouvez conclure qu'il est à proximité. Je câblerais le RaspPi dans le LAN et lui ferais communiquer les informations via REST or similar. Je sais que je pourrais mettre un Android or Apple device et l'accomplir de cette façon, mais je ne vois pas pourquoi ce dongle ne peut pas détecter ces iBeacons et me dire ce que leur UUID's sont? Qu'est-ce que je rate?

38
user1153660

Oui! Vous pouvez utiliser votre Raspberry Pi pour rechercher des iBeacons. Nous avons mis en place un script ci-dessous qui fait cela, vous pouvez également le faire vous-même avec ces étapes:

  1. Démarrez un processus d'arrière-plan qui effectue une analyse Bluetooth LE:

    Sudo hcitool lescan --duplicates &
    

    Avec le --duplicates la définition de l'analyse n'ignorera pas plusieurs paquets provenant de la même iBeacon.

  2. Démarrez un hcidump et dirigez la sortie brute vers un script qui filtrera les paquets iBeacon:

    Sudo hcidump --raw 
    

Le filtrage est la partie délicate, la sortie brute de hcidump n'est pas bien formatée et montre également les paquets qui ne sont pas des transmissions iBeacon. Pour résoudre ce problème, nous avons créé un script de filtrage qui lit la sortie ligne par ligne et sépare les paquets bruts de l'autre sortie (c'est-à-dire les adresses MAC, etc.). Nous avons fait beaucoup de recherches chez Radius Networks sur le profil Bluetooth iBeacon , que nous avons utilisé pour identifier les paquets iBeacon et les filtrer des paquets provenant d'autres appareils.

Nous avons rassemblé tout cela dans un ibeacon_scan script qui fait tout, y compris la conversion des identifiants bruts en une forme lisible par l'homme. Vous pouvez le télécharger ici . Bientôt, nous l'inclurons dans le Kit de développement iBeacon pour ajouter des capacités de numérisation.

Voici un exemple de la sortie du script:

$ ./ibeacon_scan
UUID: 74278BDA-B644-4520-8F0C-720EAF059935 MAJOR: 0 MINOR: 73 POWER: -50
UUID: 2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 MAJOR: 1 MINOR: 6 POWER: -59
UUID: E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 MAJOR: 6 MINOR: 9 POWER: -55

Nous avons également inclus un -b option pour une sortie nue facile à analyser dans d'autres scripts, voici un exemple:

$ ./ibeacon_scan -b
2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 1 6 -59
E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 6 9 -55
74278BDA-B644-4520-8F0C-720EAF059935 0 73 -50

Vous pouvez utiliser cette option et diriger la sortie du script vers votre script pour déclencher des actions lorsque des iBeacons avec certains identificateurs sont détectés.

EDIT: Nous avons retravaillé ce script pour le rendre plus réactif et robuste et l'avons incorporé dans la dernière version du kit de développement =. La mise à jour est disponible en téléchargement ici .

EDIT2: Comme indiqué par @ sai-ramachandran , vous pouvez augmenter ce script pour capturer le RSSI de chaque paquet iBeacon dans en plus de POWER. Pour ce faire, ajoutez les lignes suivantes au script:

 RSSI=`echo $packet | sed 's/^.\{132\}\(.\{2\}\).*$/\1/'`
 RSSI=`echo "ibase=16; $RSSI" | bc`
 RSSI=$[RSSI - 256]

et assurez-vous d'ajouter RSSI à la sortie:

 echo "UUID: $UUID MAJOR: $MAJOR MINOR: $MINOR POWER: $POWER RSSI: $RSSI"
71
jjnebeker

Vous avez raison: iBeacon Development Kit n'est pas conçu pour détecter les iBeacons - il est conçu pour transmettre en tant qu'iBeacon.

Cela dit, il est possible de détecter des iBeacons avec un Raspberry Pi en utilisant une variation de ce que @ ChrisStratton suggère dans son commentaire. Voir la réponse de mon collègue @ jjnebeker qui a fait un script pour faire ce que vous voulez.

2
davidgyoung