GlucoMen Areo

Reverse engineered by Diego Elio Pettenò.

Cable

The data cable provided for the device is an USB Serial adapter based on Silicon Laboratories CP210x chipset.

It appears to be a fairly standard USB-to-TRS serial adapter, though the connector is a subminiature (2.5mm connector):

Connector Meaning
Tip Host-to-Device
Ring Device-to-Host
Sleeve GND

USB IDs

Device Vendor ID Product ID
GlucoMen Areo Cable 10c4 ea60

Protocol

The communication happens over a serial protocol, mixing text-based and byte-based commands.

Serial port configuration

The serial port should be configured as such:

  • 8 data bits;
  • odd parity;
  • 1 stop bit;
  • 9600 baud rate.

Request and Response Structure

Commands are sent from the host to the device with either a single byte, or with two command bytes followed by text parameters. Responses from the device are either in text format, or a single byte response (if the request had text parameters).

There are very few known commands that can be represented as such:

request = get-info-command / get-readings-command / set-datetime-command
response = text-parameters / no-readings / simple-response

get-info-command = %xA2
get-readings-command = %x80
set-datetime-command = %xC2 %xA1 text-parameters

simple-response = F / P
no-readings = "[" CRLF %x90 %x3D CRLF "]" CRLF
text-parameters = "[" CRLF *response-line checksum CRLF "]" CRLF

response-line = 1*VCHAR CRLF
checksum = 2HEXDIG

Checksum

The checksum is calculated according to the CRC-8/Maxim algorithm, applied on the text parameters starting from the opening square bracket ([) up until and including the CRLF preceding the checksum itself.

It is represented as two upper case hexadecimal digits. The device will refuse a command sent with a lower-case checksum even if correct.

GET INFO

The GET INFO command receives a text response consisting of a single line, comma-separated:

get-info-response = *DIGIT "," *DIGIT "," *DIGIT "," serial-number "," sw-version CRLF
serial-number = *SP 1*VCHAR
sw-version = *SP 1*VCHAR

The first three values are unknown at the time of writing, while the serial number and software versions may have leading spaces, and are otherwise printable characters.

Setting Date time

To set the date and time of the device, a single command can be sent, followed by the text parameters in the same format as returned by the device.

Note: the checksum has to be in upper case to be accepted by the device.

set-datetime-command = %xC2 %xA1 "[" CRLF datetime checksum CRLF "]" CRLF
datetime = year month day hour minute
year = 2DIGIT
month = 2DIGIT
day = 2DIGIT
hour = 2DIGIT
minute = 2DIGIT

Readings

The GET READING command receives either a response informing that there are no readings on the device or one reading per line in the text format with comma-separated values.

no-readings = "[" CRLF %x90 %x3D CRLF "]" CRLF

reading-response-line = reading-type "," value "," unit "," markings "," date "," time CRLF
reading-type = "Glu" / 1*VCHAR
value = 1*DIGIT *1("." DIGIT)
unit = "mmol/L" / 1*VCHAR
markings = no-marking / check-mark / before-meal / after-meal / exercise
date = year month day
time = hour minute

no-marking = "00"
check-mark = "01"
before-meal = "02"
after-meal = "04"
exercise = "08"

year = 2DIGIT
month = 2DIGIT
day = 2DIGIT
hour = 2DIGIT
minute = 2DIGIT

It's important to note that the readings are expressed in the native unite of the device and not, like in most other meters, in mg/dL even for mmol/L devices. This means you need to check the unit that is used in the same reading itself.

The markings values appear to correspond to values in a bitmask but they cannot be applied simultaneously, so they should be considered as different enumeration values.