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

如何从GattCharacteristicValueChangedEventArgs读取室内骑行台真实数据

室内骑行台蓝牙特征值解析问题

我已成功连接室内骑行台蓝牙并能收到CharacteristicValueChanged回调,但始终无法从返回的byte数组中解析出有意义的数据。我了解蓝牙规范,但仍无法提取可读数据,希望能按照蓝牙室内骑行数据特征的定义来正确解析byte数组。

我之前尝试了以下代码:

private static void Chars_CharacteristicValueChanged(object sender, GattCharacteristicValueChangedEventArgs e)
{
    var flags = e.Value[0];
    var test = BitConverter.ToSingle(e.Value, 4);
    Console.WriteLine(flags);
    Console.WriteLine(test);
    Console.WriteLine(e.Value.GetValue(4));
    //for (var i = 0; i < 13; i++)
    //{
    //    Console.WriteLine(i + ": " + BitConverter.ToBoolean(e.Value, i));
    //}

    //Console.WriteLine("Instant Speed: " + BitConverter.ToUInt16(e.Value, 14));
    //Console.WriteLine("Average Speed: " + BitConverter.ToUInt16(e.Value, 15));
    //Console.WriteLine("Instantious Cadence: " + BitConverter.ToUInt16(e.Value, 16));
    //Console.WriteLine("Average Cadence: " + BitConverter.ToUInt16(e.Value, 17));
    //Console.WriteLine("Total Distance: " + BitConverter.ToInt32(e.Value, 18));
    //Console.WriteLine("Resistance Level: " + BitConverter.ToUInt16(e.Value, 19));
    //Console.WriteLine("Instantaneous Power: " + BitConverter.ToUInt16(e.Value, 20));
    //Console.WriteLine("Average Power: " + BitConverter.ToUInt16(e.Value, 21));
    //Console.WriteLine("Unknown22: " + BitConverter.ToUInt16(e.Value, 22));
    //Console.WriteLine("Unknown23: " + BitConverter.ToUInt16(e.Value, 23));
    //Console.WriteLine("Unknown24: " + BitConverter.ToUInt16(e.Value, 24));
    //Console.WriteLine("Unknown25: " + BitConverter.ToUInt16(e.Value, 25));
    //Console.WriteLine("Elapsed Time: " + BitConverter.ToUInt16(e.Value, 26));
    //Console.WriteLine("Unknown27: " + BitConverter.ToUInt16(e.Value, 27));
    //Console.WriteLine("Unknown28: " + BitConverter.ToUInt16(e.Value, 28));
    //distance = Convert.ToUInt16(e.Value[10]);
    //Console.WriteLine("Distance= " + distance);
}

但没有得到符合实际的数据,比如e.Value.GetValue(0)返回254,e.Value.GetValue(1)返回31,其余大多为0。

编辑
后来我参考其他语言的代码示例写出了这段代码:

private static void Chars_CharacteristicValueChanged(object sender, GattCharacteristicValueChangedEventArgs e)
{
    byte[] distanceBytes = new byte[2];
    Array.Copy(e.Value, 10, distanceBytes, 0, distanceBytes.Length);
    distanceBytes = PadBytes(distanceBytes, 4);

    var distance = Convert.ToDouble(BitConverter.ToUInt32(distanceBytes, 0).ToString());

        Console.WriteLine("Real Trainer: " + distance + "m");
}

这段代码输出的距离数据符合实际,且超过254后不会归零。看起来数据是uint24类型,需要从字节数组索引10开始取两个字节,但这更像“魔法操作”,希望有人能指导我如何正确完成所有数据的解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:01:44