Anúncios Bluetooth LE

Este tópico fornece uma visão geral dos sinalizadores de anúncio de LE (Bluetooth Low Energy) para aplicativos Windows.

Importante

Você deve declarar a funcionalidade "bluetooth" em Package.appxmanifest para usar esse recurso.

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

Recursos com suporte

Há dois recursos principais suportados pelas APIs de publicidade LE:

Configuração básica

Para usar a funcionalidade básica do Bluetooth LE em um aplicativo Plataforma Universal do Windows, você deve verificar a funcionalidade bluetooth no Package.appxmanifest.

  1. Abrir Package.appxmanifest
  2. Vá para a guia Recursos
  3. Localize Bluetooth na lista à esquerda e marque a caixa ao lado dela.

Publicação de anúncios

Os anúncios de LE Bluetooth permitem que seu dispositivo exiba constantemente um conteúdo específico, chamado de anúncio. Esse anúncio poderá ser visto por qualquer dispositivo compatível com Bluetooth LE próximo, se eles estiverem configurados para escutar esse anúncio específico.

Note

Para privacidade do usuário, o tempo de vida do anúncio está vinculado ao do seu aplicativo. Você pode criar um BluetoothLEAdvertisementPublisher e chamar Start em uma tarefa em segundo plano para publicação de anúncio em segundo plano. Para obter mais informações sobre tarefas em segundo plano, consulte Iniciar, retomar e tarefas em segundo plano.

Há muitas maneiras diferentes de adicionar dados a um Anúncio. Este exemplo mostra uma maneira comum de criar um anúncio específico da empresa.

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

BluetoothLEAdvertisementPublisher publisher = new BluetoothLEAdvertisementPublisher();

Em segundo lugar, crie uma seção de dados personalizada. Este exemplo usa um valor CompanyId não atribuído 0xFFFE e adiciona o texto Olá, Mundo 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, você pode chamar Start para iniciar a publicação.

publisher.Start();

Fique atento a anúncios

O código a seguir demonstra como criar um monitor de anúncios Bluetooth LE, definir uma função de retorno de chamada e iniciar o monitoramento de todos os anúncios Bluetooth 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 anúncios de resposta de verificação também, defina o seguinte depois de criar o observador. Observe que isso causará maior dreno de energia e não está disponível nos modos em segundo plano.

watcher.ScanningMode = BluetoothLEScanningMode.Active;

Observe um padrão específico de anúncio

Às vezes, você deseja ouvir um anúncio específico. Nesse caso, aguarde um anúncio que contenha uma carga útil com uma empresa fictícia (identificada como 0xFFFE) e a sequência de caracteres Olá, Mundo no anúncio. Isso pode ser combinado com o exemplo de Publicação Básica para que uma máquina Windows faça o anúncio e outra fique monitorando. Certifique-se de definir esse filtro de anúncio antes de iniciar 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 nas proximidades

Às vezes, você só deseja disparar o observador quando a publicidade do dispositivo estiver no intervalo. Você pode definir seu próprio intervalo, basta observar que os valores serão recortados 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 do medidor

Quando o callback do Bluetooth LE Watcher é acionado, o eventArgs inclui um valor de RSSI que informa 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;
}

Isso pode ser traduzido aproximadamente em distância, mas não deve ser usado para medir distâncias verdadeiras, pois cada rádio individual é diferente. Diferentes fatores ambientais podem dificultar a medição da distância (como paredes, casos ao redor do rádio ou até mesmo umidade do ar).

Uma alternativa a avaliar apenas a distância é definir "faixas". Os rádios tendem a indicar de 0 a -50 dBm quando estão muito próximos, de -50 a -90 dBm quando estão a uma distância intermediária e abaixo de -90 dBm quando estão longe. Tentativa e erro é a melhor forma de determinar como você quer definir esses buckets para o seu aplicativo.

Exemplo

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