バックグラウンド タスクをGattCharacteristicNotifictionTriggerに登録して BLE デバイスからデータを受信しようとしていますが、何をしても、.Register()行に到達するとアプリは常に例外をスローします。私はMSDNやその他の場所で多数のガイドを参照してきましたが、必要なことはすべて実行していると思います。以下は、必要なものを強調したチェックリストです。バックグラウンドタスクに関する限り、私はそれ以上何もしていません。
1) Package.appxmanifest でバックグラウンド タスクの宣言を次のように設定します。
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="AgHost.BackgroundTask">
<BackgroundTasks>
<Task Type="systemEvent" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundBLEService.MyBLEService">
<BackgroundTasks>
<m3:Task Type="gattCharacteristicNotification" />
</BackgroundTasks>
</Extension>
</Extensions>
2)メインアプリプロジェクト(ところでSilverlight 8.1プロジェクト)にバックグラウンドタスクを持つWinRTプロジェクトへの参照を追加します
3) 次のように、バックグラウンド サービス クラス (シールされたパブリック クラス) 内に Run() 関数を作成します。
public sealed class MyBLEService: IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
try
{
GattCharacteristicNotificationTriggerDetails details = (GattCharacteristicNotificationTriggerDetails)taskInstance.TriggerDetails;
byte[] ReceivedData = new byte[details.Value.Length];
DataReader.FromBuffer(details.Value).ReadBytes(ReceivedData);
foreach(byte b in ReceivedData)
{
Debug.WriteLine(b.ToString());
XmlDocument xml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText01);
xml.SelectSingleNode("/toast/visual/binding/text").InnerText = string.Format("Value Received: " + b.ToString());
ToastNotification toast = new ToastNotification(xml);
ToastNotifier notifier = ToastNotificationManager.CreateToastNotifier();
notifier.Show(toast);
}
}
finally
{
Debug.WriteLine("Background service exception");
}
}
}
4) メイン アプリ内から次のようにイベントを登録します。
GattCharacteristicNotificationTrigger trigger = new GattCharacteristicNotificationTrigger(thermometerCharacteristic); //thermometerCharacteristic is defined in another block of code
await BackgroundExecutionManager.RequestAccessAsync();
BackgroundTaskBuilder BLETaskBuilder = new BackgroundTaskBuilder();
BLETaskBuilder.Name = "DataReceiveNotifier";
BLETaskBuilder.TaskEntryPoint = "BackgroundBLEService.MyBLEService";
BLETaskBuilder.SetTrigger(trigger);
App.MyBackgroundTask = BLETaskBuilder.Register();
5) バックグラウンド タスクのエントリ ポイントの文字列シーケンスが、バックグラウンド プロジェクトの namespace.classname のスペルと正確に一致していることを確認します。Package.appxmanifest と、タスクを登録しようとしているメイン プロジェクトの両方で、スペルを確認して再確認しました。
しかし、コードが.Register()行に到達すると、最初の例外が発生します。例外の詳細:
- HResult: -2147221164
- メッセージ: クラスが登録されていません (HRESULT からの例外: 0x80040154 (REGDB_E_CLASSNOTREG))
私が間違っていることは何か分かりますか?ここで同様の質問を見つけましたが、確実に回答されているわけではありません。