estimote ビーコンによってブロードキャストされた eddystone 広告をシステムが検出したときに実行されるバックグラウンド タスクを作成しようとしています。
eddystone パケットを送信するようにビーコンを既に構成しておりUniversalBeaconLibrary
、アプリケーションがフォアグラウンドにあるときにこれらのパケットを取得していました (ここでは問題ありません)。
ここで、アプリケーションが起動されていないときに通知を取得したいと考えています (Bluetooth ブロードキャスト パケットに反応するバックグラウンド タスクを使用)。私の理解では、バッテリー/CPU に負担をかけないようにするために、これらの広告をフィルタリングする必要があります。
フィルタリングの最も単純な形式 (私が使用しようとしたもの) の 1 つは、Bluetooth SIG によって提供された会社 ID を使用することです。
これが私が試したものです:
public static async void Register()
{
if (BackgroundTaskRegistration.AllTasks.Count == 0)
{
var trigger = MakeTrigger();
// this is needed for Phone, not so for Windows in this case.
var allowed = await BackgroundExecutionManager.RequestAccessAsync();
if ((allowed != BackgroundAccessStatus.Denied) &&
(allowed != BackgroundAccessStatus.Unspecified))
{
BackgroundTaskBuilder builder = new BackgroundTaskBuilder
{
Name = "BLEWatcher",
TaskEntryPoint = typeof(BLEBackgroundConsumer.Consumer).FullName
};
builder.SetTrigger(trigger);
builder.Register();
}
}
}
private static BluetoothLEAdvertisementWatcherTrigger MakeTrigger()
{
var trigger = new BluetoothLEAdvertisementWatcherTrigger();
//Can add some filters here
//trigger.AdvertisementFilter.Advertisement.ManufacturerData.Add(new BluetoothLEManufacturerData()
//{
// CompanyId = 349 //Estimote
//});
//trigger.AdvertisementFilter.Advertisement.ManufacturerData.Add(new BluetoothLEManufacturerData()
//{
// CompanyId = 76 // Apple
//});
//trigger.AdvertisementFilter.Advertisement.ManufacturerData.Add(new BluetoothLEManufacturerData()
//{
// CompanyId = 224 // Google
//});
return (trigger);
}
そのままでは、フィルタリングが不十分または多すぎるという例外が発生します。
トリガー ブロックの 1 つをコメント解除すると、例外は発生しませんでしたが、タスクが起動していないようです。
**EDIT : ** eddystone パケットを使用しているときに彼らがブロードキャストしていた Company Id を estimote に尋ねました。そして彼らによると、何もありません。
この回答に関して、適切なフィルターは何でしょうか?