0

バックグラウンド タスクを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))

私が間違っていることは何か分かりますか?ここで同様の質問を見つけましたが、確実に回答されているわけではありません。

4

3 に答える 3