Comment construire un iBeacon Android 1/3
Published: 2024-01-18 15:01:59

Les [détaillants](https://pubnub.com/blog/ecommerce-transformed-cognitive-services-and-the-future/) sont toujours à la recherche de moyens innovants pour stimuler leurs ventes. Les balises, en particulier les balises BLE (Bluetooth Low Energy), sont devenues une technologie qui continue d'attirer l'attention. Même des années après leur introduction, les balises, également connues sous le nom de balises Bluetooth, font toujours les gros titres, principalement sous le nom de "iBeacon" - le protocole d'Apple utilisant les technologies Beacon.

L'importance d'iBeacon peut être largement attribuée à l'adoption précoce de cette technologie par Apple. La société intègre des balises dans les iPhones depuis le modèle 4S, , faisant des appareils iOS des synonymes de la technologie des balises BLE! Ils ont également été les pionniers du développement des protocoles Beacon, mais nous y reviendrons plus tard.

Dans l'écosystème Android, seule une poignée d'appareils possèdent le matériel nécessaire pour fonctionner comme des balises. Par exemple, dans la version de test d'Android 5.0, le Nexus 5 était équipé pour faire office de balise. Toutefois, en raison des limitations de la puce qui ne permettait pas l'émission simultanée de plusieurs balises, la version finale d'Android Lollipop a rendu le Nexus 5 incapable d'utiliser cette technologie. Aujourd'hui, Android 12.0 a introduit un nouveau modèle d'autorisation de localisation, obligeant les applications de balises à apporter des modifications pour cibler la version 29+ du SDK. Dans les versions Android 6.0 et supérieures, les applications doivent impérativement demander des autorisations de localisation aux utilisateurs au moment de l'exécution pour détecter les balises. Ce développement est relativement nouveau pour les téléphones Android, il faut donc s'attendre à ce que les dispositifs BLE et le phénomène des balises gagnent en importance dans un avenir proche, en particulier avec l'émergence du [contrôle des dispositifs IoT](https://www.pubnub.com/solutions/iot-device-control/)!

Types de balises et leurs différences
-------------------------------------

### iBeacon

Le protocole iBeacon d'Apple a été le premier à être introduit. Il est convivial et bénéficie d'un large soutien.

### Eddystone

Eddystone est la réponse de Google à l'iBeacon d'Apple. Initialement appelé UriBeacon, il offre une grande souplesse et, en tant que produit Google, s'intègre de manière transparente à tous les produits et appareils Google, y compris ceux qui utilisent la connectivité WIFI.

### AltBeacon

Créé par Radius Networks, AltBeacon n'affiche aucune préférence pour les fournisseurs. Sa nature open-source permet de personnaliser le code source, ce qui en fait un choix polyvalent pour le développement d'applications.

### **GeoBeacon**

GeoBeacon est un protocole de balise open-source développé par Tecno-World. Il offre 8 types de données utilisateur, et sa nature open-source assure la compatibilité avec diverses plateformes mobiles. Cela en fait un outil puissant dans les scénarios de [géolocalisation](https://www.pubnub.com/solutions/geolocation/), exploitant les balises BLE et la technologie Bluetooth.

Mais d'abord - Clés API à utiliser avec un projet d'application Beacon
----------------------------------------------------------------------

Avant de vous lancer, vous devez [ouvrir un compte PubNub](https://dashboard.pubnub.com/signup). Nous offrons un niveau de bac à sable gratuit incroyablement généreux pour le développement ! Vous aurez besoin des clés API au début de ce tutoriel. Vous pouvez trouver plus d'informations à ce sujet dans notre [document PubNub](https://www.pubnub.com/docs/general/basics/set-up-your-account).

Aperçu du projet Android iBeacon
--------------------------------

Dans ce tutoriel, nous allons nous plonger dans le signal émis par les balises et ensuite tirer parti de ces connaissances pour utiliser le package Android BLE. Cet article de blog est le point de départ de notre série. Après cela, consultez nos tutoriels approfondis sur la construction d'un [émetteur de balises Android (publisher)](https://pubnub.com/blog/build-android-ibeacon-beacon-emitter/) et d'un [détecteur de balises Android (listener)](https://pubnub.com/blog/build-android-beacon-ibeacon-detector/).

Ce tutoriel fait partie de notre série complète sur la construction de balises plus intelligentes, que vous pouvez explorer via l'[aperçu de la série sur les balises](https://pubnub.com/blog/building-smarter-beacons-bidirectional-beacon-communication/) ici. Nous vous guiderons pour initier une communication bidirectionnelle avec une balise - une avancée significative par rapport aux balises originales qui ne pouvaient que diffuser des informations !

![](/cdn/3prze68gbwl1/asset-17suaysk1qa1ht1/390c225f5a3d712a449ad6df71d656a9/nexus9-framed.gif?w=700&h=550)

À quoi ressemble l'annonce d'une balise ?
-----------------------------------------

Conformément à la [spécification de base de Bluetooth](https://www.bluetooth.com/specifications/bluetooth-core-specification/), une balise diffuse un paquet de données appelé "Scan Response Data" (données de réponse au balayage).

Ces données peuvent contenir jusqu'à 31 octets. Si nous générons une réponse de balayage plus petite, les octets restants seront remplis de zéros.

La réponse au balayage est divisée en ce que l'on appelle des structures AD. Il s'agit de séquences d'octets de taille variable, dont la structure prédéfinie est la suivante :

-   Le premier octet représente le nombre d'octets restants jusqu'à la fin de la structure AD. Le premier octet représente le nombre d'octets restant jusqu'à la fin de la structure AD, ce qui permet à un récepteur de cette structure de savoir quand elle se termine et quand une nouvelle structure AD commence.
    
-   Le deuxième octet est l'ID d'un type de structure AD.
    
-   Le reste des octets est constitué de données structurées d'une manière prédéfinie, en fonction du type de structure AD défini par le type précédent.
    

C'est tout ce qu'il y a à faire - juste une succession de structures AD.

La plupart des protocoles de balises, sinon tous, n'ont que deux structures AD, qui sont les suivantes.

Première structure AD
---------------------

La première structure comporte 3 octets :

-   Le premier octet : `**0x02**` car nous ne comptons que les octets suivants.
    
-   Le deuxième octet : `**0x01**` qui indique que nous avons un type AD "Flag".
    
-   Le dernier octet représente ces drapeaux. Ces drapeaux expriment si le dispositif émetteur est, en "Li
    
    L'octet se calcule de la manière suivante : les 5 drapeaux sont représentés par le premier octet :
    

Les 5 drapeaux sont représentés par les 5 premiers bits d'un octet. La valeur de ces bits définit si le drapeau est activé ou désactivé. Le nombre binaire est ensuite écrit sous la forme d'une valeur hexadécimale qui sera annoncée. Un exemple peut clarifier les choses :

![](/cdn/3prze68gbwl1/41MNctRGxlM3f2cVZKjm3o/6a5cce32f5e53ae616c848f3ddf130c8/Screen-Shot-2015-04-13-at-9.49.01-AM.png)

La valeur binaire résultante devient donc : `**b00011010**`. Convertie en hexadécimal, on obtient : `**0x1A**`. Reportez-vous au journal ci-dessous.

Voilà pour la première structure AD ! Examinons maintenant la seconde, qui contient la plupart des informations dont nous avons besoin.

![](/cdn/3prze68gbwl1/asset-17suaysk1qa1hss/e66e14a10c6786db9b16531a146979d8/scan-response-structure.png)

Deuxième structure AD
---------------------

La deuxième structure peut être de taille différente selon le protocole. Nous allons prendre l'exemple d'[AltBeacon](https://altbeacon.org/), qui est presque identique aux autres.

-   Le premier octet est `**0x1B**` (27 en hexadécimal), ce qui signifie que nous prenons tout le dernier octet disponible de notre réponse de balayage de 31 octets. Cela peut varier selon les protocoles.
    
-   L'octet suivant est toujours `**0xFF**`, ce qui signifie que nous avons une structure AD de type "spécifique au fabricant".
    
-   Par conséquent, les 2 octets suivants représentent l'identifiant de l'entreprise tel que défini sur
    
    [bluetooth.org](https://www.bluetooth.com/specifications/assigned-numbers/company-Identifiers/)
    
    . Pour notre appareil Nexus 9, le fabricant de la puce bluetooth n'est pas très clair, nous allons donc simplifier en utilisant l'identifiant du fabricant de Google qui est 224. En valeur hexadécimale, cela correspond à 0x00E0. L'ID, écrit en little endian, occupe les 2 octets. Ici, ce sera `**0x0E0 0x00**` dans cet ordre.
    
-   Le reste est constitué de données spécifiques au fabricant ! C'est ce qui change le plus d'un protocole à l'autre.
    

Pour le protocole AltBeacon, les 2 premiers octets des données spécifiques au fabricant sont `**0xBE 0xAC**` et identifient les ADs altbeacon. Personnellement, j'aime beaucoup le fait qu'ils aient décidé d'utiliser les 4 premières lettres de beacon ! C'est facile à retenir. Les 16 octets suivants sont un UUID représentant l'unité organisationnelle de l'annonceur, et les 4 octets suivants peuvent être subdivisés comme vous le souhaitez. Nous allons les diviser en 2. Nous aurons des numéros de 2 octets de long, similaires aux numéros majeurs et mineurs d'iBeacon. L'octet suivant doit être défini en fonction de votre matériel, et le dernier octet peut être laissé à 0, vous pouvez aussi décider de lui donner la signification que vous voulez.

L'octet, qui dépend du matériel, représente l'intensité du signal à un mètre de distance de votre appareil. Il s'agit du complément à deux de la valeur en dB. La valeur de l'intensité dépend de nombreux facteurs, elle n'est souvent pas très précise. Pour mon Nexus 9, -75dB semble être une estimation correcte. Cela signifie que le complément à deux sera `**-75 + 256 = 181**`, donc en valeur hexadécimale notre octet devient `**0xB5**`.

Calculer la distance d'une balise
---------------------------------

L'une des grandes forces des protocoles de balise est qu'ils vous donnent une valeur approximative de la distance qui vous sépare du dispositif émetteur.

Cette valeur est obtenue en comparant le RSSI de référence, qui est transmis avec la réponse au balayage de la balise, au RSSI détecté par votre téléphone. L'algorithme permettant de calculer cette valeur est souvent la propriété des propriétaires du protocole de balise (Estimote ou iBeacon). Cependant, [AltBeacon](https://altbeacon.org/) étant un projet open-source, nous utiliserons leur algorithme, disponible [ici](https://github.com/AltBeacon/android-beacon-library) et [ici](https://stackoverflow.com/questions/20416218/understanding-ibeacon-distancing).

Nous allons utiliser cet algorithme dans notre code d'exemple pour calculer la distance. Notez que quel que soit le protocole utilisé, la valeur calculée de la distance n'est pas fiable et ne peut pas être utilisée pour détecter la position exacte de l'utilisateur. Vous trouverez plus d'informations sur les limites des balises dans la [documentation d'Apple](https://developer.apple.com/ibeacon/Getting-Started-with-iBeacon.pdf).

Utilisation du paquet Android BLE pour les balises
--------------------------------------------------

Pour utiliser Bluetooth sur un appareil Android, vous devrez d'abord ajouter des permissions à votre manifeste Android :

```js
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
```

Le cœur du paquet se trouve dans l'adaptateur Bluetooth, un outil permettant d'accéder à votre matériel. Par exemple, dans votre méthode onCreate, comme on le voit dans Android 12.0 :

```js
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity\_your\_activity);
  mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
```

C'est tout ce dont vous avez besoin pour commencer. Examinons maintenant des exemples plus spécifiques de balayage et d'émission de balises. Sachez que lorsque vous utilisez le paquetage Android BLE, la première structure AD est lue ou créée automatiquement. Nous nous concentrerons sur la deuxième structure AD. Notamment, le SDK identifie ou crée automatiquement des structures de données spécifiques au fabricant, ce qui évite de devoir éditer les deux premiers octets définissant la taille et le type de données. L'identifiant de l'entreprise est également édité automatiquement, ne nécessitant que la valeur décimale de l'identifiant. Cela simplifie considérablement le processus.

### Scanner des balises sur Android

Pour lancer ce processus, il faut instancier un scanner Bluetooth LE :

```js
mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
```

Le paquetage d'Android permet aux utilisateurs de créer des filtres, ce qui permet de détecter les balises qui correspondent à notre filtre. Pour détecter une altBeacon, il faut d'abord construire un filtre de scan. Créez un tableau d'octets, de taille 24. Les 2 premiers octets seront le préfixe d'identification de la balise alt : \`\*\*0xBE 0xAC\*\*\`. Insérez les 16 octets correspondant à l'UUID des balises que vous souhaitez détecter, typiquement l'UUID de votre organisation. Les octets restants peuvent être laissés à zéro.

Construisez un autre tableau, de taille 24, contenant un octet de l'index 0 à 17 et les octets restants avec des zéros. Cela indique que seuls les 18 premiers octets sont obligatoires et que l'analyseur devrait produire des résultats pour les enregistrements d'analyse qui correspondent uniquement au début des données de notre fabricant.

### Transformer votre Android en balise émettrice (éditeur)

Commencez par instancier un annonceur Bluetooth LE :

```js
mBluetoothLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();
```

Pour construire vos données, utilisez le constructeur de données advertise. De même, créez un tableau d'octets contenant le préfixe AltBeacon, votre UUID, major, minor et tx power. Une fois cela fait, vous avez créé la balise avec succès !

### Récapitulation

Nous avons examiné le signal émis par les balises, les distances de calcul des balises, et comment scanner les balises sur les appareils Android. Avec ces connaissances, vous pouvez créer un nouveau paquet Android BLE en utilisant Android 12.0.

Ensuite, nous allons approfondir la [construction du détecteur de balises](https://www.pubnub.com/blog/tessel-ibeacon-tutorial-building-the-detector-data-beacon-subscriber/). Ensuite, nous vous guiderons dans la [construction de l'émetteur](https://www.pubnub.com/blog/build-android-ibeacon-beacon-emitter/).

Comment PubNub peut-il vous aider ?
===================================

Cet article a été publié à l'origine sur [PubNub.com](https://www.pubnub.com/blog/building-android-beacon-android-ibeacon-tutorial-overview/)

Notre plateforme aide les développeurs à construire, livrer et gérer l'interactivité en temps réel pour les applications web, les applications mobiles et les appareils IoT.

La base de notre plateforme est le réseau de messagerie en temps réel le plus grand et le plus évolutif de l'industrie. Avec plus de 15 points de présence dans le monde, 800 millions d'utilisateurs actifs mensuels et une fiabilité de 99,999 %, vous n'aurez jamais à vous soucier des pannes, des limites de concurrence ou des problèmes de latence causés par les pics de trafic.

Découvrez PubNub
----------------

Découvrez le [Live Tour](https://www.pubnub.com/tour/introduction/) pour comprendre les concepts essentiels de chaque application alimentée par PubNub en moins de 5 minutes.

S'installer
-----------

Créez un [compte PubNub](https://admin.pubnub.com/signup/) pour un accès immédiat et gratuit aux clés PubNub.

Commencer
---------

La [documentation PubNub](https://www.pubnub.com/docs) vous permettra de démarrer, quel que soit votre cas d'utilisation ou votre [SDK](https://www.pubnub.com/docs).