web-dev-qa-db-fra.com

Création de services d'arrière-plan pour Bluetooth Low Energy sur Android

Contexte :

Idéalement, je voudrais que mon appareil Android recherche des appareils Bluetooth Low Energy tout le temps et puisse 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 serait alors en mesure d'enregistrer un intérêt pour certains services et de démarrer automatiquement lorsqu'un appareil avec ces services est à portée.

D'après ce que je comprends, ce n'est pas comment 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. Chaque fois que mon Android est assez proche, je veux me connecter et télécharger toutes les données, en les envoyant à une solution de stockage en nuage. Cette application n'aurait pas besoin d'interface graphique (du moins pas après la configuration) Mais comment doit-il fonctionner en arrière-plan sans vider la batterie, mais me donne quand même une assez bonne chance de connecter rapidement l'appareil une fois qu'il est à portée?

Question :

Dois-je définir une minuterie et réactiver 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 fonctionner sans nuire à la batterie?

Solution possible :

C'est ce que j'ai trouvé jusqu'à présent.

  • Une activité de configuration pour définir les intervalles et les périphériques à rechercher
  • L'activité de configuration mettra en place 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 de veille.
  • Le service de numérisation commence la numérisation (avec un rappel enregistré).
  • Le service peut obtenir des rapports avancés sur lesquels il peut agir
  • Après une temporisation, le service arrêtera le scanner et mettra 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 à quel point je peux avoir de petits intervalles et j'évite toujours de détruire l'autonomie de la batterie. Ce que je voudrais, c'est commencer à numériser toutes les deux minutes, en numérisant pendant 10 à 20 secondes. Mais je crains que ce ne soit assez fréquent pour réveiller l'appareil?

46
Vegar Westerlund

Cette fonctionnalité a été déplacée vers l'open source Android Beacon Library qui va:

  • réveiller/lancer votre application lorsque des iBeacons correspondant à un modèle souhaité sont détectés

  • effectuer une analyse des balises 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.)

Des exemples de code sont affichés ici

Si votre périphérique BLE n'est pas une balise, vous pouvez toujours utiliser cette bibliothèque pour y parvenir en faisant en sorte que votre capteur transmette également en tant que balise, puis une fois détecté, connectez-vous au service principal.

21
davidgyoung