Partager via


Annonces Bluetooth LE

Cette rubrique présente une vue d’ensemble des balises publicitaires Bluetooth Low Energy (LE) pour les applications de la plateforme universelle Windows (UWP).

Important

Vous devez déclarer la capacité " bluetooth " dans Package.appxmanifest pour utiliser cette fonctionnalité.

<Capabilities> <DeviceCapability Name="bluetooth" /> </Capabilities>

API importantes

Fonctionnalités prises en charge

Il existe deux fonctionnalités principales prises en charge par les API de publicité LE :

  • Advertisement Watcher : écoutez les balises à proximité et filtrez-les en fonction de la charge utile ou de la proximité.
  • Advertisement Publisher : définir une charge utile pour que Windows fasse de la publicité pour le compte d’un développeur.

Exemple

Pour un exemple entièrement fonctionnel des annonces Bluetooth LE, consultez l’exemple d’annonce Bluetooth sur Github.

Configuration de base

Pour utiliser la fonctionnalité de base de Bluetooth LE dans une application Universal Windows Platform, vous devez vérifier la capacité Bluetooth dans le fichier Package.appxmanifest.

  1. Ouvrez Package.appxmanifest
  2. Allez dans l’onglet Capabilities
  3. Trouvez Bluetooth dans la liste de gauche et cochez la case à côté.

Publication d’annonces

Les annonces Bluetooth LE permettent à votre appareil d’émettre en permanence une charge utile spécifique, appelée annonce. Cette annonce peut être vue par tout appareil Bluetooth LE proche, s’il est configuré pour écouter cette annonce spécifique.

Remarque

Pour préserver la vie privée de l’utilisateur, la durée de vie de votre publicité est liée à celle de votre application. Vous pouvez créer un BluetoothLEAdvertisementPublisher et appeler Start dans une tâche d’arrière-plan pour une publicité en arrière-plan. Pour plus d’informations sur les tâches d’arrière-plan, voir Lancement, reprise et tâches d’arrière-plan.

Il existe de nombreuses façons d’ajouter des données à une annonce. Cet exemple montre une façon courante de créer une publicité spécifique à une entreprise.

Tout d’abord, créez l’éditeur de publicité qui contrôle si l’appareil émet ou non une publicité spécifique.

BluetoothLEAdvertisementPublisher publisher = new BluetoothLEAdvertisementPublisher();

Ensuite, créez une section de données personnalisées. Cet exemple utilise une valeur CompanyId désaffectée de 0xFFFE et ajoute le texte Hello World à la publicité.

// Add custom data to the advertisement
var manufacturerData = new BluetoothLEManufacturerData();
manufacturerData.CompanyId = 0xFFFE;

var writer = new DataWriter();
writer.WriteString("Hello World");

// Make sure that the buffer length can fit within an advertisement payload (~20 bytes). 
// Otherwise you will get an exception.
manufacturerData.Data = writer.DetachBuffer();

// Add the manufacturer data to the advertisement publisher:
publisher.Advertisement.ManufacturerData.Add(manufacturerData);

Maintenant que l’éditeur a été créé et configuré, vous pouvez appeler Start pour commencer la publicité.

publisher.Start();

Surveillance des publicités

Le code suivant montre comment créer un observateur d’annonces Bluetooth LE, définir un rappel et commencer à surveiller toutes les annonces LE.

BluetoothLEAdvertisementWatcher watcher = new BluetoothLEAdvertisementWatcher();
watcher.Received += OnAdvertisementReceived;
watcher.Start();
private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
{
    // Do whatever you want with the advertisement
}

Analyse active

Pour recevoir également des annonces de réponse d’analyse, définissez ce qui suit après avoir créé l’observateur. Notez que cette fonction entraîne une plus grande consommation d’énergie et qu’elle n’est pas disponible dans les modes d’arrière-plan.

watcher.ScanningMode = BluetoothLEScanningMode.Active;

Surveillance d’un modèle d’annonce spécifique

Il arrive que vous souhaitiez écouter une publicité spécifique. Dans ce cas, écoutez une publicité contenant une charge utile avec une société inventée (identifiée comme 0xFFFE) et contenant la chaîne Hello World dans la publicité. Cet exemple peut être apparié à l’exemple de la publication de base pour qu’une machine Windows fasse de la publicité et une autre de l’observation. Veillez à définir ce filtre publicitaire avant de lancer l’observateur !

var manufacturerData = new BluetoothLEManufacturerData();
manufacturerData.CompanyId = 0xFFFE;

// Make sure that the buffer length can fit within an advertisement payload (~20 bytes). 
// Otherwise you will get an exception.
var writer = new DataWriter();
writer.WriteString("Hello World");
manufacturerData.Data = writer.DetachBuffer();

watcher.AdvertisementFilter.Advertisement.ManufacturerData.Add(manufacturerData);

Observation d’une publicité proche

Parfois, vous ne souhaitez déclencher votre observateur que lorsque l’appareil qui fait de la publicité se trouve à proximité. Vous pouvez définir votre propre plage, mais notez que les valeurs seront coupées entre 0 et -128.

// Set the in-range threshold to -70dBm. This means advertisements with RSSI >= -70dBm 
// will start to be considered "in-range" (callbacks will start in this range).
watcher.SignalStrengthFilter.InRangeThresholdInDBm = -70;

// Set the out-of-range threshold to -75dBm (give some buffer). Used in conjunction 
// with OutOfRangeTimeout to determine when an advertisement is no longer 
// considered "in-range".
watcher.SignalStrengthFilter.OutOfRangeThresholdInDBm = -75;

// Set the out-of-range timeout to be 2 seconds. Used in conjunction with 
// OutOfRangeThresholdInDBm to determine when an advertisement is no longer 
// considered "in-range"
watcher.SignalStrengthFilter.OutOfRangeTimeout = TimeSpan.FromMilliseconds(2000);

Mesurer la distance

Lorsque le rappel de votre observateur Bluetooth LE est déclenché, les eventArgs incluent une valeur RSSI qui vous indique la force du signal reçu (la force du signal Bluetooth).

private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
{
   // The received signal strength indicator (RSSI)
   Int16 rssi = eventArgs.RawSignalStrengthInDBm;
}

Cette valeur peut être grossièrement traduite en distance, mais ne doit pas être utilisée pour mesurer les distances réelles, car chaque radio est différente. Différents facteurs environnementaux peuvent rendre la distance difficile à évaluer (tels que les murs, les boîtiers autour de la radio ou même l’humidité de l’air).

Une alternative à l’évaluation de la distance pure consiste à définir des "tranches". Les radios ont tendance à signaler de 0 à -50 DBm lorsqu’elles sont très proches, de -50 à -90 lorsqu’elles sont à une distance moyenne, et moins de -90 lorsqu’elles sont éloignées. Il est préférable de procéder par essais et erreurs pour déterminer la valeur de ces seuils pour votre application.