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
相关产品推荐
相关产品推荐

