Compartir a través de


Anuncios de Bluetooth LE

En este tema se proporciona información general sobre las balizas de anuncios de Bluetooth de bajo consumo (LE) para aplicaciones de Plataforma universal de Windows (UWP).

Importante

Debe declarar la funcionalidad "bluetooth" en Package.appxmanifest para usar esta característica.

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

API importantes

Características admitidas

Hay dos características principales compatibles con las API de anuncios de LE:

  • Monitor de anuncios: escucha las balizas cercanas y las filtra en función de la carga o la proximidad.
  • Publicador de anuncios: define una carga para que Windows anuncie en nombre de los desarrolladores.

Ejemplo

Para obtener un ejemplo totalmente funcional de anuncios de Bluetooth LE, consulte el ejemplo de anuncio de Bluetooth en Github.

Configuración básica

Para usar la funcionalidad básica de Bluetooth LE en una aplicación de Plataforma universal de Windows, debe comprobar la funcionalidad de Bluetooth en Package.appxmanifest.

  1. Abra Package.appxmanifest.
  2. Vaya a la pestaña Funcionalidades.
  3. Busque Bluetooth en la lista de la izquierda y active la casilla situada al lado.

Publicación de anuncios

Los anuncios de Bluetooth LE permiten que el dispositivo señale constantemente una carga específica, denominada anuncio. Este anuncio puede ser visto por cualquier dispositivo compatible con Bluetooth LE cercano, si está configurado para escuchar este anuncio específico.

Nota:

Para la privacidad del usuario, la duración del anuncio está vinculada a la de la aplicación. Puede crear un BluetoothLEAdvertisementPublisher y llamar a Start en una tarea en segundo plano para el anuncio en segundo plano. Para obtener más información sobre las tareas en segundo plano, consulte Inicio, reanudación y tareas en segundo plano.

Hay muchas maneras diferentes de agregar datos a un anuncio. En este ejemplo se muestra una manera común de crear un anuncio específico de la empresa.

En primer lugar, cree el publicador de anuncios que controla si el dispositivo está señalando o no un anuncio específico.

BluetoothLEAdvertisementPublisher publisher = new BluetoothLEAdvertisementPublisher();

En segundo lugar, cree una sección de datos personalizados. En este ejemplo se usa un valor CompanyId sin asignar 0xFFFE y se agrega el texto Hello World al anuncio.

// 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);

Ahora que el publicador se ha creado y configurado, puede llamar a Start para comenzar a anunciar.

publisher.Start();

Monitorizar anuncios

En el código siguiente se muestra cómo crear un monitor de anuncios de Bluetooth LE, establecer una devolución de llamada y empezar a ver todos los anuncios de 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
}

Examen activo

Para recibir también anuncios de respuesta de examen, establezca lo siguiente después de crear el monitor. Tenga en cuenta que esto provocará un mayor consumo de energía y no está disponible mientras se encuentra en modos de segundo plano.

watcher.ScanningMode = BluetoothLEScanningMode.Active;

Monitorizar un patrón de anuncio específico

A veces querrá escuchar un anuncio específico. En este caso, escuche un anuncio que contenga una carga con una empresa ficticia (identificada como 0xFFFE) y que contenga la cadena Hello World en el anuncio. Esto se puede emparejar con el ejemplo de publicación básica para tener una máquina Windows de anuncios y otra de monitorización. Asegúrese de establecer este filtro de anuncios antes de iniciar el monitor.

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);

Monitorizar un anuncio cercano

A veces solo querrá desencadenar el monitor cuando el dispositivo de anuncios entre dentro del alcance. Puede definir su propio alcance, simplemente tenga en cuenta que los valores se recortarán a entre 0 y -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);

Distancia de medición

Cuando se desencadena la devolución de llamada del Monitor de Bluetooth LE, los eventArgs incluyen un valor RSSI que indica la intensidad de la señal recibida (la intensidad de la señal Bluetooth).

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

Esto se puede traducir aproximadamente a distancia, pero no debe usarse para medir distancias reales, ya que cada radio individual es diferente. Diferentes factores ambientales pueden dificultar la medición de la distancia (como paredes, cajas alrededor de la radio o incluso la humedad del aire).

Una alternativa a juzgar la distancia pura es definir "cubos". Las radios tienden a informar de 0 a -50 DBm cuando están muy cerca, -50 a -90 cuando están a una distancia media y por debajo de -90 cuando están lejos. Los ensayos de prueba y error son el mejor método para determinar lo que quiere que estos cubos signifiquen para la aplicación.