The GO device and Input-Output Expanders (IOX) are connected in a dedicated CAN network. All communication is between the GO device and any connected IOXs - in particular, IOXs do not communicate with other IOXs. The following communication scenarios exist: GO device to all connected IOXs; GO device to an individual IOX; and an individual IOX to GO device. Readers are encouraged to look at examples from CAN IOX Sample Communication Session as they read through the rest of this page.
This document describes the IO Expander Protocol version 1.3.
All messages since IO Expander Protocol version 1.0 are supported, unless stated otherwise.
Third-party IOX Add-ons rely on the messages and protocols defined in this document to properly communicate with Geotab firmware. Geotab will endeavor to maintain support for the currently-documented messages and protocol. However, from time to time, Geotab may make changes to such messages and protocols which can potentially impact third-party IOX Add-on implementations. If Geotab makes any such changes, Geotab will use commercially reasonable efforts to provide partners with as much notice of the impending firmware changes as is practical given the circumstances. Geotab accepts no responsibility or liability for third party IOX Add-ons which fail to function properly, or at all, and any and all damages which arise, directly or indirectly, from such failures.
Geotab recommends that all partners who develop their own IOX Add-ons ensure they have the ability to remotely update their firmware. This can be accomplished by sending an update to the IOX Add-on using the MIME passthrough messages.
Each custom IOX is assigned a 4-byte Serial Number by the integrators, similar to each car having its own VIN. The 2 Most Significant Bytes of the Serial Number are reported in bytes 3 and 4 of the Poll Response (0x02). The 2 Least Significant Bytes are used to differentiate each IOX connected to the same CAN bus (attached to the same GO device) when the GO device is sending messages targeted for a specific IOX. In other words, the 2 LSB serve as the Address ID, and are included in bits 15 - 0 of the Arbitration ID.
Integrators are free to leverage any mechanism for the Serial Number assignment to each individual IOX, but Geotab recommends following the process outlined below:
Message identification is done with an arbitration ID.
The Arbitration ID Field for IOX Messages:
Bits | 29 to 24 | 23 to 17 | 16 to 1 |
---|---|---|---|
Contents | Reserved: 0 | Command: 0-127 | All IOXs: 0 Individual IOX address ID: 1-65535 |
0x1F800000 IO_EXPANDER_RESERVED_MASK
0x007F0000 IO_EXPANDER_COMMAND_MASK
0x0000FFFF IO_EXPANDER_ID_MASK
The last 2 bytes of the IOX Serial Number (MSB first) are used as the Address ID. This allows the GO device to identify the source of a message or, when the message is sent from the GO device, to identify the destination IOX.
The GO device sends messages with ID 0x0000 meant for all IOXs, or with an ID between 0x0001 and 0xFFFF when it is targeted at a specific IOX.
IOXs always use their own ID when sending messages. They never send 0x0000. For this reason, IOXs are not produced with Serial Numbers ending in 0x0000.
Each model of IOX is assigned an IOX ID by Geotab, similar to each model of car having a model name. Integrators shall contact Geotab to get an IOX ID assigned. The IOX ID does not need to be included in the IOX Serial Number. Integrators shall report the IOX ID in byte 7 of the Poll Response (0x02).
An IOX could receive messages from the GO device that are not documented here. The IOX must be capable of handling this situation by ignoring/discarding the unknown messages.
After powering up, the GO device will poll all IOXs every 7 seconds. Each IOX must respond to this poll by obeying the ACK rules. Unless otherwise described, most commands can only be sent after the first poll (handshake) is completed with the GO device.
If the GO device fails to detect an IOX that used to be connected (that is, the IOX was disconnected), the GO device will remove the IOX from its internal database after 5 attempts (35 seconds) and will make the slot available for a new IOX that can be connected at any time.
If the GO is already tracking an instance of the IOX and the IOX responds to a poll indicating that it reset, the GO will not acknowledge the first poll response as it drops the previous instance. As noted in the Acknowledge Process after a delay, the IOX should retry the poll response and the GO should acknowledge and re-add the IOX.
Any IOX that is connected to the GO device must respond to the poll request. The GO device will notice the new IOXs and add them to its internal database.
Every 1 second, the GO wakes up for 2 ms to look for CAN activity on the IOX bus. The IOX can wake up the GO by sending an RX Data (0x0C) message every 1 ms until the GO device notices the activity and sends the Wakeup (0x04) message to the IOX.
As noted in the Acknowledge Process after a delay, the IOX should retry the message. If after some time the lack of acknowledgement persists, it may indicate a communication issue, and the IOX should perform a soft reset.
The IOX should perform a soft reset and wait to be polled. If after some time, the bus does not recover, the IOX should enter a low power state and wait to be woken.
Directed to all devices. Instructs all devices to reset and behave as if they have just powered up. IOXs should discard any setup information they might have received, de-assert hardware control lines, and open their relays.
Sent by the GO device in a broadcast fashion to all units to check if they are there.
Sent by an IOX when a poll is received. The ACK procedure must be obeyed. The first poll response after powerup (when Byte 0 Bit 0 is 1) contains all 8 bytes. All subsequent poll responses (when Byte 0 Bit 0 is 0) only contain the first byte.
Byte # | Byte description |
---|---|
0 - Bit 0 | 0 = Have been polled before. 1 = First poll response after reset. |
0 - Bit 1 | 0 = Not Going to Sleep. 1 = Going to Sleep. |
0 - Bit 2 | 0 = Normal reply. 1 = First poll response after wake up. |
0 - Bit 3-7 | Reserved |
The following bytes are sent only on first poll-response | |
1 | Firmware version major |
2 | Firmware version minor |
3-4 | 2 Most significant bytes of serial number. (Big-Endian) |
5 | Reset reason 0 = Power on reset 1 = Reset command 2 = New firmware All others reserved. |
6 | Reserved |
7 | 150 to 199 IOX ID. Please contact Geotab to get one assigned. |
When the "Go to Sleep" command is received, but before actually going to sleep, the devices will indicate they are going to sleep through the indicated bit. This bit is cleared on wakeup.
Sent by the IOX after an ACK for the first poll is received. This message is not strictly required for operation. However, sending of this message is required if any version information is to be reported, including: Product, Hardware, Firmware Major, Firmware Minor, or Version Control.
Byte # | Byte description |
---|---|
0-3 | Software version control number (ex: SVN version, Git SHA) |
4 | Product version |
5 | Reserved |
6 | Error condition 0 = No error 1 = Memory allocation error |
7 | Hardware version |
Wakes up all the IOXs from Sleep Mode. Is sent by the GO at least twice within a space of 50 ms. Currently the GO device sends this message 5 times with 10 ms intervals.
Sent by the GO to all IOXs when they should enter a low power consumption state. Devices will enter Sleep Mode no sooner than 2 seconds, and not more than 20 seconds, after receiving this command. In the meantime, they will report through the poll response that they are going to sleep. As noted in the Hardware Design Guide, it is recommended that the average current consumed during Sleep Mode should not exceed 2 mA at 12 V.
Data sent from the GO device to the addressed IOX. The contents of this payload may follow a higher level protocol structure such as MIME.
Byte # | Byte description |
---|---|
0-7 | Data to transmit |
Data sent from an IOX to the GO device. The GO will reply with an ACK. The contents of this payload may follow a higher level protocol structure such as MIME. The 0x0C message series start and end with a Information Type 1 - Packet Wrapper 0x25 message.
Byte # | Byte description |
---|---|
0-7 | Received data |
Sent by the GO to indicate that a message is being acknowledged. The ACK to an RX Data message (0x0C) could include 1 byte of data. This data is used for streaming flow control. When the 80% watermark of the receive buffer has been reached, the flow control bit will tell the IOX to hold off sending for 50 ms. The IOX will send the next frame at the end of this period and, depending on the flow control bit of the ACK, it will either continue sending or delay another 50 ms, thus repeating the process. The GO device will clear the flow control bit whenever the buffer is below the 20% watermark. If transferring data as part of a wrapped packet exchange, the streaming watermark can be ignored. The buffers will not overflow so long as the length limit and the modem result are honored. This byte is only sent when needed.
Byte # | Byte description |
---|---|
0 - Bit 0 | 0 = Clear to send more RX Data. 1 = Stop sending UART data. Buffer 80% full, withhold next frame 50 ms. |
1 - Bit 1-7 | Reserved |
Sent by the GO device after a packet wrapped passthrough message attempt to the server. A 'rejected' response from the modem typically means it is not connected. If the message is'accepted', this means it was added to the modem's TCP socket buffer. It is NOT a confirmation that the message was successfully sent.
Byte # | Byte description |
---|---|
0 | Log type |
1 | 0 = rejected 1 = accepted |
Sent from the IOX to the GO device when the IOX wants to create a log that can fit into a single CAN frame. Rate limit is 100 logs per 10 minutes, for each distinct data ID. If you exceed the rate limit, the GO device will stop taking data from the IOX.
Byte # | Byte description |
---|---|
0 | Log type |
1-7 | Data |
Used to request the GO log normal status data.
Data | Description |
---|---|
1-2 | Data ID |
3 | Data length |
4-7 | Data |
Used to request the GO log status data and also send via Iridium, if available.
Data | Description |
---|---|
1-2 | Data ID |
3 | Data length |
4-7 | Data |
Used to identify the service running on the IOX. Required to use the passthrough channel to communicate with MyGeotab.
Data | Description |
---|---|
1 | Connected = 1 Disconnected = 0 |
2-3 | External device ID |
4-5 | Connection flags |
Bits | Connection flags |
---|---|
0 | Reserved |
1 | Binary data packet wrapping |
2 - 15 | Reserved |
Binary Data Packet Wrapping: 0: The passthrough data from MyGeotab will be passed to the external device without modification. 1: The passthrough data from MyGeotab will be wrapped in a serial protocol before being sent to the external device. Note: If sending large payloads of variable sizes, it is recommended to use the binary wrapping flag to allow the device to distinguish and accommodate different packet sizes. The device should implement support for both 0x23 and 0x25 message formats as the GO will dynamically select which one to use based on the amount of data within each packet received from MyGeotab. The maximum packet size currently supported is 1000 bytes.
For payloads with a length of 0 - 255 bytes, this format is used:
Bytes | Position | |
---|---|---|
STX (0x02) | 1 | 0 |
Message type = 0x23 | 1 | 1 |
Message body length = x | 1 | 2 |
Binary data | x | 3 |
Checksum | 2 | 3+x |
ETX (0x03) | 1 | 5+x |
For payloads with a length of 256 - 1000 bytes, this format is used:
Bytes | Position | |
---|---|---|
STX (0x02) | 1 | 0 |
Message type = 0x25 | 1 | 1 |
Message body length = x | 2 | 2 |
Binary data | x | 4 |
Checksum | 2 | 4+x |
ETX (0x03) | 1 | 6+x |
More details on the checksum can be found here: Add-On Protocol - RS232 & USB
Typically used to log a fault condition that needs to be escalated to a supervisor for human intervention.
Data | Description |
---|---|
1-2 | Fault code |
3 | Fault = 1 Information = 0 |
4 | Log once per trip = 1 Log every fault = 0 |
Sent from the IOX to the GO device when the IOX wants create a log that cannot fit into a single CAN frame. The first frame contains the Type and Length. All frames start with a Frame Counter that is an incrementing sequence number. The first frame always starts with 0x00.
Byte # | Byte description |
---|---|
0 | Frame counter (0x00) |
1 | Log type |
2-3 | Data length |
4-7 | Data |
Byte # | Byte description |
---|---|
0 | Frame counter |
1-7 | Data |
Parameter type | Description |
---|---|
0 | Third party free format data |
1 | Reserved |
2 | Bluetooth record |
3-9 | Reserved |
10 | Driver ID |
11 | Curve logging |
12 | Logging with timestamp |
13 | Protobuf data |
The maximum size is 27 bytes. Rate limit is 500 logs per 10 minutes. If you exceed the rate limit, the GO device will stop taking data from the IOX.
Byte # | Byte description |
---|---|
0-27 | Data |
Rate limit is 1200 logs per 10 minutes. If you exceed the rate limit, the GO device will stop taking data from the IOX.
Byte # | Bluetooth record |
---|---|
0-6 | MAC address |
1 | Data type |
2 | FP24 value |
Further details can be found here: Add-On Protocol - BLE Advertisement
This message allows third-party devices to send the new Driver-ID for the current trip.
Byte # | Byte description |
---|---|
0-1 | Key Type (Little endian) = 0x0054 (Custom) |
2-8 | Driver Identification (Little endian) |
This message can be used to send the 4-byte (int32_t) data that is curve logged by the GO. Additional information about curve logging can be found here: Curve logging
Byte # | Curve logging |
---|---|
0 | Curve function |
1-2 | Status data ID |
3-7 | Data (signed 32bit) |
8 | Data length |
9-10 | Allowed error |
11-12 | Estimate error |
12-13 | Deprecated = 0 |
14 | Smoothing coefficient |
Parameter | Description |
---|---|
Curve function | 2 = Add point 3 = Save curve |
Allowed error | Vertical distance threshold (must be > 0). All points with their vertical distance > threshold are declared as significant points and saved. |
Estimate error | If EstimateError > 0 and the new point deviated from estimated value > EstimateError, we will reduce/save the curve. |
Smoothing coefficient | Applies a low pass filter to the data. 0 = No filtering 1-254 = Smoothing coefficient magnitude |
This message can be used to send status data with a timestamp. Possible use cases:
Byte # | Curve logging |
---|---|
0-1 | Status data ID |
2 | Data length |
3-6 | Data (unsigned 32bit) |
7 | Timestamp (# secs since 2002-01-01) |
8 | Milliseconds |
Supported from Add-On protocol version 1.2.
This message allows an IOX to send a protobuf-encoded payload to the GO device. It supports a publish/subscribe model of vehicle status information. The GO device responds with GO Multi-Frame Data (0x27) - Type 13. Protobuf Schema. The currently supported topics are:
Topic |
---|
TOPIC_GPS |
TOPIC_VIN |
TOPIC_GEAR |
TOPIC_ENGINE_SPEED |
TOPIC_ENGINE_LOAD |
TOPIC_ODOMETER |
TOPIC_ACCEL_PEDAL_PERCENTAGE |
TOPIC_COOLANT_TEMP |
TOPIC_DOC_INTAKE_GAS_TEMP |
TOPIC_DOC_OUTLET_GAS_TEMP |
TOPIC_FUELTANK1_UNITS |
TOPIC_FUELTANK2_UNITS |
TOPIC_FUELTANK1_PERCENT |
TOPIC_FUELTANK2_PERCENT |
TOPIC_STATE_OF_CHARGE |
TOPIC_ENGINE_ROAD_SPEED |
TOPIC_VEHICLE_ACTIVE |
TOPIC_DRIVER_SEATBELT |
TOPIC_LEFT_TURN_SIGNAL |
TOPIC_RIGHT_TURN_SIGNAL |
TOPIC_EV_CHARGING_STATE |
TOPIC_PARK_BRAKE |
TOPIC_ENGINE_RUN_TIME |
TOPIC_TRIP_ODOMETER |
TOPIC_DEVICE_POWER_CHANGE |
TOPIC_DEVICE_DATA_BUFFER |
Sent from an IOX to the GO device to request the buzzer beep with the given parameters.
Byte # | Byte description |
---|---|
0 | Number of beeps |
1 | Duration (multiple of 56ms) |
2 | Delay between beeps (multiple of 56ms) |
Sent from the IOX to the GO device to inform the GO device of events or status changes.
Byte # | Byte description |
---|---|
0-1 | Information type |
2-7 | Optional bytes that depend on the type |
This message indicates to the GO device that the issuing IOX is busy with a critical task and that the GO should not enter the sleep state. The IOX should send a message clearing the flags once it has completed its critical tasks.
Byte # | Description |
---|---|
0-1 | 0x0000 |
2 - Bit 0 | Busy, request GO stay awake |
2 - Bit 1 | Busy, request GO keep the modem active |
This is used to send a packet of up to 1023 bytes of binary data through the GO device to MyGeotab.
Use cases:
Byte # | Description |
---|---|
0-1 | 0x0001 |
2 | 0 = Beginning of data packet 1 = end of data packet |
This message is used by an IOX which requires vehicle information from the GO device. The GO device responds with a GO Multi-Frame Data (0x27) - Type 2 message.
Byte # | Description |
---|---|
0-1 | 0x0002 |
2 | Message version = 2 |
This message requests the GO modem initiate a connection to the server.
Byte # | Description |
---|---|
0-1 | 0x0003 |
2 | Unused |
An IOX uses this message to request the vehicle's VIN from the GO device. The GO device responds with a GO multi-frame Data (0x27) - Type 3 message.
Byte # | Description |
---|---|
0-1 | 0x0004 |
2 | Unused |
Supported from protocol version 1.1.
Sent from the IOX to the GO device requesting the identification information. The GO device responds with a GO Multi-Frame Data (0x27) - Type 12 message.
Byte # | Description |
---|---|
0-1 | 0x000C |
2 | Request info: 0 = GO serial number 1 = GO firmware version 2 = IOX protocol version |
Sent from the GO device to the IOX to pass information the IOX may need. This is a broadcast message. It is sent once any corresponding information type changes.
Byte # | Byte description |
---|---|
0-1 | Information type |
2-7 | Optional bytes that depend on the type |
Byte # | Description |
---|---|
0-1 | 0x0000 |
2 | 0 = Ignition Off 1 = Ignition on |
Byte # | Description |
---|---|
0-1 | 0x0000 |
2 | 0 = modem is not ready 1 = modem is available |
Supported from Add-On protocol version 1.3. This notification is sent when the GO needs to suspend normal operation of the IOX protocol. This situation can occur when the GO is performing or facilitating a firmware update. During this time, the GO might not supply power, issue polls or ACK messages as normal. When normal operation is resumed, the wakeup sequence will be issued followed by a poll.
Byte # | Description |
---|---|
0-1 | 0x0000 |
2 | 1 - Normal operation suspended |
Sent from the GO device to the IOX when the GO device wants to transfer data that does not fit into a single CAN frame. The first frame contains the Type and Length. All frames start with a Frame Counter that is an incrementing sequence number. The first frame always starts with 0x00.
Byte # | Byte description |
---|---|
0 | Frame counter (0x00) |
1 | Info type |
2-3 | Data length |
4-7 | Data |
Byte # | Byte description |
---|---|
0 | Frame counter |
1-7 | Data |
Parameter type | Description |
---|---|
0 | Reserved |
1 | Reserved |
2 | GO device data packet |
3 | VIN |
4-11 | Reserved |
12 | GO info |
13 | Protobuf data |
Sent in response to an IOX Request(0x25) message with a type request GO device data message (0x02).
Bytes | GO device data |
---|---|
0-3 | Timestamp (# secs since 2002-01-01) |
4-7 | Latitude (1E-7 deg/bit) |
8-11 | Longitude (1E-7 deg/bit) |
12 | Road speed (km/hr) |
13-14 | RPM (0.25/bit) |
15-18 | Odometer (0.1 km/bit) |
19 | Status flags (from LSB): 1st bit: 1 = GPS valid 2nd bit: 1 = ignition On 3rd bit: 1 = engine bus activity 4th bit: 1 = date/time valid 5th bit: 1 = speed from engine 6th bit: 1 = odometer from engine |
20-23 | Trip odometer (0.1 km/bit) |
24-27 | Total engine hours (0.1 hours/bit) |
28-31 | Trip duration (1 second/bit) |
32-35 | Deprecated |
36-39 | Driver ID |
40-51 | GO device serial number |
Sent in response to an IOX request(0x25) message with type request VIN (0x04).
Bytes | GO device data |
---|---|
0-16 | VIN |
Supported from protocol version 1.1. Sent in response to IOX Request/Status (0x25) - Type 12.
Byte | Byte description |
---|---|
0 | = 0 for payload is GO serial number. |
1-12 | GO serial number |
13 | 0 |
Byte | Byte description |
---|---|
0 | = 1 for payload is GO firmware version number |
1-2 | GO firmware version: Product |
3-4 | GO firmware version: Major |
5-6 | GO firmware version: Minor |
Byte | Byte description |
---|---|
0 | = 2 for payload is IOX protocol version number |
1-2 | GO firmware version: Major |
3-4 | GO firmware version: Minor |
Supported from protocol version 1.2.
This message allows a GO device to send a protobuf-encoded payload to the IOX. It supports a publish/subscribe model of vehicle status information. It is a response to GO Multi-Frame Data (0x1E) - Type 13. Protobuf Schema.