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

