本主题概述了适用于Windows应用的蓝牙低能(LE)广告信标。
Important
必须在 Package.appxmanifest 中声明“蓝牙”功能才能使用此功能。
<Capabilities> <DeviceCapability Name="bluetooth" /> </Capabilities>
支持的功能
LE 广告 API 支持两个主要功能:
- 广告观察程序:侦听附近的信标,并根据有效负载或邻近度筛选出它们。
- Advertisement Publisher:定义一个有效负载,供 Windows 代表开发人员发布广告。
基本设置
若要在 通用 Windows 平台 应用中使用基本蓝牙 LE 功能,必须在 Package.appxmanifest 中检查蓝牙功能。
- 打开 Package.appxmanifest
- 转到“功能”选项卡
- 在左侧列表中查找蓝牙,并选中其旁边的框。
发布广告
蓝牙 LE 广告允许设备不断标出特定的有效负载,称为广告。 如果已设置为侦听此特定广告,则任何支持蓝牙 LE 的设备都可以看到此广告。
注释
对于用户隐私,广告的寿命与你的应用相关。 可以创建 BluetoothLEAdvertisementPublisher,并在后台任务中调用 Start,以便在后台进行广播。 有关后台任务的详细信息,请参阅 启动、恢复和后台任务。
可通过多种不同的方式将数据添加到广告。 此示例演示了创建公司特定广告的常见方法。
首先,创建广告发布者,用于控制设备是否正在标出特定广告。
BluetoothLEAdvertisementPublisher publisher = new BluetoothLEAdvertisementPublisher();
其次,创建自定义数据部分。 此示例使用未分配CompanyId值0xFFFE并将文本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 广告示例。