.NET Framework 4.7.2 C# BLE项目GetGattServicesAsync跨设备运行失败求助
问题排查方向
你遇到的仅开发机可正常运行、其他机器卡在GattDeviceServicesResult result = await bluetoothLeDevice.GetGattServicesAsync();的问题,可按照以下优先级排查:
- 第一步:先补全错误日志定位根因
现有代码未判断该接口的返回状态,先添加日志打印result.Status的值以及bluetoothLeDevice是否为null:
根据返回的状态可以直接缩小问题范围。BluetoothLEDevice bluetoothLeDevice = await BluetoothLEDevice.FromIdAsync(device.Id); if(bluetoothLeDevice == null) { Console.WriteLine("获取BLE设备对象失败,请检查设备是否可用"); return; } GattDeviceServicesResult result = await bluetoothLeDevice.GetGattServicesAsync(); Console.WriteLine("GetGattServicesAsync状态:" + result.Status); if(result.Status == GattCommunicationStatus.AccessDenied) { Console.WriteLine("蓝牙权限不足"); } else if(result.Status == GattCommunicationStatus.ProtocolError) { Console.WriteLine("蓝牙协议错误,错误码:" + result.ProtocolError); } else if(result.Status == GattCommunicationStatus.Unreachable) { Console.WriteLine("设备不可达,连接已断开"); } - 第二步:检查目标机器的蓝牙权限
Win10 1809及以上版本默认禁用桌面应用的蓝牙访问权限,开发机可能之前调试时手动开通过,其他机器需要手动开启:
打开「设置→隐私和安全性→蓝牙」,打开「允许桌面应用访问蓝牙」开关即可。 - 第三步:检查蓝牙适配器驱动与兼容性
很多PC/笔记本的自带通用蓝牙驱动对BLE GATT服务访问的支持有缺陷,可操作:- 确认目标机器的蓝牙适配器支持BLE 4.0及以上版本
- 卸载当前通用蓝牙驱动,前往笔记本/适配器厂商官网下载对应型号的官方最新驱动安装
- 第四步:处理配对与缓存问题
- 部分Windows蓝牙栈要求BLE设备必须先和系统配对才能访问GATT服务,开发机可能之前已经配对过目标Arduino设备,其他机器可先手动在系统蓝牙设置里搜索配对设备后再运行程序
- 将
GetGattServicesAsync的缓存模式改为强制从设备读取,避免本地无缓存导致的调用失败:
GattDeviceServicesResult result = await bluetoothLeDevice.GetGattServicesAsync(BluetoothCacheMode.Uncached); - 第五步:确认系统版本一致性
所有测试机器需要保证Windows版本不低于开发机的版本,最低要求Windows 10 1709版本,低于该版本的Windows对UWP蓝牙API的兼容存在大量已知bug。
内容的提问来源于stack exchange,提问作者Yamen Hussien
相关产品推荐
相关产品推荐

