Bluetooth GATT Characteristic Reference
Body Composition Measurement (0x2A9C)
Body Composition Measurement is defined in the Bluetooth GATT XML specification with type org.bluetooth.characteristic.body_composition_measurement and UUID 0x2A9C.
Quick Summary
Payload length is profile-defined or variable based on field formats. 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.
| Property | Value |
|---|---|
| Name | Body Composition Measurement |
| UUID | 0x2A9C |
| Type | org.bluetooth.characteristic.body_composition_measurement |
| XML Root | Characteristic |
| Source File | org.bluetooth.characteristic.body_composition_measurement.xml |
| Field Count | 19 |
Field Specification
Parsed field definitions from the source XML value structure.
| Field | Requirement | Format | Unit | Exponent | Notes |
|---|---|---|---|---|---|
| Flags | Mandatory | 16bit | - | - | - |
| Body Fat Percentage | Mandatory | uint16 | org.bluetooth.unit.percentage | -1 | Unit is in percent with a resolution of 0.1 |
| Time Stamp | C3 | N/A | - | - | Smallest unit in seconds |
| User ID | C4 | uint8 | org.bluetooth.unit.unitless | 0 | Unit is unitless with a resoluton of 1 |
| Basal Metabolism | C5 | uint16 | org.bluetooth.unit.energy.joule | 3 | Unit is in kilo Joules with a resolution of 1 |
| Muscle Percentage | C6 | uint16 | org.bluetooth.unit.percentage | -1 | Unit is in percentage with a resolution of 0.1 |
| Muscle Mass - Kilograms | C1 | uint16 | org.bluetooth.unit.mass.kilogram | -3 | Unit is in kilograms with resolution 0.005. Note: Determined when bit 0 of the Flags field is set to 0. |
| Muscle Mass - Pounds | C2 | uint16 | org.bluetooth.unit.mass.pound | -2 | Unit is in pounds with resolution 0.01. Note: Determined when bit 0 of the Flags field is set to 1. |
| Fat Free Mass - Kilograms | C1 | uint16 | org.bluetooth.unit.mass.kilogram | -3 | Unit is in kilograms with resolution 0.005. Note: Determined when bit 0 of the Flags field is set to 0. |
| Fat Free Mass - Pounds | C2 | uint16 | org.bluetooth.unit.mass.pound | -2 | Unit is in pounds with a resolution of 0.01. Note: Determined when bit 0 of the Flags field is set to 1. |
| Soft Lean Mass - Kilograms | C1 | uint16 | org.bluetooth.unit.mass.kilogram | -3 | Unit is in kilograms with a resolution of 0.005. Note: Determined when bit 0 of the Flags field is set to 0. |
| Soft Lean Mass - Pounds | C2 | uint16 | org.bluetooth.unit.mass.kilogram | -2 | Unit is in pounds with a resolution of 0.01. Note: Determined when bit 0 of the Flags field is set to 1. |
| Body Water Mass - Kilograms | C1 | uint16 | org.bluetooth.unit.mass.kilogram | -3 | Unit is in kilograms with a resolution of 0.005. Note: Determined when bit 0 of the Flags field is set to 0. |
| Body Water Mass - Pounds | C2 | uint16 | org.bluetooth.unit.mass.pound | -2 | Unit is in pounds with a resolution of 0.01. Note: Determined when bit 0 of the Flags field is set to 1. |
| Impedance | C11 | uint16 | org.bluetooth.unit.electric_resistance.ohm | -1 | Unit is in Ohms with a resolution of 0.1 |
| Weight - Kilograms | C1 | uint16 | org.bluetooth.unit.mass.kilogram | -3 | Unit is in kilograms with a resolution of 0.005. Note: Determined when bit 0 of the Flags field is set to 0. |
| Weight - Pounds | C2 | uint16 | org.bluetooth.unit.mass.pound | -2 | Unit is in pounds with a resolution of 0.01. Note: Determined when bit 0 of the Flags field is set to 1. |
| Height - Meters | C1 | uint16 | org.bluetooth.unit.length.meter | -3 | Unit is in meters with a resolution of 0.001. Note: Determined when bit 0 of the Flags field is set to 0. |
| Height - Inches | C2 | uint16 | org.bluetooth.unit.length.inch | -1 | Unit is in meters with a resolution of 0.1. Note: Determined when bit 0 of the Flags field is set to 1. |
Bit Map
Bit-level enumerations extracted from the XML BitField definition.
| Field | Bit | Size | Name | 0 Means | 1 Means |
|---|---|---|---|---|---|
| Flags | 0 | 1 | Measurement Units | SI (Weight and Mass in units of kilogram (kg) and Height in units of meter) | Imperial (Weight and Mass in units of pound (lb) and Height in units of inch (in)) |
| Flags | 1 | 1 | Time Stamp Present | False | True |
| Flags | 2 | 1 | User ID present | False | True |
| Flags | 3 | 1 | Basal Metabolism present | False | True |
| Flags | 4 | 1 | Muscle Percentage present | False | True |
| Flags | 5 | 1 | Muscle Mass present | False | True |
| Flags | 6 | 1 | Fat Free Mass present | False | True |
| Flags | 7 | 1 | Soft Lean Mass present | False | True |
| Flags | 8 | 1 | Body Water Mass present | False | True |
| Flags | 9 | 1 | Impedance present | False | True |
| Flags | 10 | 1 | Weight present | False | True |
| Flags | 11 | 1 | Height present | False | True |
| Flags | 12 | 1 | Multiple Packet Measurement | False | True |
Byte Layout and Decode
Payload length is profile-defined or variable based on field formats.
function decodePayload(dataView, offset = 0) {
// Parse flags (16bit) according to Bluetooth format rules.
const body_fat_percentage = dataView.getUint16(offset + 0, true);
// Parse time_stamp (N/A) according to Bluetooth format rules.
const user_id = dataView.getUint8(offset + 2);
const basal_metabolism = dataView.getUint16(offset + 3, true);
const muscle_percentage = dataView.getUint16(offset + 5, true);
const muscle_mass_kilograms = dataView.getUint16(offset + 7, true);
const muscle_mass_pounds = dataView.getUint16(offset + 9, true);
const fat_free_mass_kilograms = dataView.getUint16(offset + 11, true);
const fat_free_mass_pounds = dataView.getUint16(offset + 13, true);
return { flags, body_fat_percentage, time_stamp, user_id, basal_metabolism, muscle_percentage };
}
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 Body Composition Measurement in Bluetooth GATT?
Body Composition Measurement is defined as a Bluetooth GATT characteristic entry with type org.bluetooth.characteristic.body_composition_measurement and UUID 0x2A9C.
What UUID identifies Body Composition Measurement?
The UUID for Body Composition Measurement is 0x2A9C.
How should I parse Body Composition Measurement?
Payload length is profile-defined or variable based on field formats.
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.