Création de services d’arrière-plan pour Bluetooth basse consommation sur Android

Contexte :

Idéalement, je voudrais que mon appareil Android recherche les appareils Bluetooth Low Energy en permanence, qu’il soit capable de démarrer une application chaque fois qu’un nouvel appareil avec des propriétés spécifiques apparaît.

Ainsi, le paquet de diffusion dans BLE énumérera par exemple un ensemble de services fournis par le dispositif de diffusion. Une application pourrait alors enregistrer un intérêt pour certains services et être lancée automatiquement lorsqu’un périphérique doté de ces services est disponible.

D’après ce que j’ai compris, ce n’est pas ainsi que fonctionne l’API Android BLE? Alors, comment puis-je obtenir quelque chose de similaire?

Exemple le plus simple possible :

J’ai un capteur BLE qui enregistre la température ambiante au fil du temps. Lorsque mon téléphone Android est assez proche, je souhaite connecter et télécharger toutes les données, en les envoyant à une solution de stockage en nuage. Cette application ne nécessiterait aucune interface graphique (du moins pas après la configuration). Mais comment devrait-il fonctionner en arrière-plan sans vider la batterie, mais toujours me donner une assez bonne chance de connecter l’appareil rapidement une fois qu’il est à scope?

Question :

Dois-je définir une timer et réveiller l’application de temps en temps, puis lancer manuellement la numérisation? Quel type d’intervalles dois-je alors choisir? Combien de temps puis-je laisser le scanner en marche sans affecter la batterie?

Solution possible :

C’est ce que j’ai inventé jusqu’ici.

  • Une activité de configuration pour définir les intervalles et les périphériques à parsingr
  • L’activité de configuration configurera un WakefulBroadcastReceiver similaire à l’exemple Scheduler
  • Lorsque le récepteur reçoit l’événement onReceive, je lance un service de scan BLE (que j’ai écrit) en tant que service réactif.
  • Le service de numérisation commence à numériser (avec un rappel enregistré).
  • Le service peut obtenir des rapports d’avancement sur lesquels il peut agir
  • Après une temporisation, le service arrête le scanner et met fin au service de veille.

Cela fonctionne, mais je ne suis pas sûr que ce soit la meilleure façon. Je ne sais pas non plus combien de temps je peux avoir et encore éviter de détruire la vie de la batterie. Ce que je voudrais, c’est commencer à numériser toutes les deux minutes, en balayant pendant 10 à 20 secondes. Mais j’ai bien peur que ce soit assez souvent pour réveiller l’appareil?

Cette fonctionnalité a été déplacée vers la bibliothèque Open Source Android Beacon qui:

  • Réveillez / lancez votre application lorsque des iBeacons correspondant à un motif souhaité sont détectés

  • effectuer une parsing de balise en arrière-plan même si l’utilisateur n’a pas encore lancé votre application

  • Réduisez automatiquement le taux de numérisation en arrière-plan à 30 secondes toutes les cinq minutes pour économiser la batterie. (Timing configurable.)

Les exemples de code sont affichés ici

Si votre appareil BLE n’est pas une balise, vous pouvez toujours utiliser cette bibliothèque pour y parvenir en demandant à votre capteur de transmettre également en tant que balise, puis une fois qu’il est détecté, connectez-vous au service principal.