inTheHand BluetoothClient.DiscoverDevices()报空引用异常求助
问题背景
使用inTheHand.Net.Bluetooth库开发蓝牙通信程序,目标实现安卓手表与Windows设备的数据交互,同套代码在PC间经典蓝牙通信场景下运行正常,执行设备扫描逻辑时持续抛出空引用异常。
异常详情
- 异常类型:
System.NullReferenceException - 异常描述:
Object reference not set to an instance of an object.
- 触发位置代码:
BluetoothClient client = new BluetoothClient(); foreach (var item in client.DiscoverDevices()) { // 业务处理逻辑 }
排查修复方案
- 版本适配校验
最新版inTheHand.Net.Bluetooth默认优先调用Windows系统BLE蓝牙栈,老旧版本仅适配经典蓝牙Win32栈,枚举安卓手表这类同时支持经典蓝牙+BLE的穿戴设备时,会因为BLE广播句柄初始化失败触发空引用。卸载当前项目引用的NuGet包,安装4.0.32及以上正式稳定版本,不要使用预览版包。 - 替换扫描方法重载
无参DiscoverDevices()方法默认仅扫描经典蓝牙设备,不会主动枚举BLE设备,遍历混合类型设备时会因为属性字段缺失触发空引用,替换为带全参数的重载方法,显式声明扫描规则:// 参数依次为:扫描时长(单位秒)、返回已配对设备、返回未识别设备、包含BLE设备 var scannedDevices = client.DiscoverDevices(8, true, true, true); - 前置校验本地蓝牙适配器状态
实例化BluetoothClient后不要直接触发扫描,先获取本地默认蓝牙适配器实例,确认适配器正常可用后再执行扫描,避免适配器实例为空触发异常:BluetoothClient client = new BluetoothClient(); BluetoothRadio localRadio = BluetoothRadio.Default; if (localRadio == null) { throw new Exception("当前设备未检测到可用蓝牙适配器"); } if (localRadio.Mode == RadioMode.PowerOff) { throw new Exception("本地蓝牙处于关闭状态,请开启后重试"); } // 适配器校验通过后再执行设备扫描 - 权限配置检查
Windows平台扫描蓝牙设备需要对应权限:传统桌面程序需要右键以管理员身份运行;打包型桌面应用(MSIX/UWP/WinUI)需要在应用清单中勾选蓝牙、蓝牙通用属性配置文件权限,否则系统不会向应用返回BLE设备列表,库内部遍历空设备集合时会触发空引用。 - 穿戴设备兼容处理
安卓手表默认开启BLE隐私模式,未配对状态下广播的MAC地址为随机值,设备名称、服务列表等字段可能为空。先在Windows系统蓝牙设置页手动完成和手表的配对,再运行程序执行扫描,避免库读取空设备属性触发异常。
内容的提问来源于stack exchange,提问作者universe123
相关产品推荐
相关产品推荐

