VelocAI logo Bluetooth Explorer Documentation

Bluetooth GATT Characteristic Reference

Indoor Bike Data (0x2AD2)

org.bluetooth.characteristic.indoor_bike_data

The Indoor Bike Data characteristic is used to send training-related data to the Client from an indoor bike (Server).

Quick Summary

Payload length is 30 bytes. This page is generated from official GATT XML and presented as implementation-ready guidance.

At a Glance

Key reference details for BLE implementation, interoperability testing, and AI-assisted troubleshooting.

PropertyValue
NameIndoor Bike Data
UUID0x2AD2
Typeorg.bluetooth.characteristic.indoor_bike_data
XML RootCharacteristic
Source Fileorg.bluetooth.characteristic.indoor_bike_data.xml
Field Count16

Field Specification

Parsed field definitions from the source XML value structure.

Field Requirement Format Unit Exponent Notes
FlagsMandatory16bit---
Instantaneous SpeedC1uint16org.bluetooth.unit.velocity.kilometre_per_hour-2Kilometer per hour with a resolution of 0.01
Average SpeedC2uint16org.bluetooth.unit.velocity.kilometre_per_hour-2Kilometer per hour with a resolution of 0.01
Instantaneous CadenceC3uint16org.bluetooth.unit.angular_velocity.revolution_per_minute-1/minute with a resolution of 0.5
Average CadenceC4uint16org.bluetooth.unit.angular_velocity.revolution_per_minute-1/minute with a resolution of 0.5
Total DistanceC5uint24org.bluetooth.unit.length.metre-Meters with a resolution of 1
Resistance LevelC6sint16org.bluetooth.unit.unitless-Unitless with a resolution of 1
Instantaneous PowerC7sint16org.bluetooth.unit.power.watt-Watts with a resolution of 1
Average PowerC8sint16org.bluetooth.unit.power.watt-Watts with a resolution of 1
Total EnergyC9uint16org.bluetooth.unit.energy.kilogram_calorie-Kilo Calorie with a resolution of 1
Energy Per HourC9uint16org.bluetooth.unit.energy.kilogram_calorie-Kilo Calorie with a resolution of 1
Energy Per MinuteC9uint8org.bluetooth.unit.energy.kilogram_calorie-Kilo Calorie with a resolution of 1
Heart RateC10uint8org.bluetooth.unit.period.beats_per_minute-Beats per minute with a resolution of 1
Metabolic EquivalentC11uint8org.bluetooth.unit.metabolic_equivalent-1Metabolic Equivalent with a resolution of 0.1
Elapsed TimeC12uint16org.bluetooth.unit.time.second-Second with a resolution of 1
Remaining TimeC13uint16org.bluetooth.unit.time.second-Second with a resolution of 1

Bit Map

Bit-level enumerations extracted from the XML BitField definition.

Field Bit Size Name 0 Means 1 Means
Flags01More DataFalseTrue
Flags11Instantaneous Cadence presentFalseTrue
Flags21Average Speed presentFalseTrue
Flags31Average Candence presentFalseTrue
Flags41Total Distance PresentFalseTrue
Flags51Resistance Level presentFalseTrue
Flags61Instantaneous Power presentFalseTrue
Flags71Average Power presentFalseTrue
Flags81Expended Energy presentFalseTrue
Flags91Heart Rate presentFalseTrue
Flags101Metabolic Equivalent presentFalseTrue
Flags111Elapsed Time presentFalseTrue
Flags121Remaining Time presentFalseTrue

Byte Layout and Decode

Payload length is 30 bytes.

function decodePayload(dataView, offset = 0) {
  // Parse flags (16bit) according to Bluetooth format rules.
  const instantaneous_speed = dataView.getUint16(offset + 0, true);
  const average_speed = dataView.getUint16(offset + 2, true);
  const instantaneous_cadence = dataView.getUint16(offset + 4, true);
  const average_cadence = dataView.getUint16(offset + 6, true);
  // Parse total_distance (uint24) according to Bluetooth format rules.
  const resistance_level = dataView.getInt16(offset + 8, true);
  const instantaneous_power = dataView.getInt16(offset + 10, true);
  const average_power = dataView.getInt16(offset + 12, true);
  const total_energy = dataView.getUint16(offset + 14, true);
  return { flags, instantaneous_speed, average_speed, instantaneous_cadence, average_cadence, total_distance };
}

Use Cases and Integration Notes

BLE Telemetry

Map characteristic values into dashboards and alerts for device observability.

Firmware Regression

Compare decoded fields across builds to detect protocol or scaling changes.

App Integration

Build stable parsing paths that convert raw payloads into typed app models.

Implementation Checklist

  • Validate payload length and mandatory fields before decode.
  • Decode with Bluetooth-specified signedness, unit, and exponent handling.
  • Convert units at presentation boundaries to avoid drift in business logic.
  • Persist raw packets and decoded values for reproducible troubleshooting.

FAQ

What is Indoor Bike Data in Bluetooth GATT?

Indoor Bike Data is defined as a Bluetooth GATT characteristic entry with type org.bluetooth.characteristic.indoor_bike_data and UUID 0x2AD2.

What UUID identifies Indoor Bike Data?

The UUID for Indoor Bike Data is 0x2AD2.

How should I parse Indoor Bike Data?

Payload length is 30 bytes.

Where does this definition come from?

This page is generated from the Bluetooth SIG mirror XML in the oesmith/gatt-xml repository.

How does this page support BLE implementation?

The page combines structured tables, practical Q&A, and JSON-LD metadata to help teams validate integrations and troubleshoot consistently.