Anúncios Bluetooth LE

Este tópico apresenta uma visão geral dos beacons publicitários Bluetooth Low Energy (LE) para aplicações Windows.

Importante

Deve declarar a funcionalidade "bluetooth" no Package.appxmanifest para usar esta funcionalidade.

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

Funcionalidades suportadas

Existem duas funcionalidades principais suportadas pelas APIs de Publicidade LE:

Configuração básica

Para usar a funcionalidade básica Bluetooth LE numa aplicação Plataforma Universal do Windows, deve verificar a funcionalidade Bluetooth no Package.appxmanifest.

  1. Open Package.appxmanifest
  2. Vá ao separador Capacidades
  3. Encontra Bluetooth na lista à esquerda e marca a caixa ao lado.

Publicação de Anúncios

Os anúncios Bluetooth LE permitem que o seu dispositivo transmita continuamente uma carga útil específica, designada por anúncio. Este anúncio pode ser visto por qualquer dispositivo Bluetooth LE nas proximidades, se estiverem configurados para ouvir este anúncio específico.

Note

Para a privacidade dos utilizadores, a vida útil do seu anúncio está ligada à da sua aplicação. Pode criar um BluetoothLEAdvertisementPublisher e chamar o método Start numa tarefa em segundo plano para efetuar anúncios em segundo plano. Para mais informações sobre tarefas em segundo plano, consulte Lançar, retomar e tarefas em segundo plano.

Existem muitas formas diferentes de adicionar dados a um anúncio. Este exemplo mostra uma forma comum de criar um anúncio específico para uma empresa.

Primeiro, crie o editor de anúncios que controla se o dispositivo está ou não a emitir um anúncio específico.

BluetoothLEAdvertisementPublisher publisher = new BluetoothLEAdvertisementPublisher();

Em segundo lugar, crie uma secção de dados personalizada. Este exemplo utiliza um valor CompanyId não atribuído 0xFFFE e adiciona o texto Hello World ao anúncio.

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

Agora que o publicador foi criado e configurado, pode chamar Start para iniciar a divulgação.

publisher.Start();

Fique atento aos anúncios

O código seguinte demonstra como criar um observador de anúncios Bluetooth LE, definir um callback e começar a ver todos os anúncios 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
}

Varredura ativa

Para receber também anúncios de resposta ao escanear, defina o seguinte após criar o observador. Note que isto causará maior consumo de energia e não está disponível em modo de fundo.

watcher.ScanningMode = BluetoothLEScanningMode.Active;

Fique atento a um padrão publicitário específico

Por vezes, queremos ouvir um anúncio específico. Neste caso, detete um anúncio que contenha uma carga útil com uma empresa fictícia (identificada como 0xFFFE) e a sequência Hello World no anúncio. Isto pode ser combinado com o exemplo de Publicação Básica para que uma máquina Windows anuncie e outra assista. Certifica-te de que defines este filtro de anúncios antes de iniciares o observador!

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

Fique atento a um anúncio próximo

Por vezes, só se quer ativar o seu observador quando a publicidade do dispositivo estiver dentro do alcance. Podes definir o teu próprio intervalo, só tens de notar que os valores serão reduzidos entre 0 e -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);

Distância de bitola

Quando o callback do seu Watcher Bluetooth LE é ativado, os eventArgs incluem um valor RSSI que indica a intensidade do sinal recebido (quão forte é o sinal Bluetooth).

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

Isto pode ser traduzido aproximadamente em distância, mas não deve ser usado para medir distâncias reais, pois cada rádio individual é diferente. Diferentes fatores ambientais podem dificultar a avaliação da distância (como paredes, caixas à volta do rádio ou até a humidade do ar).

Uma alternativa a avaliar a distância absoluta é definir "intervalos". Os rádios tendem a reportar 0 a -50 DBm quando estão muito próximos, -50 a -90 quando estão a uma distância média, e abaixo de -90 quando estão longe. A melhor forma de determinar como pretendes definir estes buckets para a tua aplicação é através de tentativa e erro.

Exemplo

Para um exemplo totalmente funcional de anúncios de Bluetooth LE, consulte, no GitHub, o Exemplo de anúncios de Bluetooth.