NET中的BLE的GattDeviceServicesResult正确的库或运行时

时间:2018-07-24 17:33:41

标签: .net bluetooth-lowenergy lib

更新 现在,我有理由相信您不能在Enterprise LTSB上使用Windows Creator,因为该版本不够高且无法更新!如果有人可以确认这一点,并说明如果可以使用Creator,那么我应该如何开发蓝牙应用程序,将不胜感激。

“找不到Windows运行时类型'Windows.Devices.Bluetooth.GenericAttributeProfile.GattDeviceServicesResult'”

我在开发人员机器上开发了一些示例代码,以通过C#/。Net中的BLE(蓝牙低功耗)进行通信。当我将此发行版文件夹转移到另一台计算机并运行该程序时,当我尝试启动BLE通信时会收到上述消息。我猜想我缺少一些关键的库/ dll(或.NETCore或.Net Framework),但是呢?我搜索了,找不到答案。

一个可能有用的线索(或可能不相关)是在我的项目中,我在目录C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETCore \ v4中引用了System.Runtime.WindowsRuntime。 5.1 \ System.Runtime.WindowsRuntime.dll 另一台计算机没有v4.5.1,而只有v4.5。但是,当我尝试安装v4.5.1时,会被告知我已经有一个较新的版本!也许有人可以告诉我如何在计算机上获取.netcore v4.5.1?

谢谢, 戴夫

更多信息。。在原始项目中,存在带有路径C:\ Program Files(x86)\ Windows Kits \ 10 \ UnionMetadata \ 10.0.17134.0 \ Windows.winmd的引用“ Windows”。 如果您在此使用对象浏览器,则会看到Windows.Devices.Bluetooth.GenericAttributeProfile.GattDeviceServicesResult 我正试图使我的代码在其上运行的系统上也有相同的文件(相同版本)。不知道为什么它在运行时没有“看到”它。

显然,其他人有此问题。参见:Bluetooth LE GattDeviceServicesResult TypeLoadException from WPF application

更多基于研究的信息 我在生产计算机上安装了Visual Studio,以为可以消除开发人员计算机和生产计算机之间的差异。仍然没有运气。但是,我要指出的是,其余的区别之一是我的开发人员计算机具有Windows 10 Pro。生产机器(平板电脑)具有Windows 10 Enterprise 2016 LTSB

1 个答案:

答案 0 :(得分:0)

似乎Windows 10 Enterprise不支持Windows.Devices.Bluetooth命名空间中的很多方法。我为此找到的解决方案要求Windows 10 Enterprise用户配对其BLE设备。这使我们可以使用过时的BluetoothLEDevice.GattServices属性。我们抓住了TypeLoadException并回到Windows 10 Enterprise支持的方法。

    private async Task<IReadOnlyCollection<GattDeviceService>> GetGattService(BluetoothLEDevice device, Guid uuid)
    {
        try
        {
            // Try to get the services async first
            return await GetGattServicesAsync(device, uuid);
        }
        catch(TypeLoadException e)
        {
            // Not supported in version of windows. Fall back to old way
            return GetGattDeviceServices(device, uuid);
        }
    }

    private async Task<IReadOnlyList<GattDeviceService>> GetGattServicesAsync(BluetoothLEDevice device, Guid uuid)
    {
        var result = await Device.GetGattServicesForUuidAsync(uuid);
        if(result.Status == GattCommunicationStatus.Success)
        {
            return result.Services;
        }
        return null;
    }

    private IReadOnlyList<GattDeviceService> GetGattDeviceServices(BluetoothLEDevice device, Guid uuid)
    {
        var result = device.GattServices.Where(s => s.Uuid == uuid);
        if(result != null)
        {
            return result.ToList().AsReadOnly();
        }
        return null;
    }

在尝试从服务中获取特征时,我们需要做同样的事情。我们不调用GattDeviceService.GetCharacteristicsForUuidAsync,而是调用GattDeviceService.GetAllCharacteristics()。我还发现某些PC不支持任何BluetoothLEDevice.GetDeviceSelector()方法的情况,这在创建观察程序时引起了问题。必须配对设备有点不便。不幸的是,我无法找到任何有关此文件的文档。除了几个here视频之外,他们讨论不再需要配对BLE设备,这使我相信LTSB不支持它。