Comment annoncer Android comme périphérique Bluetooth LE

Bien qu'il s'agisse d'une technologie relativement nouvelle, Bluetooth Low Energy (LE) s'est déjà révélé être un support de communication polyvalent et utile. Bien qu’il puisse être utilisé pour connecter des appareils entre eux sans fil, il permet également aux appareils d’agir comme des balises et de diffuser des données..

Dans ce tutoriel, vous en apprendrez plus sur les BluetoothLeAdvertiser qui permet aux développeurs de transformer un téléphone pris en charge en balise Bluetooth LE sans avoir besoin de matériel supplémentaire. Vous apprendrez également à analyser les données de publication Bluetooth LE afin de pouvoir réagir correctement au sein de vos propres applications. Vous pouvez télécharger les fichiers source de ce tutoriel sur GitHub.

1. Configuration du projet

Pour ce tutoriel, vous pouvez commencer par créer un projet vide de base dans Android Studio. Vous devez définir la version minimale du SDK sur 21 dans ton build.gradle La publicité Bluetooth LE n’a pas été introduite sur Android avant la sortie de Lollipop. Bien qu'il existe des méthodes pour encapsuler les API qui ne sont pas prises en charge avant SDK 21, elles ne seront pas traitées dans ce didacticiel. Nous allons seulement nous concentrer sur la nouvelle technologie à portée de main.

defaultConfig applicationId "com.tutsplus.bleadvertising" minSdkVersion 21 targetSdkVersion 23 versionCode 1 versionName "1.0"

Ensuite, vous devez ajouter trois autorisations au projet. AndroidManifest.xml. Les deux premiers permettent la communication Bluetooth et le troisième permission, ACCESS_COARSE_LOCATION, est une nouvelle exigence pour utiliser Bluetooth sur les appareils Android 6.0 et versions ultérieures.

  

Si vous développez sur un appareil exécutant Android 6.0 ou une version ultérieure, votre application a besoin de l'autorisation d'emplacement accordée par l'utilisateur. Vous trouverez des instructions à ce sujet dans Comprendre les autorisations dans Android M, que j’ai écrit plus tôt cette année. Par souci de simplicité, ce didacticiel accordera simplement la permission à partir de l'écran Informations sur l'application Android..

Maintenant que vous avez la permission d'accéder à tout ce dont votre application aura besoin, il est temps de créer le fichier de présentation. Ouvrir activity_main.xml et créer une mise en page simple avec deux boutons et une vue texte.

  

Les deux Bouton les objets sont utilisés pour lancer une annonce ou une découverte. le Affichage est utilisé pour afficher les données trouvées lors de la découverte. Lorsque vous avez terminé de remplir le fichier de mise en page, vous pouvez le fermer et ouvrir MainActivity.java. La première chose que vous faites dans ce fichier est d’ajouter l’implémentation pour View.OnClickListener qui est utilisé par les boutons.

Classe publique MainActivity caps AppCompatActivity implémente View.OnClickListener @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main);  @Override public void onClick (Afficher v) if (v.getId () == R.id.discover_btn) discover ();  else if (v.getId () == R.id.advertise_btn) advertise (); 

Au dessus onClick (Voir v) méthode, afficher() et découvrir() sont définis plus tard dans ce tutoriel. Vous pouvez maintenant ajouter des stubs pour ces méthodes afin que votre application puisse être compilée. Ensuite, vous devez créer des variables de membre en haut de la classe pour garder une trace des boutons et de la vue texte..

TextView privé mText; bouton privé mAdvertiseButton; bouton privé mDiscoverButton;

Une fois que vous avez défini vos vues, vous devez les initialiser en onCreate (Bundle savedInstanceState) et fil chaque Bouton jusqu'à la OnClickListener vous avez défini plus tôt.

@Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); mText = (TextView) findViewById (R.id.text); mDiscoverButton = (Bouton) findViewById (R.id.discover_btn); mAdvertiseButton = (Button) findViewById (R.id.advertise_btn); mDiscoverButton.setOnClickListener (this); mAdvertiseButton.setOnClickListener (this); 

Enfin, assurez-vous que le périphérique que vous ou vos utilisateurs utilisez prend en charge plusieurs publicités. Bien que Lollipop propose les fonctionnalités logicielles nécessaires à la publicité en tant que périphérique, les fabricants doivent également utiliser un chipset Bluetooth prenant en charge la publicité..

Si la publicité Bluetooth LE n'est pas prise en charge, vous devez désactiver les deux boutons de votre application. Alors que cette fonctionnalité est connue pour fonctionner sur les Nexus 6, 5X, 6P et 9, il existe d'autres téléphones qui prennent également en charge la publicité Bluetooth LE et des périphériques supplémentaires continueront à être fabriqués à mesure que les fabricants créent de nouveaux téléphones et tablettes..

