VelocAI logo Bluetooth Explorer Documentation

Bluetooth GATT Characteristic Reference

CGM Measurement (0x2AA7)

org.bluetooth.characteristic.cgm_measurement

The CGM Measurement characteristic is a variable length structure containing one or more CGM Measurement records, each comprising a Size field, a Flags Field, a Glucose Concentration field, a Time Offset field, a Sensor Status Annunciation field (optional), a CGM Trend Information Field (optional), a CGM Quality Field (optional), and an E2E-CRC Field (mandatory if this feature is supported).

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.

PropertyValue
NameCGM Measurement
UUID0x2AA7
Typeorg.bluetooth.characteristic.cgm_measurement
XML RootCharacteristic
Source Fileorg.bluetooth.characteristic.cgm_measurement.xml
Field Count8

Field Specification

Parsed field definitions from the source XML value structure.

Field Requirement Format Unit Exponent Notes
SizeMandatoryuint8--The Size Field represents the size of the CGM Measurement record. In minimum the size is 6 octets and is enlarged by more octets indicated by the Flags Field (Sensor Status Annunciation Field, CGM Trend Information Field and CGM Quality Field) and the E2E-CRC Supported bit in CGM Feature. The Size Field itself is included in the overall length calculation.
FlagsMandatory8bit---
CGM Glucose ConcentrationMandatorySFLOATorg.bluetooth.unit.mass_density.milligram_per_decilitre0The CGM Glucose Concetration Field contains the CGM glucose concentration in mg/dL as a SFLOAT data type. The SFLOAT-Type is a 16-bit word comprising a signed 4-bit integer exponent followed by a signed 12-bit Mantissa, each in twos-complement form.
Time OffsetMandatoryuint16org.bluetooth.unit.time.minute0The following values are defined for the Time Offset Field, specifying the relative time difference of the single CGM values to the session start time. Value: (0x0000 - 0xFFFF), Description: (Time offset in minutes as offset to the Session Start Time).
Sensor Status AnnunciationC4variable--The Sensor Status Annunciation Field is an optional field comprising up to three octets. It is only attached if one or more bits are set to ?1?. Only the affected octet(s) shall be added and indicated by the Flags Field. The Sensor Status Annunciation Field shall be attached to every CGM Measurement Record to which the status applies.
CGM Trend InformationC1SFLOATorg.bluetooth.unit.mass_density.milligram_per_decilitre0The CGM Trend Information Field contains the CGM Trend information in (mg/dL)/min as an SFLOAT data type. This field is optional if the device supports CGM Trend information (Bit 15 in CGM Feature is set to 1) otherwise excluded.
CGM QualityC2SFLOATorg.bluetooth.unit.percentage0This field contains the CGM Quality information in % as an SFLOAT data type. The SFLOAT-Type is a 16-bit word comprising a signed 4-bit integer exponent followed by a signed 12-bit Mantissa, each in twos-complement form. This field is optional if the device supports CGM Quality (Bit 16 in CGM Feature is set to 1) otherwise excluded.
E2E-CRCC3uint16--If the device supports E2E-safety (E2E-CRC Supported bit is set in CGM Feature), the measurement is secured by a CRC calculated over all fields. The computation of the CRC is done using a CRC-CCITT generator polynomial g(D)=D16+D12+D5+1 (i.e.210041 in octal representation) with a seed of 0xFFFF. This field is mandatory if the device supports E2E-CRC (Bit 12 in CGM Feature is set to 1) otherwise excluded.

Bit Map

Bit-level enumerations extracted from the XML BitField definition.

Field Bit Size Name 0 Means 1 Means
Flags01CGM Trend Information PresentFalseTrue
Flags11CGM Quality PresentFalseTrue
Flags51Sensor Status Annunciation Field, Warning-Octet presentFalseTrue
Flags61Sensor Status Annunciation Field, Cal/Temp-Octet presentFalseTrue
Flags71Sensor Status Annunciation Field, Status-Octet presentFalseTrue
Sensor Status Annunciation01Session StoppedFalseTrue
Sensor Status Annunciation11Device Battery LowFalseTrue
Sensor Status Annunciation21Sensor type incorrect for deviceFalseTrue
Sensor Status Annunciation31Sensor malfunctionFalseTrue
Sensor Status Annunciation41Device Specific AlertFalseTrue
Sensor Status Annunciation51General device fault has occurred in the sensorFalseTrue
Sensor Status Annunciation81Time synchronization between sensor and collector requiredFalseTrue
Sensor Status Annunciation91Calibration not allowedFalseTrue
Sensor Status Annunciation101Calibration recommendedFalseTrue
Sensor Status Annunciation111Calibration requiredFalseTrue
Sensor Status Annunciation121Sensor Temperature too high for valid test/result at time of measurementFalseTrue
Sensor Status Annunciation131Sensor temperature too low for valid test/result at time of measurementFalseTrue
Sensor Status Annunciation161Sensor result lower than the Patient Low levelFalseTrue
Sensor Status Annunciation171Sensor result higher than the Patient High levelFalseTrue
Sensor Status Annunciation181Sensor result lower than the Hypo levelFalseTrue
Sensor Status Annunciation191Sensor result higher than the Hyper levelFalseTrue
Sensor Status Annunciation201Sensor Rate of Decrease exceededFalseTrue
Sensor Status Annunciation211Sensor Rate of Increase exceededFalseTrue
Sensor Status Annunciation221Sensor result lower than the device can processFalseTrue
Sensor Status Annunciation231Sensor result higher than the device can processFalseTrue

Byte Layout and Decode

Payload length is profile-defined or variable based on field formats.

function decodePayload(dataView, offset = 0) {
  const size = dataView.getUint8(offset + 0);
  // Parse flags (8bit) according to Bluetooth format rules.
  // Parse cgm_glucose_concentration (SFLOAT) according to Bluetooth format rules.
  const time_offset = dataView.getUint16(offset + 1, true);
  // Parse sensor_status_annunciation (variable) according to Bluetooth format rules.
  // Parse cgm_trend_information (SFLOAT) according to Bluetooth format rules.
  // Parse cgm_quality (SFLOAT) according to Bluetooth format rules.
  const e2e_crc = dataView.getUint16(offset + 3, true);
  return { size, flags, cgm_glucose_concentration, time_offset, sensor_status_annunciation, cgm_trend_information };
}

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 CGM Measurement in Bluetooth GATT?

CGM Measurement is defined as a Bluetooth GATT characteristic entry with type org.bluetooth.characteristic.cgm_measurement and UUID 0x2AA7.

What UUID identifies CGM Measurement?

The UUID for CGM Measurement is 0x2AA7.

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