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

UWP环境下如何通过C#读取小米手环2特征值(以电量为例)

解决C#读取小米手环2电量的问题

嘿,我正好折腾过小米手环2的BLE交互,给你一步步拆解怎么搞定电量读取!

首先,你已经成功连接手环并拿到了FEE0服务,这一步是对的——小米手环2的核心数据服务就是这个UUID。接下来要瞄准两个关键特征:

1. 找到对应的电量特征和控制特征

小米手环2的电量相关特征UUID是00000006-0000-3512-2118-0009af100700,另外如果需要主动请求数据,还要用到控制特征00000009-0000-3512-2118-0009af100700。

先把获取特征的代码补全:

// 假设你已经拿到了FEE0服务
var service = result.Services[0];

// 获取电量特征
var batteryCharResult = await service.GetCharacteristicsForUuidAsync(Guid.Parse("00000006-0000-3512-2118-0009af100700"));
var batteryCharacteristic = batteryCharResult.Characteristics[0];

// 获取控制特征(用于主动请求数据,可选)
var controlCharResult = await service.GetCharacteristicsForUuidAsync(Guid.Parse("00000009-0000-3512-2118-0009af100700"));
var controlCharacteristic = controlCharResult.Characteristics[0];

2. 注册通知或主动读取数据

有两种方式获取电量:一种是注册特征值变化通知,手环主动推送;另一种是主动发送命令请求。

方式一:注册通知自动接收

// 绑定值变化事件
batteryCharacteristic.ValueChanged += OnBatteryValueChanged;

// 启用通知权限
await batteryCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync(
    GattClientCharacteristicConfigurationDescriptorValue.Notify);

然后实现事件处理方法,重点就是解析字节数组:

private void OnBatteryValueChanged(GattCharacteristic sender, GattValueChangedEventArgs args)
{
    byte[] data = args.CharacteristicValue.ToArray();
    
    // 小米手环2的电量数据格式通常是:[0x02, 电量百分比, ...]
    // 这里的索引1就是电量值(0-100)
    if (data.Length >= 2)
    {
        int batteryLevel = data[1];
        Console.WriteLine($"当前手环电量:{batteryLevel}%");
    }
}

方式二:主动发送请求获取

如果注册通知后没收到数据,大概率是手环需要主动触发才会返回。你可以通过控制特征发送请求指令:

// 请求电量的指令(不同固件版本可能略有差异,这个是通用版)
byte[] batteryRequestCmd = new byte[] { 0x02, 0x00 };

// 写入指令
await controlCharacteristic.WriteValueAsync(
    batteryRequestCmd.AsBuffer(), 
    GattWriteOption.WriteWithoutResponse);

发送后,手环就会把电量数据推送到你注册的通知事件里,或者你也可以主动读取电量特征的值:

var readResult = await batteryCharacteristic.ReadValueAsync();
byte[] data = readResult.Value.ToArray();
// 同样按上面的逻辑解析即可

3. 注意事项

  • 字节解析的坑:Java里的byte是有符号的,所以Java示例里可能会写data[1] & 0xFF,但C#的byte本身是无符号的(0-255),直接转int就没问题,不用额外处理。
  • 固件版本差异:如果上面的索引不对,你可以把收到的byte数组全部打印出来,对比Java示例里的解析逻辑调整索引——比如有些版本可能电量在索引2的位置。
  • 权限问题:确保你的应用已经获取了蓝牙相关的权限(UWP里是bluetooth和bluetooth.genericAttributeProfile)。

内容的提问来源于stack exchange,提问作者4L3X

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:06:21