if (! BluetoothAdapter.getDefaultAdapter (). isMultipleAdvertisementSupported ()) Toast.makeText (this, "Publication multiple non prise en charge", Toast.LENGTH_SHORT) .show (); mAdvertiseButton.setEnabled (false); mDiscoverButton.setEnabled (false); 

2. Publicité sur Bluetooth LE

Pour commencer à faire de la publicité via Bluetooth, vous devez récupérer le BluetoothLeAdvertiser de l'Android BluetoothAdapter. Vous pouvez le faire dans le afficher() méthode qui est appelée lorsque le bouton de publicité est exploité.

BluetoothLeAdvertiser advertiser = BluetoothAdapter.getDefaultAdapter (). GetBluetoothLeAdvertiser ();

Une fois que vous avez votre BluetoothLeAdvertiser, vous définissez les paramètres utilisés lors de la publicité, tels que la quantité d'énergie que l'antenne doit utiliser lors de la diffusion et la fréquence à laquelle le périphérique doit annoncer. le AnnoncerSettings.Builder La classe vous permet également de définir si le périphérique mobile doit être connectable, ce qui vous permet de diffuser beaucoup plus de données sur les périphériques..

AdvertSettings settings = new AdvertSettings.Builder () .setAdvertiseMode (AdvertSettings.ADVERTISE_MODE_LOW_LATENCY) .setTxPowerLevel (AdvertSettings.ADVERTISE_TX_POWER_HIGH) .setConnectable (false) .build ();

Vous remarquerez que cet exemple concerne les publicités à puissance de signal élevée (TX) et à faible temps de latence. Bien que cela rende votre appareil rapidement identifiable, il peut également occuper une grande partie de la batterie, qui est un produit précieux lorsque vous vous développez dans l’espace mobile..

Il existe d'autres options pour le mode publicité. le ADVERTISE_MODE_LOW_POWER L’option est le paramètre par défaut pour la publicité et transmet le moins souvent afin de conserver le maximum de puissance. le ADVERTISE_MODE_BALANCED l'option tente de conserver l'énergie sans attendre trop longtemps entre les annonces.

La puissance d'émission peut être réglée sur ultra basse, basse, moyenne ou haute. Chaque niveau correspond à la distance à laquelle un paquet publicitaire Bluetooth LE sera visible, bien que les plages exactes dépendent du matériel du périphérique..

Ensuite, vous définissez un UUID utilisé pour identifier vos paquets lorsqu'ils sont annoncés. Vous pouvez créer un nouvel UUID en utilisant le Uuidgen utilitaire depuis la ligne de commande.

~ Uuidgen CDB7950D-73F1-4D4D-8E47-C090502DBD63

Alors que cet utilitaire crée un UUID 128 bits, le système Android utilise uniquement des UUID 16 bits pour la publication et ajuste automatiquement un UUID 128 bits pour se conformer. Dans l'exemple ci-dessus, l'UUID 16 bits serait 950D. Ensuite, sauvegardez l’UUID 128 bits en tant que chaîne dans strings.xml.

CDB7950D-73F1-4D4D-8E47-C090502DBD63

