Я пытаюсь зарегистрировать фоновую задачу с помощью 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) Добавьте ссылку на проект WinRT, у которого есть фоновая задача в моем основном проекте приложения (кстати, это проект Silverlight 8.1)
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(). Подробнее об исключении:
- HРезультат: -2147221164
- Сообщение: класс не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
Любая идея, что я делаю неправильно? Я нашел аналогичный вопрос здесь, но на него нет однозначного ответа .