Partilhar via


Anúncios Bluetooth LE

Este tópico fornece uma visão geral dos beacons de anúncio Bluetooth Low Energy (LE) para aplicativos da Plataforma Universal do Windows (UWP).

Importante

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

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

APIs importantes

Recursos com suporte

Há dois recursos principais suportados pelas APIs de anúncios LE:

Exemplo

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

Configuração básica

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

  1. Abra Package.appxmanifest
  2. Vá para a guia Recursos
  3. Encontre Bluetooth na lista à esquerda e marque a caixa ao lado dele.

Publicar anúncios

Os anúncios Bluetooth LE permitem que seu dispositivo sinalize constantemente uma carga útil específica, chamada de anúncio. Este anúncio pode ser visto por qualquer dispositivo compatível com Bluetooth LE próximo, se eles estiverem configurados para ouvir este anúncio específico.

Observação

Para a privacidade do usuário, a vida útil do seu anúncio está vinculada à do seu aplicativo. Você pode criar um BluetoothLEAdvertisementPublisher e chamar Iniciar em uma tarefa em segundo plano para 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 sinalizando 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 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 editor foi criado e configurado, você pode chamar Iniciar para começar a anunciar.

publisher.Start();

Acompanhar anúncios

O código a seguir demonstra como criar um observador de anúncios Bluetooth LE, definir um retorno de chamada e começar a acompanhar 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
}

Verificação ativa

Para receber anúncios de resposta de varredura também, defina o seguinte depois de criar o observador. Observe que isso causará maior consumo de energia e não estará disponível nos modos em segundo plano.

watcher.ScanningMode = BluetoothLEScanningMode.Active;

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

Às vezes, você quer ouvir um anúncio específico. Nesse caso, ouça um anúncio contendo uma carga útil com uma empresa inventada (identificada como 0xFFFE) e contendo a cadeia de caracteres Hello World no anúncio. Isso pode ser emparelhado com o exemplo de publicação básica para ter uma máquina Windows anunciando e outra observando. 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);

Observar um anúncio próximo

Às vezes, você só quer acionar seu observador quando a publicidade do dispositivo estiver ao alcance. Você pode definir seu próprio intervalo, basta observar que os valores serão cortados para 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 aferição

Quando o retorno de chamada do Observador Bluetooth LE é acionado, o eventArgs inclui um valor RSSI informando 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 basicamente 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 aferição da distância (como paredes, estojos ao redor do rádio ou até mesmo umidade do ar).

Uma alternativa para julgar a distância pura é definir "buckets". Os rádios tendem a relatar 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. Tentativa e erro é melhor para determinar o que você deseja que esses buckets sejam para seu aplicativo.