Une fois votre UUID créé, il est temps de créer le ParcelUuidAnnoncerDonnées objet et diffuser des données supplémentaires en tant que service supplémentaire. Pour cet exemple, vous ne diffusez que le nom du périphérique et la chaîne "Les données" (qui doit être converti en tableau d'octets) car la taille de vos paquets publicitaires est assez limitée.

ParcelUuid pUuid = new ParcelUuid (UUID.fromString (getString (R.string.ble_uuid))); AdvertData data = new AdvertData.Builder () .setIncludeDeviceName (true) .addServiceUuid (pUuid) .addServiceData (pUuid, "Données" .getBytes (Charset.forName ("UTF-8")) .build ();

La dernière chose à faire pour annoncer via Bluetooth LE avec votre appareil est de créer un rappel rappelant le succès ou l’échec de la publicité, puis de commencer à annoncer sur le BluetoothLeAdvertiser.

AdvertCallback advertisingCallback = new AdvertCallback () @Override public void onStartSuccess (AdvertSettings settingsInEffect) super.onStartSuccess (settingsInEffect);  @Override public void onStartFailure (int errorCode) Log.e ("BLE", "Advertising onStartFailure:" + errorCode); super.onStartFailure (errorCode); ; advertiser.startAdvertising (paramètres, données, advertCallback);

À ce stade, vous devriez pouvoir exécuter votre application et commencer à faire de la publicité via Bluetooth LE. Cependant, la prochaine étape de ce didacticiel consistera à découvrir des publicités pour pouvoir afficher ces informations..

3. Découverte des publicités Bluetooth LE

Avant de commencer à découvrir les services Bluetooth LE, vous devez ajouter quelques variables de membre supplémentaires en haut de votre classe..

BluetoothLeScanner privé mBluetoothLeScanner; gestionnaire privé mHandler = nouveau gestionnaire ();

mBluetoothLeScanner est utilisé pour rechercher les paquets Bluetooth LE et mHandler contrôle une petite minuterie qui arrête la découverte après une période de temps définie.

En plus de ces variables de membre, vous devez créer un nouveau ScanCallback en haut de votre classe afin qu’il soit accessible ultérieurement dans votre application par une classe interne. Ce rappel reçoit le résultat d'une publicité acceptable découverte et affiche le nom du périphérique publicitaire et les données associées dans une vue de texte..

private ScanCallback mScanCallback = new ScanCallback () @Override public void onScanResult (int callbackType, résultat ScanResult) super.onScanResult (callbackType, result); if (result == null || result.getDevice () == null || TextUtils.isEmpty (result.getDevice (). getName ())) return; StringBuilder builder = new StringBuilder (result.getDevice (). GetName ()); constructeur.append ("\ n"). append (new String (result.getScanRecord (). getServiceData (result.getScanRecord (). getServiceUuids (). get (0)), Charset.forName ("UTF-8") ) mText.setText (builder.toString ());  @Override public void onBatchScanResults (List résultats) super.onBatchScanResults (résultats);  @Override public void onScanFailed (int errorCode) Log.e ("BLE", "Discovery onScanFailed:" + errorCode); super.onScanFailed (errorCode); ;

Ensuite, initialisez mBluetoothLeScanner dans onCreate (Bundle savedInstanceState) comme indiqué ci-dessous.

mBluetoothLeScanner = BluetoothAdapter.getDefaultAdapter (). getBluetoothLeScanner ();

Après avoir initialisé le scanner Bluetooth, vous pouvez commencer à étoffer le découvrir() méthode. Pour cet exemple d’application, vous créez un ScanFilter objet et placez-le dans un liste afin que votre application ne réponde qu'aux paquets publicitaires qui vous intéressent.

Filtre ScanFilter = new ScanFilter.Builder () .setServiceUuid (new ParcelUuid (UUID.fromString (getString (R.string.ble_uuid)))) .build (); filtres.add (filtre);

Vous devez également créer un ScanSettings objet, qui fonctionne de manière similaire à la Publicité objet que vous avez créé précédemment dans ce tutoriel.

Paramètres ScanSettings = new ScanSettings.Builder () .setScanMode (ScanSettings.SCAN_MODE_LOW_LATENCY) .build ();

Une fois que vos filtres, paramètres et rappels sont en place, vous pouvez commencer à découvrir les publicités Bluetooth LE..

mBluetoothLeScanner.startScan (filtres, paramètres, mScanCallback);

Si vous exécutez maintenant votre application sur deux périphériques prenant en charge les publicités Bluetooth LE et définissant l'un pour la publicité et l'autre pour la découverte, le périphérique de détection doit rechercher l'annonceur et afficher les données publiées. La capture d'écran suivante montre un Nexus 5X découvrant un Nexus 6 publicitaire.

La dernière chose à faire est de créer un nouveau Runnable objet et l'associer à mHandler. Le gestionnaire attend dix secondes, puis lance le Runnable cela arrête la découverte. La raison en est que la découverte peut vider rapidement la batterie de l'appareil. Vous voulez seulement essayer de découvrir des paquets de publicité pendant de courtes périodes ou lorsque vous espérez trouver un périphérique publicitaire.

mHandler.postDelayed (new Runnable () @Override public void run () mBluetoothLeScanner.stopScan (mScanCallback);, 10000);

Conclusion

Bien que cet exemple puisse ne pas être très compliqué à regarder, vous venez de créer une application entièrement fonctionnelle qui fait de la publicité via Bluetooth LE afin que d'autres appareils puissent la découvrir et transférer des données. Bien que ce tutoriel ait traité de la publicité et de la découverte avec Android, vous pouvez tout aussi facilement créer une application similaire pour iOS afin de partager des données sur les deux plates-formes ou de créer votre propre appareil compatible Bluetooth LE pouvant interagir avec les téléphones mobiles et les tablettes..

Comme cette technologie continue de croître et d'être intégrée dans les poches de tout le monde, les développeurs disposeront d'une infinité de possibilités pour réaliser des tâches vraiment intéressantes. Pour plus d'informations sur l'utilisation de la technologie Bluetooth supplémentaire sur Android, consultez Créer un scanner Bluetooth avec l'API Bluetooth d'Android par Matthew Kim..