You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:24:04