VelocAI logo Bluetooth Explorer Documentation

Bluetooth GATT Characteristic Reference

Rower Data (0x2AD1)

org.bluetooth.characteristic.rower_data

The Rower Data characteristic is used to send training-related data to the Client from a rower (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
NameRower Data
UUID0x2AD1
Typeorg.bluetooth.characteristic.rower_data
XML RootCharacteristic
Source Fileorg.bluetooth.characteristic.rower_data.xml
Field Count17

Field Specification

Parsed field definitions from the source XML value structure.

Field Requirement Format Unit Exponent Notes
FlagsMandatory16bit---
Stroke RateC1uint8org.bluetooth.unit.stroke_per_minute-stroke/minute with a resolution of 0.5
Stroke CountC1uint16org.bluetooth.unit.unitless-Unitless with a resolution of 1
Average Stroke RateC2uint8org.bluetooth.unit.stroke_per_minute-1/minute with a resolution of 0.5
Total DistanceC3uint24org.bluetooth.unit.length.metre-Meters with a resolution of 1
Instantaneous PaceC4uint16org.bluetooth.unit.time.second-Second with a resolution of 1
Average PaceC5uint16org.bluetooth.unit.time.second-Second with a resolution of 1
Instantaneous PowerC6sint16org.bluetooth.unit.power.watt-Watts with a resolution of 1
Average PowerC7sint16org.bluetooth.unit.power.watt-Watts with a resolution of 1
Resistance LevelC8sint16org.bluetooth.unit.unitless-Unitless 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
Flags11Average Stroke presentFalseTrue
Flags21Total Distance PresentFalseTrue
Flags31Instantaneous Pace presentFalseTrue
Flags41Average Pace PresentFalseTrue
Flags51Instantaneous Power presentFalseTrue
Flags61Average Power presentFalseTrue
Flags71Resistance Level 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 stroke_rate = dataView.getUint8(offset + 0);
  const stroke_count = dataView.getUint16(offset + 1, true);
  const average_stroke_rate = dataView.getUint8(offset + 3);
  // Parse total_distance (uint24) according to Bluetooth format rules.
  const instantaneous_pace = dataView.getUint16(offset + 4, true);
  const average_pace = dataView.getUint16(offset + 6, true);
  const instantaneous_power = dataView.getInt16(offset + 8, true);
  const average_power = dataView.getInt16(offset + 10, true);
  const resistance_level = dataView.getInt16(offset + 12, true);
  return { flags, stroke_rate, stroke_count, average_stroke_rate, total_distance, instantaneous_pace };
}

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 Rower Data in Bluetooth GATT?

Rower Data is defined as a Bluetooth GATT characteristic entry with type org.bluetooth.characteristic.rower_data and UUID 0x2AD1.

What UUID identifies Rower Data?

The UUID for Rower Data is 0x2AD1.

How should I parse Rower 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.