Bluetooth GATT Characteristic Reference
CGM Measurement (0x2AA7)
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.
| Property | Value |
|---|---|
| Name | CGM Measurement |
| UUID | 0x2AA7 |
| Type | org.bluetooth.characteristic.cgm_measurement |
| XML Root | Characteristic |
| Source File | org.bluetooth.characteristic.cgm_measurement.xml |
| Field Count | 8 |
Field Specification
Parsed field definitions from the source XML value structure.
| Field | Requirement | Format | Unit | Exponent | Notes |
|---|---|---|---|---|---|
| Size | Mandatory | uint8 | - | - | 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. |
| Flags | Mandatory | 8bit | - | - | - |
| CGM Glucose Concentration | Mandatory | SFLOAT | org.bluetooth.unit.mass_density.milligram_per_decilitre | 0 | The 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 Offset | Mandatory | uint16 | org.bluetooth.unit.time.minute | 0 | The 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 Annunciation | C4 | variable | - | - | 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 Information | C1 | SFLOAT | org.bluetooth.unit.mass_density.milligram_per_decilitre | 0 | The 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 Quality | C2 | SFLOAT | org.bluetooth.unit.percentage | 0 | This 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-CRC | C3 | uint16 | - | - | 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 |
|---|---|---|---|---|---|
| Flags | 0 | 1 | CGM Trend Information Present | False | True |
| Flags | 1 | 1 | CGM Quality Present | False | True |
| Flags | 5 | 1 | Sensor Status Annunciation Field, Warning-Octet present | False | True |
| Flags | 6 | 1 | Sensor Status Annunciation Field, Cal/Temp-Octet present | False | True |
| Flags | 7 | 1 | Sensor Status Annunciation Field, Status-Octet present | False | True |
| Sensor Status Annunciation | 0 | 1 | Session Stopped | False | True |
| Sensor Status Annunciation | 1 | 1 | Device Battery Low | False | True |
| Sensor Status Annunciation | 2 | 1 | Sensor type incorrect for device | False | True |
| Sensor Status Annunciation | 3 | 1 | Sensor malfunction | False | True |
| Sensor Status Annunciation | 4 | 1 | Device Specific Alert | False | True |
| Sensor Status Annunciation | 5 | 1 | General device fault has occurred in the sensor | False | True |
| Sensor Status Annunciation | 8 | 1 | Time synchronization between sensor and collector required | False | True |
| Sensor Status Annunciation | 9 | 1 | Calibration not allowed | False | True |
| Sensor Status Annunciation | 10 | 1 | Calibration recommended | False | True |
| Sensor Status Annunciation | 11 | 1 | Calibration required | False | True |
| Sensor Status Annunciation | 12 | 1 | Sensor Temperature too high for valid test/result at time of measurement | False | True |
| Sensor Status Annunciation | 13 | 1 | Sensor temperature too low for valid test/result at time of measurement | False | True |
| Sensor Status Annunciation | 16 | 1 | Sensor result lower than the Patient Low level | False | True |
| Sensor Status Annunciation | 17 | 1 | Sensor result higher than the Patient High level | False | True |
| Sensor Status Annunciation | 18 | 1 | Sensor result lower than the Hypo level | False | True |
| Sensor Status Annunciation | 19 | 1 | Sensor result higher than the Hyper level | False | True |
| Sensor Status Annunciation | 20 | 1 | Sensor Rate of Decrease exceeded | False | True |
| Sensor Status Annunciation | 21 | 1 | Sensor Rate of Increase exceeded | False | True |
| Sensor Status Annunciation | 22 | 1 | Sensor result lower than the device can process | False | True |
| Sensor Status Annunciation | 23 | 1 | Sensor result higher than the device can process | False | True |
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.