UWP开发:如何通过BLE扫描读取Minew S1未公开服务数据?
读取Minew S1 BLE设备扫描数据的实现方案
我之前也碰到过BLE设备文档缺失关键细节的情况,针对你在UWP项目里的需求,整理了一套可行的步骤:
1. 配置UWP蓝牙权限
首先得确保你的应用拥有蓝牙访问权限,在Package.appxmanifest里添加以下配置:
<Capabilities> <DeviceCapability Name="bluetooth"/> <!-- Windows 10 1903及以上建议添加,适配低功耗蓝牙特性 --> <DeviceCapability Name="bluetooth.le"/> </Capabilities>
同时要在Windows系统设置里允许你的应用访问蓝牙,不然扫描会直接失败。
2. 定向扫描目标设备
既然你发现设备会响应0000ffe1-0000-1000-8000-00805f9b34fb这个服务UUID(补全了标准BLE UUID后缀),可以用这个来过滤扫描结果,避免无关设备干扰:
using Windows.Devices.Bluetooth.Advertisement; // 初始化低功耗蓝牙扫描器 var bleWatcher = new BluetoothLEAdvertisementWatcher(); // 添加目标服务UUID作为过滤条件 var targetServiceUuid = new Guid("0000ffe1-0000-1000-8000-00805f9b34fb"); bleWatcher.AdvertisementFilter.Advertisement.ServiceUuids.Add(targetServiceUuid);
3. 解析广播数据中的目标字段
Minew设备的自定义数据一般放在ManufacturerData里(公司ID是0x07D7,蓝牙SIG分配的官方标识),你需要解析字节数组对应字段。以下是基于常见Minew设备广播格式的示例解析:
// 注册扫描接收事件 bleWatcher.Received += async (sender, args) => { foreach (var manufacturerData in args.Advertisement.ManufacturerData) { // 过滤确认是Minew设备 if (manufacturerData.CompanyId == 0x07D7) { var dataBytes = manufacturerData.Data.ToArray(); if (dataBytes.Length < 6) return; // 确保数据长度足够解析核心字段 // 解析各字段(如果抓包后发现字节位置不符,直接调整索引即可) byte frameType = dataBytes[0]; byte productModel = dataBytes[1]; byte batteryLevel = dataBytes[2]; // 直接是0-100的百分比数值 // 温度:通常是16位小端格式,分辨率0.1℃,需要转换为实际温度值 short tempRaw = BitConverter.ToInt16(dataBytes, 3); double temperature = tempRaw / 10.0; byte humidity = dataBytes[5]; // 0-100的百分比数值 // 解析MAC地址:BluetoothAddress是ulong类型,转成6字节后反转(适配大端显示格式) string macAddress = BitConverter.ToString( args.BluetoothAddress.ToByteArray().Take(6).Reverse().ToArray() ).Replace("-", ":"); // 回到UI线程更新数据(UWP必须在UI线程操作界面元素) await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync( Windows.UI.Core.CoreDispatcherPriority.Normal, () => { // 在这里把解析后的数据展示到UI上,比如: // txtBattery.Text = $"电池电量:{batteryLevel}%"; // txtTempHum.Text = $"温度:{temperature}℃ | 湿度:{humidity}%"; } ); } } // 额外检查ServiceData中的数据(对应目标服务UUID) foreach (var serviceData in args.Advertisement.ServiceData) { if (serviceData.Uuid == targetServiceUuid) { var serviceBytes = serviceData.Data.ToArray(); // 如果ManufacturerData里没找到全部字段,可以在这里补充解析 } } }; // 启动扫描 bleWatcher.Start();
4. 调试与验证
如果解析出来的数据不符合预期,建议用蓝牙抓包工具(比如WireShark配合支持蓝牙抓包的适配器)捕获设备的广播包,直接查看字节序列对应关系,调整解析逻辑就行。毕竟文档没公开,抓包是最可靠的方式。
内容的提问来源于stack exchange,提问作者Csabavagyok
相关产品推荐
相关产品推荐

