Tal vez alguien pueda ayudarme porque tengo una situación realmente complicada con Bluetooth LE usando WinRT en Windows 10 (como se supone aquí: Bluetooth Low Energy en .Net (C#) ).
Necesito BLE dentro de una aplicación de escritorio clásica Win32. Nuestro código se ejecuta en una aplicación de marco de 32 bits utilizando el tiempo de ejecución de .NET (v4.0.30319, .NET Framework 4.6.2). Pude manejar todos los demás problemas (nombrar con fuerza algunos ensamblajes de NuGet (Shiny.BluetoothLE), ejecutar BluetoothAdapter.GetRadioAsync()
en una DLL sustituta COM de 64 bits cuando se ejecuta en Windows de 64 bits), pero ahora estoy totalmente atascado con esto y aquí es donde:
El problema ocurre al ejecutar var result = await gattDeviceService.GetCharacteristicsForUuidAsync(uuid, BluetoothCacheMode.Cached);
consulte aquí https://docs.microsoft.com/de-de/uwp/api/windows.devices.bluetooth.genericattributeprofile.gattdeviceservice.getcharacteristicsforuuidasync?view=winrt-20348 . Al obtener las características de lectura, result.Status
es GattCommunicationStatus.Success
y el resultado contiene la característica deseada. Pero, por supuesto, también necesito obtener la característica de escritura y SIEMPRE GattCommunicationStatus.AccessDenied
. Por eso, el resultado NO contiene ninguna característica.
¿Alguien tiene idea de por qué es eso? Realmente necesito ayuda aquí porque estoy un poco perdido en este momento...
También traté de configurar AccessPermission
a través del registro como se supone aquí, pero no tuve suerte...
PD: uso Windows 10 SDK Kit Build 20348 y, como se indicó anteriormente, es un proyecto C# .NET Framework 4.6.2 y todos nuestros ensamblajes tienen un nombre seguro debido al uso de GAC. Si me falta algo no dude en ponerse en contacto conmigo.
Para cualquiera que tropiece con el mismo problema estúpido... Esta es la solución:
En Windows, usando .NET Framework 4.6.1+ y las bibliotecas WinRT dentro de una aplicación que no es UWP, solo puede llamar UNA VEZ para obtener las características, sin importar si llama para todas a la vez a través gattDeviceService.GetCharacteristicsAsync(BluetoothCacheMode.Uncached)
o para uno específico a través gattDeviceService.GetCharacteristicsForUuidAsync(uuid, BluetoothCacheMode.Cached)
.
Cualquier llamada posterior fallará con GattCommunicationStatus.AccessDenied
... Así que mi solución ahora es recuperar todas las características a la vez y filtrarlas localmente.
¡Eso funcionó! De todos modos, esto es tan estúpido... ¡Me hizo perder mucho tiempo ahora! Como parece, tampoco necesito establecer ningún AccessPermission
de acceso a través del registro.
PD: Te llamaré, si me tropiezo con otra situación difícil, solo para avisarte.