0x05 0x01 0x02 0x03 0x04 0x05 0x06 0x07
This document outlines the USB HID based protocol for the Omron 790IT Blood Pressure Monitor. The protocol allows a user to download information that was stored on the unit over multiple usages.
Thanks to Adam Richter for editing and additions to the document.
The following notation is used in the packet formats in this document
refers to a byte that is ignored and can take any value
refers to a byte that is significant but variable
The protocol itself does not follow the normal USB HID specification, instead catching and using the raw reports with its own format. It does this in order to bypass driver installation on Windows based machines.
All output reports are 8 bytes with no HID report ID, but some operating sytem software (at least under Microsoft Windows) will provide prepend a byte that is always 0, to indicate report ID 0, so the report will be appear to be 9 bytes (1 report ID, always 0, 8 data). This is probably intended to simplify HID report processing by allowing client software to be written as if all HID devices prepend a one byte report ID.
In input and output reports, the first data byte specifies the number of "valid" bytes in the packet. Count starts after the count byte, all bytes after the count are ignored.
i.e. In the packet
0x05 0x01 0x02 0x03 0x04 0x05 0x06 0x07
Only bytes 1-5 are used, and would look like this in our notation
0x05 0x01 0x02 0x03 0x04 0x05 0xXX 0xXX
0x06 0x07 are ignored and can be anything.
All commands from the computer to the Omron device consit of at least five bytes. All commands begin with three mnemonic ASCII characters (except for the "clearing block" command described below, where these bytes are all zero) followed by one or more data bytes (which may or may not human readable ASCII, depending on command), followed, by a terminating checksum byte which is the XOR of the data bytes. Commands may span multiple output reports.
For returns, the first 2-3 bytes specify the status. Returns may be broken up over multiple input reports
Successful input reports begin with ASCII "OK" and are either exactly two bytes or at least five bytes, the last of which is a checksum of the bytes after the "OK".
0x4F 0x4B [ 0x00 ... CHECKSUM ] (ASCII: "OK") (The CHECKSUM byte is the XOR of bytes designateed by "...")
An exception to the statement about checksums above is the response to the "END" command which is "OFF\r\n" with no checksum byte. Also a response of zero bytes to an "END" command may have been observed under Linux, but this may have been a figment of a user level bug.
Unsuccessful input reports will have their first two bytes as 0x4E 0x4F.
0x4E 0x4F (ASCII: "NO")
The Omron 790IT has 3 data retrieval modes that need to be set before data can be pulled from the unit.
These data modes are set by way of HID Feature Requests. All feature requests are 3 bytes (1 report ID, always 0, and 2 data bytes).
0x01 0x01
0x74 0xbc
0x10 0x74
After a mode is set, a clearing block is sent. These consist of:
7 bytes out, all 0
7 bytes in, all 0
3 packets of 7 bytes out, all 0
1 packet of 2 bytes out, all 0
One packet in of success status message, otherwise repeat above two steps
Used to retrieve the version of the unit, in ASCII string format
0x56 0x45 0x52 0x30 0x30 (ASCII: "VER00") (Three byte ASCII command "VER", argument "0", checksum checksum "0")
None
15 bytes (3 bytes for "OK" success string, 12 byte ASCII string, not null terminated, giving the unit version)
0x56 0x45 0x52 0x30 0x30 (Three byte ASCII command "VER", argument byte ASCII "0", checksum byte ASCII "0")
0x05 0x56 0x45 0x52 0x30 0x30 0xXX 0xXX (Byte count 5, command "VER", argument "0", argument checksum "0")
0x4d 0x37 0x30 0x38 0x30 0x49 0x54 0x20 0x32 0x30 0x37 0x4a (ASCII: "M7080IT 207J") (data bytes: ASCII "M7080IT 207", data checksum: 0x4a )
0x07 0x4f 0x4b 0x00 0x4d 0x37 0x30 0x38 0x07 0x30 0x49 0x54 0x20 0x32 0x30 0x37 0x01 0x4a 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
Used to retrieve whatever the PRF is for the unit. ASCII string, could be some sort of odd bitfield?
0x50 0x52 0x46 0x30 0x30 (ASCII: "PRF00")
None
14 bytes (3 bytes for "OK" success string, 11 byte ASCII string)
0x50 0x52 0x46 0x30 0x30
0x05 0x50 0x52 0x46 0x30 0x30 0xXX 0xXX (Byte count 5, ASCII "PRF", data byte "0", data checksum "0")
0x30 0x30 0x31 0x30 0x31 0x30 0x30 0x30 0x30 0x30 0x00 (ASCII: '001010000') (ASCII data '0010100', data checksum: 0)
0x07 0x4f 0x4b 0x00 0x30 0x30 0x31 0x30 0x07 0x31 0x30 0x30 0x30 0x30 0x30 0x00
Used to retrieve whatever the SRL is for the unit. ASCII string, could be serial number?
0x53 0x52 0x4c 0x30 0x30 (ASCII: "SRL00")
None
11 bytes (3 bytes for "OK" success string, 8 bytes, binary, not sure of context)
0x53 0x52 0x4c 0x30 0x30
0x05 0x53 0x52 0x4c 0x30 0x30 0xXX 0xXX
0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x06
0x07 0x4f 0x4b 0x00 0x06 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x06 0xXX 0xXX 0xXX
Used to retreive how many sessions are currently stored on the machine
0x47 0x44 0x43 0x00 bank 0x00 0x00 checksum ASCII: "GDC" (Get Data Count?) index = 0..(value returned by GDC - 1) bank = 0x00, 0x01 or 0x02, perhaps for user A, user B, combined? checksum = the XOR of the bytes after "GDC"
Which bank to query, last byte of command (NEED TO CONFIRM)
8 bytes (3 bytes for "OK" success string, 5 bytes, binary, not sure of context)
Byte 3: Number of available sessions
0x47 0x44 0x43 0x00 0x00 0x00 0x00 0x01
0x07 0x47 0x44 0x43 0x00 0x00 0x00 0x00 0x01 0x01 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
0x00 0x0a 0x00 0x08 0x02
0x07 0x4f 0x4b 0x00 0x00 0x0a 0x00 0x08 0x01 0x02 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
Retrieve information about a single reading
0x47 0x4d 0x45 0x00 bank 0x00 index checksum ASCII: "GME" (Get Measurement?) index = 0..(value returned by GDC - 1) bank = 0x00, 0x01 or 0x02, perhaps for user A, user B, combined? checksum = the XOR of the bytes after "GME"
Index of record, last 2 bytes of command
17 bytes (3 bytes for "OK" success string, 14 bytes, binary) Will sometimes return "NO" message. If this happens, requery using the same command
Last 2 digits of year
Month
Day
Hour (24-hour format) (NEED TO CONFIRM)
Minute
Seconds
UNKNOWN
UNKNOWN
SYS
DIA
Pulse
UNKNOWN
Status Flags
0x0X - Standalone reading
0x1X - First reading of a 3 reading average (TruRead function)
0x2X - Second reading of a 3 reading average (TruRead function)
0x3X - Third reading of a 3 reading average (TruRead function)
Others: UNKNOWN
Checksum (XOR of bytes 0..C)
Command gets newest available record
0x47 0x4d 0x45 0x00 0x00 0x00 0x00 0x00
0x07 0x47 0x4d 0x45 0x00 0x00 0x00 0x00 0x01 0x00 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
0x07 0x01 0x03 0x00 0x06 0x33 0x00 0x00 0x70 0x4b 0x47 0x00 0x00 0x4c
07
01
03
00
06
33
0x70 (112)
0x4b (75)
0x47 (71)
Standalone
0x07 0x4f 0x4b 0x00 0x07 0x01 0x03 0x00 0x07 0x06 0x33 0x00 0x00 0x70 0x4b 0x47 0x03 0x00 0x00 0x4c 0xXX 0xXX 0xXX 0xXX
Retrieve information about a weekly morning/evening average
0x47 0x4d 0x41 0x00 bank index 0x00 0x00 checksum ASCII: "GMA" (Get Morning Average) or 0x47 0x45 0x41 0x00 bank index 0x00 0x00 checksum ASCII: "GEA" (Get Evening Average) index = 0..7? bank = 0x00, 0x01 or 0x02, perhaps for user A, user B, combined? checksum = the XOR of the bytes after "GMA" or "GEA"
Index of record
12 bytes (3 bytes for "OK" success string, 9 bytes, binary)
UNKNOWN (always 0x80?)
UNKNOWN (always 0..7?)
Last two digits of year
Month
Day
SYS minus 25 (NEED TO CONFIRM) (0 = no readings this week?)
DIA (0 = no readings this week?)
Pulse
Checksum (XOR of bytes 0..7)
Command gets 7th record
0x47 0x4d 0x41 0x00 0x00 0x06 0x00 0x00 0x06
0x07 0x47 0x4d 0x41 0x00 0x00 0x00 0x06 0x02 0x00 0x06 0x00 0x00 0x00 0x00 0x00
0x80 0x01 0x09 0x04 0x13 0x71 0x69 0x70 0xf7
138 (0x71 + 0x19, unit says 138 though. This lines up across other readings too)
105 (0x69)
112 (0x70)
0x07 0x4f 0x4b 0x00 0x80 0x01 0x09 0x04 0x05 0x13 0x71 0x69 0x70 0xf7 0xXX 0xXX
Notifies the unit that the transfer session is over. Device will turn off after this command is sent.
0x45 0x4E 0x44 0xFF 0xFF (ASCII: "END")
None
5 Bytes (ASCII "OFF\r\n"), signaling that the unit is turning off
0x45 0x4E 0x44 0xFF 0xFF
0x05 0x45 0x4E 0x44 0xFF 0xFF 0xXX 0xXX
0x4F 0x46 0x46 0x0D 0x0A (ASCII: "OFF\r\n")
0x07 0x4F 0x46 0x46 0x0D 0x0A 0xXX 0xXX
For further information, visit: