蓝牙 LE 广告

本主题概述了适用于Windows应用的蓝牙低能(LE)广告信标。

Important

必须在 Package.appxmanifest 中声明“蓝牙”功能才能使用此功能。

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

支持的功能

LE 广告 API 支持两个主要功能:

基本设置

若要在 通用 Windows 平台 应用中使用基本蓝牙 LE 功能,必须在 Package.appxmanifest 中检查蓝牙功能。

  1. 打开 Package.appxmanifest
  2. 转到“功能”选项卡
  3. 在左侧列表中查找蓝牙,并选中其旁边的框。

发布广告

蓝牙 LE 广告允许设备不断标出特定的有效负载,称为广告。 如果已设置为侦听此特定广告,则任何支持蓝牙 LE 的设备都可以看到此广告。

注释

对于用户隐私,广告的寿命与你的应用相关。 可以创建 BluetoothLEAdvertisementPublisher,并在后台任务中调用 Start,以便在后台进行广播。 有关后台任务的详细信息,请参阅 启动、恢复和后台任务

可通过多种不同的方式将数据添加到广告。 此示例演示了创建公司特定广告的常见方法。

首先,创建广告发布者,用于控制设备是否正在标出特定广告。

BluetoothLEAdvertisementPublisher publisher = new BluetoothLEAdvertisementPublisher();

其次,创建自定义数据部分。 此示例使用未分配CompanyId0xFFFE并将文本Hello World添加到广告中。

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

创建并设置发布者后,可以调用 “开始” 开始播发。

publisher.Start();

留意广告

以下代码演示如何创建蓝牙 LE 广告观察程序、设置回调并开始监视所有 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
}

主动扫描

若要同时接收扫描响应播发包,请在创建监视器后进行以下设置。 请注意,这会导致更高的耗电量,并且在后台模式下无法使用。

watcher.ScanningMode = BluetoothLEScanningMode.Active;

留意特定广告模式

有时,你可能想留意某个特定的广告。 在这种情况下,请侦听包含虚构公司标识符(标识为 0xFFFE)负载的广播包,并且该广播包中包含字符串 Hello World。 这可以与 Basic Publishing 示例配合使用,让一台 Windows 计算机进行广播,另一台进行监听。 在启动观察程序之前,请务必设置此广告筛选器!

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

留意附近的广告

有时,仅当设备广告已传入范围时,才需要触发观察程序。 可以定义自己的范围,只需注意值将剪切到 0 到 -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);

仪表距离

当 Bluetooth LE Watcher 的回调被触发时,eventArgs 中会包含一个 RSSI 值,用于指示接收信号强度(即蓝牙信号的强弱)。

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

这可以大致转换为距离,但不应用于测量真实距离,因为每个无线电是不同的。 不同的环境因素可能会使距离难以测量(如墙壁、无线电周围的事例,甚至空气湿度)。

判断纯距离的替代方法是定义“存储桶”。 无线设备在距离非常近时通常会显示 0 到 -50 dBm,距离适中时显示 -50 到 -90 dBm,而距离较远时则显示低于 -90 dBm。 要确定这些存储桶在你的应用中应如何设置,最好的办法是通过反复试验。

Example

有关蓝牙 LE 广告的完全功能示例,请参阅 Github 上的 Bluetooth 广告示例