Difference between revisions of "Codec"

From Wiki Knowledge Base | Teltonika GPS
 
(92 intermediate revisions by 24 users not shown)
Line 1: Line 1:
 +
='''<big>Introduction</big>'''=
 +
A codec is a device or computer program for encoding or decoding a digital data stream or signal. Codec is a portmanteau of coder – decoder. A codec encodes a data stream or a signal for transmission and storage, possibly in encrypted form, and the decoder function reverses the encoding for playback or editing. <br> <br>
 +
Below you will see a table of all Codec types with ID’s:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec 8
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec 8 Extended
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec 16
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec 12
 +
! colspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec 13
 +
! rowspan="1" style="width:14%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec 14
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |0x08
 +
| style="vertical-align: middle; text-align: center;" |0x8E
 +
| style="vertical-align: middle; text-align: center;" |0x10
 +
| style="vertical-align: middle; text-align: center;" |0x0C
 +
| style="vertical-align: middle; text-align: center;" |0x0D
 +
| style="vertical-align: middle; text-align: center;" |0x0E
 +
|-
 +
|}
 +
Also, there are using two data transport protocols: TCP and UDP. But it is not important which one will be used in Codec.
  
== <big>Introduction</big> ==
+
='''<big>Codec for device data sending</big>'''=
A codec is a device or computer program for encoding or decoding a digital data stream or signal. Codec is a portmanteau of coder-decoder.
+
In this chapter you will find information about every Codec protocol which are using for device data sending and differences between them.
A codec encodes a data stream or a signal for transmission and storage, possibly in encrypted form, and the decoder function reverses the encoding for playback or editing.
 
  
 +
=='''<big>Codec 8</big>'''==
  
 +
*'''<big>Protocol Overview</big>'''
  
Codec ID table
+
Codec8 – a main FM device protocol that is used for sending data to server. <br>
{| class="wikitable"
 
|-
 
! style="background: black; color: white;"| Codec 8
 
! style="background: black; color: white;"| Codec 8 extended
 
! style="background: black; color: white;"| Codec 12
 
! style="background: black; color: white;"| Codec 13
 
! style="background: black; color: white;"| Codec 16
 
|-
 
| 0x08 || 0x8E || 0x0C || 0x0D || 0x10
 
|}
 
  
== <big>Codec 8</big> ==
+
*'''<big>Codec 8 protocol sending over TCP</big>'''
  
*''AVL data packet''
+
TCP is a connection-oriented protocol that is used for communication between devices. The workings of this type of protocol is described below in the '''communication with server''' section. <br>
Because the smallest information amount that can be written is one bit, there can be some bits left unused when result is byte array. Any unused bits should be left blank.
 
  
Below table represents AVL data packet structure.
+
*'''AVL Data Packet'''
  
 
+
Below table represents AVL Data Packet structure:
{| class="wikitable"
+
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |0x00000000 (Preamble)
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Data Field Length
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec ID
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Number of Data 1
 +
! colspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data
 +
! rowspan="1" style="width:14%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Number of Data 2
 +
! rowspan="1" style="width:14%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |CRC-16
 
|-
 
|-
! style="background: black; color: white;"| 4 zeros 
+
| style="vertical-align: middle; text-align: center;" |4 bytes
! style="background: black; color: white;"| Data field length
+
| style="vertical-align: middle; text-align: center;" |4 bytes
! style="background: black; color: white;"| Codec ID
+
| style="vertical-align: middle; text-align: center;" |1 byte
! style="background: black; color: white;"| Number of Data 1  
+
| style="vertical-align: middle; text-align: center;" |1 byte
! style="background: black; color: white;"| AVL Data
+
| style="vertical-align: middle; text-align: center;" |X bytes
! style="background: black; color: white;"| Number of Data 2
+
| style="vertical-align: middle; text-align: center;" |1 byte
! style="background: black; color: white;"| CRC-16
+
| style="vertical-align: middle; text-align: center;" |4 bytes
 
|-
 
|-
| 4 bytes || 4 bytes || 1 byte || 1 byte || 30-147 bytes || 1 byte || 4 bytes
 
 
|}
 
|}
  
Number of data – number of encoded data (number of records).
 
Codec ID is constant 08.
 
  
Data field length is the length of bytes [codec id, number of data 2].
+
'''Preamble''' – the packet starts with four zero bytes. <br>
Number of data 1 should always be equal to number of data 2 byte.
+
'''Data Field Length''' – size is calculated starting from Codec ID to Number of Data 2. <br>
CRC-16 is 4 bytes, but first two are zeroes and last two are CRC-16 calculated for [codec id, number of data 2]
+
'''Codec ID''' – in Codec8 it is always <code>0x08</code>. <br>
Minimum AVL packet size is 45 bytes (all IO elements disabled).
+
'''Number of Data 1''' – a number which defines how many records is in the packet. <br>
Maximum AVL packet size for one record is 783 bytes.
+
'''AVL Data''' – actual data in the packet (more information below). <br>
 +
'''Number of Data 2''' – a number which defines how many records is in the packet. This number must be the same as “Number of Data 1”. <br>
 +
'''CRC-16''' – calculated from Codec ID to the Second Number of Data. CRC (Cyclic Redundancy Check) is an error-detecting code using for detect accidental changes to RAW data. For calculation we are using [[Codec#CRC-16|CRC-16/IBM]].<br> <br>
 +
'''Note:''' for [[FMB630]], [[FMB640]] and [[FM6300|FM63XY]], minimum AVL record size is 45 bytes (all IO elements disabled). Maximum AVL record size is 255 bytes. Maximum AVL packet size is 512 bytes. For other devices, minimum AVL record size is 45 bytes (all IO elements disabled). Maximum AVL packet size is 1280 bytes. <br>
  
 +
*AVL Data
  
*''AVL data''
+
Below table represents AVL Data structure.
 
+
{| class="nd-othertables_2" style="width:100%;"
{| class="wikitable"
+
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Timestamp
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Priority
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |GPS Element
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |IO Element
 
|-
 
|-
! style="background: black; color: white;"| Timestamp
+
| style="vertical-align: middle; text-align: center;" |8 bytes
! style="background: black; color: white;"| Priority
+
| style="vertical-align: middle; text-align: center;" |1 byte
! style="background: black; color: white;"| GPS Element
+
| style="vertical-align: middle; text-align: center;" |15 bytes
! style="background: black; color: white;"| IO element
+
| style="vertical-align: middle; text-align: center;" |X bytes
 
|-
 
|-
| 8 bytes || 1 byte || 15 bytes || 6-123
 
 
|}
 
|}
  
  
Timestamp – difference, in milliseconds, between the current time and midnight, January 1, 1970 UTC
+
'''Timestamp''' a difference, in milliseconds, between the current time and midnight, January, 1970 UTC (UNIX time). <br>
 +
'''Priority''' – field which define AVL data priority (more information below). <br>
 +
'''GPS Element''' – location information of the AVL data (more information below). <br>
 +
'''IO Element''' – additional configurable information from device (more information below). <br>
  
*''Priority''
+
*Priority
  
 
+
Below table represents Priority values. Packet priority depends on device configuration and records sent.
{| class="wikitable"
+
{| class="nd-othertables_2" style="width:25%;"
 +
|+
 +
! colspan="2" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Priority
 
|-
 
|-
 
+
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |0
 +
| style="vertical-align: middle; text-align: center;" |Low
 
|-
 
|-
| style="background: black; color: white;"|0 || Low
+
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |1
 +
| style="vertical-align: middle; text-align: center;" |High
 
|-
 
|-
| style="background: black; color: white;"|1 || High
+
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |2
|-
+
| style="vertical-align: middle; text-align: center;" |Panic
| style="background: black; color: white;"|2 || Panic
+
|}<br />
|}
 
  
 +
*GPS element
  
*''GPS Element''
+
Below table represents GPS Element structure:
 
+
{| class="nd-othertables_2" style="width:100%;"
 
+
|+
{| class="wikitable"
+
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Longitude
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Latitude
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Altitude
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Angle
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Satellites
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Speed
 
|-
 
|-
! style="background: black; color: white;"| Longtitude
+
| style="vertical-align: middle; text-align: center;" |4 bytes
! style="background: black; color: white;"| Latitude
+
| style="vertical-align: middle; text-align: center;" |4 bytes
! style="background: black; color: white;"| Alitude
+
| style="vertical-align: middle; text-align: center;" |2 bytes
! style="background: black; color: white;"| Angle
+
| style="vertical-align: middle; text-align: center;" |2 bytes
! style="background: black; color: white;"| Stellites
+
| style="vertical-align: middle; text-align: center;" |1 byte
! style="background: black; color: white;"| Speed
+
| style="vertical-align: middle; text-align: center;" |2 bytes
 
|-
 
|-
| 4 bytes || 4 bytes || 2 bytes || 2 bytes || 1 bytes || 2 bytes
 
 
|}
 
|}
  
X Longitude
 
  
Y Latitude1
+
'''Longitude''' – east – west position. <br>
 +
'''Latitude''' – north – south position. <br>
 +
'''Altitude''' – meters above sea level. <br>
 +
'''Angle''' – degrees from north pole. <br>
 +
'''Satellites''' – number of visible satellites. <br>
 +
'''Speed''' – speed calculated from satellites. <br> <br>
 +
'''Note:''' If record are without valid coordinates – (there were no GPS fix in the moment of data acquisition) – Longitude, Latitude and Altitude values are last valid fix, and Angle, Satellites and Speed are 0. <br> <br>
 +
Longitude and latitude are integer values built from degrees, minutes, seconds and milliseconds by formula: <br>
 +
[[Image:GPS.png]]
 +
<br>
 +
Where: <br>
 +
d – Degrees; m – Minutes; s – Seconds; ms – Milliseconds; p – Precision (10000000) <br>
 +
If longitude is in west or latitude in south, multiply result by –1. <br> <br>
 +
Note: <br>
 +
To determine if the coordinate is negative, convert it to binary format and check the very first bit. If it is 0, coordinate is positive, if it is 1, coordinate is negative. <br> <br>
 +
Example: <br>
 +
Received value: <code>20 9C CA 80</code> converted to BIN: <code>00100000 10011100 11001010 10000000</code> first bit is 0, which means coordinate is positive converted to DEC: <code>547146368</code>. For more information see two‘s complement arithmetic. <br>
  
Altitude In meters above sea level1
+
*IO Element
  
Angle In degrees, 0 is north, increasing clock-wise 1
+
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |Event IO ID
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| rowspan="26" style=" width:5%; vertical-align: middle; text-align: left;" |
 +
| rowspan="26" style=" width:65%; vertical-align: middle; text-align: left;" |'''Event IO ID''' – if data is acquired on event – this field defines which IO property has changed and generated an event. For example, when if Ignition state changed and it generate event, Event IO ID will be <code>0xEF</code> (AVL ID: 239). If it’s not eventual record – the value is 0. <br>
 +
'''N''' – a total number of properties coming with record (N = N1 + N2 + N4 + N8). <br>
 +
'''N1''' – number of properties, which length is 1 byte. <br>
 +
'''N2''' – number of properties, which length is 2 bytes. <br>
 +
'''N4''' – number of properties, which length is 4 bytes. <br>
 +
'''N8''' – number of properties, which length is 8 bytes. <br>
 +
'''N’th IO ID''' - AVL ID. <br>
 +
'''N’th IO Value''' - AVL ID value. <br>
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N of Total IO
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N1 of One Byte IO
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
| colspan="2" style="vertical-align: middle; text-align: center;" |...
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N1’th IO ID
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N1’th IO Value
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N2 of Two Bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
| colspan="2" style="vertical-align: middle; text-align: center;" |...
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N2’th IO ID
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N2’th IO Value
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N4 of Four Bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
|-
 +
| colspan="2" style="vertical-align: middle; text-align: center;" |...
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N4’th IO ID
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N4’th IO Value
 +
| style="vertical-align: middle; text-align: center;" |4 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N8 of Eight Bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |8 byte
 +
|-
 +
| colspan="2" style="vertical-align: middle; text-align: center;" |...
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N8’IO ID
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N8’IO Value
 +
| style="vertical-align: middle; text-align: center;" |8 bytes
 +
|-
 +
|} <br />
  
Satellites Number of visible satellites1
+
*'''Communication with server'''
  
Speed Speed in km/h. 0x0000 if GPS data is invalid1
+
First, when module connects to server, module sends its IMEI. First comes short identifying number of bytes written and then goes IMEI as text (bytes). <br>
 +
For example, IMEI <code>356307042441013</code> would be sent as <code>000F333536333037303432343431303133</code>. <br>
 +
First two bytes denote IMEI length. In this case <code>0x000F</code> means, that IMEI is 15 bytes long. <br>
 +
After receiving IMEI, server should determine if it would accept data from this module. If yes, server will reply to module <code>01</code>, if not - <code>00</code>. Note that confirmation should be sent as binary packet. I.e. 1 byte <code>0x01</code> or <code>0x00</code>. <br>
 +
Then module starts to send first AVL data packet. After server receives packet and parses it, server must report to module number of data received as integer (four bytes). <br>
 +
If sent data number and reported by server doesn’t match module resends sent data. <br>
  
Longitude and latitude are integer values built from degrees, minutes, seconds and milliseconds by formula
+
*Example:  <br>
  
[[Image:197.png]]
+
Module connects to server and sends IMEI: <br>
 +
<code>000F333536333037303432343431303133</code> <br>
 +
Server accepts the module: <br>
 +
01 <br>
 +
Module sends data packet:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data Packet Header
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data Array
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |CRC-16
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Four Zero Bytes – 0x00000000,
 +
“AVL Data Array” length – 0x000000FE
 +
| style="vertical-align: middle; text-align: center;" |Codec ID – 0x08,
 +
Number of Data – '''0x02''' <br>
 +
(Encoded using continuous bit stream. Last byte padded to align to byte boundary)
 +
| style="vertical-align: middle; text-align: center;" |CRC of “AVL Data Array”
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |00000000000000FE
 +
| style="vertical-align: middle; text-align: center;" |08'''02'''...(data elements)...'''02'''
 +
| style="vertical-align: middle; text-align: center;" |00008612
 +
|-
 +
|}
  
d - Degrees
 
  
m - Minutes
+
Server acknowledges data reception (2 data elements): '''<code>00000002</code>''' <br>
  
s - Seconds
+
*'''Examples'''
  
ms - Milliseconds
+
Hexadecimal stream of AVL Data Packet receiving and response in these examples are given in hexadecimal form. The different fields of packets are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding. <br>
  
p - Precision (10000000)
+
'''1'st example''' <br>
 +
Receiving one data record with each element property (1 byte, 2 bytes, 4 byte and 8 byte). <br> <br>
 +
Received data in hexadecimal stream: <br>
 +
<code>000000000000003608010000016B40D8EA30010000000000000000000000000000000105021503010101425E0F01F10000601A014E0000000000000000010000C7CF</code> <br> <br>
 +
Parsed:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="3" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data Packet
 +
|-
 +
! colspan="2" rowspan="1" style="width:60%; vertical-align: middle; text-align: center;" |AVL Data Packet Part
 +
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |HEX Code Part
 +
|-
 +
| rowspan="4" style="vertical-align: middle; text-align: center;" |
 +
| style="vertical-align: middle; text-align: center;" |Zero Bytes
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Data Field Length
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 36
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |08
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Number of Data 1 (Records)
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| rowspan="24" style="vertical-align: middle; text-align: center;" |AVL Data
 +
| style="vertical-align: middle; text-align: center;" |Timestamp
 +
| style="vertical-align: middle; text-align: center;" |00 00 01 6B 40 D8 EA 30 (GMT: Monday, June 10, 2019 10:04:46 AM)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Priority
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Longitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Latitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Altitude
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Angle
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Satellites
 +
| style="vertical-align: middle; text-align: center;" |00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Speed
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Event IO ID
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N of Total ID
 +
| style="vertical-align: middle; text-align: center;" |05
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N1 of One Byte IO
 +
| style="vertical-align: middle; text-align: center;" |02
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |15 (AVL ID: 21, Name: GSM Signal)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |03
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |2’nd IO ID
 +
| style="vertical-align: middle; text-align: center;" |01 (AVL ID: 1, Name: DIN1)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |2’nd IO Value
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N2 of Two Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |42 (AVL ID: 66, Name: External Voltage)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |5E 0F
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N4 of Four Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |F1 (AVL ID: 241, Name: Active GSM Operator)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |00 00 60 1A
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N8 of Eight Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |4E (AVL ID: 78, Name: iButton)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00 00 00 00 00
 +
|-
 +
| rowspan="2" style="vertical-align: middle; text-align: center;" |
 +
| style="vertical-align: middle; text-align: center;" |Number of Data 2 (Number of Total Records)
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |CRC-16
 +
| style="vertical-align: middle; text-align: center;" |00 00 C7 CF
 +
|-
 +
|}
  
If longitude is in west or latitude in south, multiply result by –1. To determine if the coordinate is negative, convert it to binary format and check the very first bit. If it is 0, coordinate is positive, if it is 1, coordinate is negative.
 
  
Example:
+
Server response: <code>00000001</code> <br>
 
Received value: 20 9c ca 80
 
Converted to BIN: 00100000 10011100 11001010 10000000 first bit is 0, which means coordinate is positive
 
Convered to DEC: 547146368
 
For more information see two‘s compliment arithmetics.
 
  
 
+
'''2'nd example''' <br>
*''IO Element''
+
Receiving one data record with one or two different element properties (1 byte, 2 byte). <br> <br>
 
+
Received data in hexadecimal stream: <br>
{| class="wikitable"
+
<code>000000000000002808010000016B40D9AD80010000000000000000000000000000000103021503010101425E100000010000F22A</code> <br> <br>
 +
Parsed:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="3" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data Packet
 +
|-
 +
! colspan="2" rowspan="1" style="width:60%; vertical-align: middle; text-align: center;" |AVL Data Packet Part
 +
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |HEX Code Part
 +
|-
 +
| rowspan="4" style="vertical-align: middle; text-align: center;" |
 +
| style="vertical-align: middle; text-align: center;" |Zero Bytes
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 
|-
 
|-
 
+
| style="vertical-align: middle; text-align: center;" |Data Field Length
| style="background: black; color: white;"|Event IO ID || 1 byte
+
| style="vertical-align: middle; text-align: center;" |00 00 00 28
 
|-
 
|-
| style="background: black; color: white;"|N of Total IO || 1 byte
+
| style="vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |08
 
|-
 
|-
| style="background: black; color: white;"|N1 of One Byte IO || 1 byte
+
| style="vertical-align: middle; text-align: center;" |Number of Data 1 (Records)
 +
| style="vertical-align: middle; text-align: center;" |01
 
|-
 
|-
| style="background: black; color: white;"|1’st  IO ID || 1 byte
+
| rowspan="20" style="vertical-align: middle; text-align: center;" |AVL Data
 +
| style="vertical-align: middle; text-align: center;" |Timestamp
 +
| style="vertical-align: middle; text-align: center;" |00 00 01 6B 40 D9 AD 80 (GMT: Monday, June 10, 2019 10:05:36 AM)
 
|-
 
|-
| style="background: black; color: white;"|1’st IO Value || 1 byte
+
| style="vertical-align: middle; text-align: center;" |Priority
 +
| style="vertical-align: middle; text-align: center;" |01
 
|-
 
|-
| ... ||
+
| style="vertical-align: middle; text-align: center;" |Longitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 
|-
 
|-
| style="background: black; color: white;"|N1’th  IO ID || 1 byte
+
| style="vertical-align: middle; text-align: center;" |Latitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 
|-
 
|-
| style="background: black; color: white;"|N1’th IO Value || 1 byte
+
| style="vertical-align: middle; text-align: center;" |Altitude
 +
| style="vertical-align: middle; text-align: center;" |00 00
 
|-
 
|-
| style="background: black; color: white;"|N2 of Two Bytes || 1 byte
+
| style="vertical-align: middle; text-align: center;" |Angle
 +
| style="vertical-align: middle; text-align: center;" |00 00
 
|-
 
|-
| style="background: black; color: white;"|1’st  IO ID || 1 byte
+
| style="vertical-align: middle; text-align: center;" |Satellites
 +
| style="vertical-align: middle; text-align: center;" |00
 
|-
 
|-
| style="background: black; color: white;"|1’st IO Value || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |Speed
 +
| style="vertical-align: middle; text-align: center;" |00 00
 
|-
 
|-
| |... ||  
+
| style="vertical-align: middle; text-align: center;" |Event IO ID
 +
| style="vertical-align: middle; text-align: center;" |01
 
|-
 
|-
| style="background: black; color: white;"|N2’th  IO ID || 1 byte
+
| style="vertical-align: middle; text-align: center;" |N of Total ID
 +
| style="vertical-align: middle; text-align: center;" |03
 
|-
 
|-
| style="background: black; color: white;"|N2’th IO Value || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |N1 of One Byte IO
 +
| style="vertical-align: middle; text-align: center;" |02
 
|-
 
|-
| style="background: black; color: white;"|N4 of Four Bytes || 1 byte
+
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |15 (AVL ID: 21, Name: GSM Signal)
 
|-
 
|-
| style="background: black; color: white;"|1’st IO ID || 1 byte
+
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |03
 
|-
 
|-
| style="background: black; color: white;"|1’st IO Value || 4 byte
+
| style="vertical-align: middle; text-align: center;" |2’nd IO ID
 +
| style="vertical-align: middle; text-align: center;" |01 (AVL ID: 1, Name: DIN1)
 
|-
 
|-
| |... ||  
+
| style="vertical-align: middle; text-align: center;" |2’nd IO Value
 +
| style="vertical-align: middle; text-align: center;" |01
 
|-
 
|-
| style="background: black; color: white;"|N4’th  IO ID || 1 byte
+
| style="vertical-align: middle; text-align: center;" |N2 of Two Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |01
 
|-
 
|-
| style="background: black; color: white;"|N4’th IO Value || 4 bytes
+
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |42 (AVL ID: 66, Name: External Voltage)
 
|-
 
|-
| style="background: black; color: white;"|N8 of Eight Bytes || 1 byte
+
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |5E 10
 
|-
 
|-
| style="background: black; color: white;"|1’st  IO ID || 1 byte
+
| style="vertical-align: middle; text-align: center;" |N4 of Four Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00
 
|-
 
|-
| style="background: black; color: white;"|1’st IO Value || 8 bytes
+
| style="vertical-align: middle; text-align: center;" |N8 of Eight Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00
 
|-
 
|-
| |... ||  
+
| rowspan="2" style="vertical-align: middle; text-align: center;" |
 +
| style="vertical-align: middle; text-align: center;" |Number of Data 2 (Number of Total Records)
 +
| style="vertical-align: middle; text-align: center;" |01
 
|-
 
|-
| style="background: black; color: white;"|N8’th  IO ID || 1 byte
+
| style="vertical-align: middle; text-align: center;" |CRC-16
 +
| style="vertical-align: middle; text-align: center;" |00 00 F2 2A
 
|-
 
|-
| style="background: black; color: white;"|N8’th IO Value || 8 bytes
+
|}  
|}
 
Event IO ID – if data is acquired on event – this field defines which IO property has changed and generated an event. If data cause is not event – the value is 0.
 
  
N total number of properties coming with record (N=N1+N2+N4+N8)
 
  
N1 number of properties, which length is 1 byte
+
Server response: <code>00000001</code> <br>
  
N2 number of properties, which length is 2 bytes
+
'''3'rd example''' <br>
 +
Receiving two or more data records with one or more different element properties. <br> <br>
 +
Received data in hexadecimal stream: <br>
 +
<code>000000000000004308020000016B40D57B480100000000000000000000000000000001010101000000000000016B40D5C198010000000000000000000000000000000
 +
101010101000000020000252C</code> <br> <br>
 +
Parsed:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="3" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data Packet
 +
|-
 +
! colspan="2" rowspan="1" style="width:60%; vertical-align: middle; text-align: center;" |AVL Data Packet Part
 +
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |HEX Code Part
 +
|-
 +
| rowspan="4" style="vertical-align: middle; text-align: center;" |
 +
| style="vertical-align: middle; text-align: center;" |Zero Bytes
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Data Field Length
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 43
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |08
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Number of Data 1 (Records)
 +
| style="vertical-align: middle; text-align: center;" |02
 +
|-
 +
| rowspan="16" style="vertical-align: middle; text-align: center;" |AVL Data
 +
(1'st record)
 +
| style="vertical-align: middle; text-align: center;" |Timestamp
 +
| style="vertical-align: middle; text-align: center;" |00 00 01 6B 40 D5 7B 48 (GMT: Monday, June 10, 2019 10:01:01 AM)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Priority
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Longitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Latitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Altitude
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Angle
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Satellites
 +
| style="vertical-align: middle; text-align: center;" |00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Speed
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Event IO ID
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N of Total ID
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N1 of One Byte IO
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |01 (AVL ID: 1, Name: DIN1)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N2 of Two Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N4 of Four Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N8 of Eight Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00
 +
|-
 +
| rowspan="16" style="vertical-align: middle; text-align: center;" |AVL Data
 +
(2'nd record)
 +
| style="vertical-align: middle; text-align: center;" |Timestamp
 +
| style="vertical-align: middle; text-align: center;" |00 00 01 6B 40 D5 C1 98 (GMT: Monday, June 10, 2019 10:01:19 AM)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Priority
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Longitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Latitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Altitude
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Angle
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Satellites
 +
| style="vertical-align: middle; text-align: center;" |00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Speed
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Event IO ID
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N of Total ID
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N1 of One Byte IO
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |01 (AVL ID: 1, Name: DIN1)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N2 of Two Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N4 of Four Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N8 of Eight Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00
 +
|-
 +
| rowspan="2" style="vertical-align: middle; text-align: center;" |
 +
| style="vertical-align: middle; text-align: center;" |Number of Data 2 (Number of Total Records)
 +
| style="vertical-align: middle; text-align: center;" |02
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |CRC-16
 +
| style="vertical-align: middle; text-align: center;" |00 00 25 2C
 +
|-
 +
|}
  
N4 number of properties, which length is 4 bytes
 
  
N8 number of properties, which length is 8 bytes
+
Server response: <code>00000002</code> <br>
  
 +
*'''<big>Codec8 protocol sending over UDP</big>'''
  
'''Example'''
+
Codec8 protocol over UDP is a transport layer protocol above UDP/IP to add reliability to plain UDP/IP using acknowledgment packets. <br>
  
Received data:
+
*'''AVL Data Packet'''
  
[[Image:Treciad.png|Treciad.png]]
+
The packet structure is as follows:  
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="2" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |UDP Datagram
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Example
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Packet ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Not Usable Byte
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Packet Payload
 +
| style="vertical-align: middle; text-align: center;" |Variable
 +
|-
 +
|}
  
00000000 4 zeroes, 4 bytes
 
  
0000008c data length, 4 bytes
+
'''Example''' – packet length (excluding this field) in big ending byte order. <br>
 +
'''Packet ID''' – packet ID unique for this channel. <br>
 +
'''Not Usable Byte''' – not usable byte. <br>
 +
'''Packet payload''' – data payload. <br>
  
08 – Codec ID
+
*Acknowledgment packet
  
0- Number of Data (1 record)
+
Acknowledgment packet should have the same Packet ID as acknowledged data packet and empty Data Payload. Acknowledgement should be sent in binary format.
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="3" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Acknowledgment Packet
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |Packet Length
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |Packet ID
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |Not Usable Byte
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
|}
  
1’st record data
 
  
0000013feb55ff74 Timestamp in milliseconds (1374042849140)
+
'''Packet Length''' packet length by sending/response data. <br>
 +
'''Packet ID''' – same as in acknowledgment packet. <br>
 +
'''Not Usable Byte''' – always will be <code>0x01</code>. <br>
  
GMT: Wed, 17 Jul 2013 06:34:09 GMT
+
*Sending AVL Packet Payload using UDP channel
  
00 Priority
+
Below table represents Sending Packet Payload structure.
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="4" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL data encapsulated in UDP channel packet
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |AVL Packet ID
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |IMEI Length
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |Module IMEI
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |AVL Data Array
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
| style="vertical-align: middle; text-align: center;" |15 bytes
 +
| style="vertical-align: middle; text-align: center;" |X bytes
 +
|-
 +
|}
 +
'''AVL Packet ID''' ID identifying this AVL packet. <br>
 +
'''IMEI Length''' – always will be <code>0x000F</code>. <br>
 +
'''Module IMEI''' – IMEI of a sending module encoded the same as with TCP. <br>
 +
'''AVL Data Array''' – array of encoded AVL data (same as TCP AVL Data Array). <br>
  
GPS Element
+
*Server response Packet Payload using UDP channel
  
0f0ea850 – Longitude 252618832 = 25,2618832º N
+
Below table represents Server Response Packet Payload structure.
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="2" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Server Response to AVL Data Packet
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |AVL Packet ID
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |Number of Accepted AVL Elements
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
|} <br />
  
209a6900 – Latitude 546990336 = 54,6990336 º E
+
*'''Communication with server'''
  
0094 – Altitude 148 meters
+
Module sends UDP channel packet with encapsulated AVL data packet. Server sends UDP channel packet with encapsulated response module validates AVL Packet ID and Number of accepted AVL elements. If server response with valid AVL Packet ID is not received within configured timeout, module can retry sending. <br>
  
0 – Angle 214º
+
*Example:
  
0 12 Visible sattelites
+
Module sends the data:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |UDP Channel Header
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Packet Header
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data Array
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Length 0x00FE,
 +
Packet ID – 0xCAFE <br>
 +
Not Usable Byte – 0x01
 +
| style="vertical-align: middle; text-align: center;" |AVL Packet ID – 0xDD,
 +
IMEI Length – 0x000F <br>
 +
IMEI – 0x313233343536373839303132333435
 +
(Encoded using continuous bit stream. Last byte padded to align to byte boundary)
 +
| style="vertical-align: middle; text-align: center;" |Codec ID – 0x08,
 +
Number of Data – 0x02 <br>
 +
(Encoded using continuous bit stream)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |00FECAFE01
 +
| style="vertical-align: middle; text-align: center;" |DD000F3133343536373839303132333435
 +
| style="vertical-align: middle; text-align: center;" |0802…(data elements)…02
 +
|-
 +
|}
  
0 – 0 km/h speed
 
  
IO Element
+
Server must respond with acknowledgment:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |UDP Channel Header
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Packet Acknowledgment
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Length – 0x0005,
 +
Packet ID – 0xCAFE,
 +
Not Usable Byte – 0x01
 +
| style="vertical-align: middle; text-align: center;" |AVL Packet ID – 0xDD,
 +
Number of Accepted Data – 0x02
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |0005CAFE01
 +
| style="vertical-align: middle; text-align: center;" |DD02
 +
|-
 +
|}<br />
  
00 – IO element ID of Event generated (in this case when 00 – data generated not on event)
+
*'''Example'''
  
1e – 30 IO elements in record (total)
+
Hexadecimal stream of AVL Data Packet receiving and response in this example are given in hexadecimal form. The different fields of packet are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding. <br> <br>
 +
Received data in hexadecimal stream: <br>
 +
<code>003DCAFE0105000F33353230393330383634303336353508010000016B4F815B30010000000000000000000000000000000103021503010101425DBC000001</code> <br> <br>
 +
Parsed:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="3" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data Packet
 +
|-
 +
! colspan="2" rowspan="1" style="width:60%; vertical-align: middle; text-align: center;" |AVL Data Packet Part
 +
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |HEX Code Part
 +
|-
 +
| rowspan="3" style="vertical-align: middle; text-align: center;" |UDP Channel Header
 +
| style="vertical-align: middle; text-align: center;" |Length
 +
| style="vertical-align: middle; text-align: center;" |00 3D
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Packet ID
 +
| style="vertical-align: middle; text-align: center;" |CA FE
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Not usable byte
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| rowspan="3" style="vertical-align: middle; text-align: center;" |AVL Packet Header
 +
| style="vertical-align: middle; text-align: center;" |AVL packet ID
 +
| style="vertical-align: middle; text-align: center;" |05
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |IMEI Length
 +
| style="vertical-align: middle; text-align: center;" |00 0F
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |IMEI
 +
| style="vertical-align: middle; text-align: center;" |33 35 32 30 39 33 30 38 36 34 30 33 36 35 35
 +
|-
 +
| rowspan="23" style="vertical-align: middle; text-align: center;" |AVL Data Array
 +
| style="vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |08
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Number of Data 1 (Records)
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Timestamp
 +
| style="vertical-align: middle; text-align: center;" |00 00 01 6B 4F 81 5B 30 (GMT: Thursday, June 13, 2019 6:23:26 AM)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Priority
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Longitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Latitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Altitude
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Angle
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Satellites
 +
| style="vertical-align: middle; text-align: center;" |00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Speed
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Event IO ID
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N of Total ID
 +
| style="vertical-align: middle; text-align: center;" |03
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N1 of One Byte IO
 +
| style="vertical-align: middle; text-align: center;" |02
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |15 (AVL ID: 21, Name: GSM Signal)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |03
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |2’nd IO ID
 +
| style="vertical-align: middle; text-align: center;" |01 (AVL ID: 1, Name: DIN1)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |2’nd IO Value
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N2 of Two Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |42 (AVL ID: 66, Name: External Voltage)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |5D BC
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N4 of Four Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N8 of Eight Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Number of Data 2 (Number of Total Records)
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
|}
  
09 – 9 IO elements, which length is 1 Byte
 
  
0 – IO element ID = 01
+
Server response in hexadecimal stream:
 +
<code>0005CAFE010501</code> <br> <br>
 +
Parsed:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="3" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Server Response to AVL Data Packet
 +
|-
 +
! colspan="2" rowspan="1" style="width:60%; vertical-align: middle; text-align: center;" |Server Response Part
 +
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |HEX Code Part
 +
|-
 +
| rowspan="3" style="vertical-align: middle; text-align: center;" |UDP Channel Header
 +
| style="vertical-align: middle; text-align: center;" |Length
 +
| style="vertical-align: middle; text-align: center;" |00 05
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Packet ID
 +
| style="vertical-align: middle; text-align: center;" |CA FE
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Not usable byte
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| rowspan="2" style="vertical-align: middle; text-align: center;" |AVL Packet Acknowledgment
 +
| style="vertical-align: middle; text-align: center;" |AVL packet ID
 +
| style="vertical-align: middle; text-align: center;" |05
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Number of Accepted Data
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
|} <br />
  
0 – IO element’s value = 0
+
=='''<big>Codec 8 Extended</big>'''==
  
02 – IO element ID = 02
+
*'''<big>Protocols overview</big>'''
  
0 – IO element’s value = 0
+
Codec8 Extended is using for FMBXXX family devices. This protocol looks familiar like Codec8 but they have some differences. Main differences between are shown in below table:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec8
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec8 Extended
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |0x08
 +
| style="vertical-align: middle; text-align: center;" |0x8E
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |AVL Data IO element length
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |AVL Data IO element total IO count length
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |AVL Data IO element IO count length
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |AVL Data IO element AVL ID length
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |Variable size IO elements
 +
| style="vertical-align: middle; text-align: center;" |Does not include
 +
| style="vertical-align: middle; text-align: center;" |Includes variable size elements
 +
|-
 +
|} <br />
  
03 – IO element ID = 03
+
*'''<big>Codec 8 Extended protocol sending over TCP</big>'''
 +
 +
*'''AVL data packet'''
  
0 – IO element’s value = 0
+
Below table represents AVL data packet structure:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |0x00000000 (Preamble)
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Data Field Length
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec ID
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Number of Data 1
 +
! colspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data
 +
! rowspan="1" style="width:14%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Number of Data 2
 +
! rowspan="1" style="width:14%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |CRC-16
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |X bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
|-
 +
|}
  
4 – IO element ID = 04
 
  
0 – IO element’s value = 0
+
'''Preamble''' the packet starts with four zero bytes. <br>
 +
'''Data Field Length''' – size is calculated starting from Codec ID to Number of Data 2. <br>
 +
'''Codec ID''' – in Codec8 Extended it is always <code>0x8E</code>. <br>
 +
'''Number of Data 1''' – a number which defines how many records is in the packet. <br>
 +
'''AVL Data''' – actual data in the packet (more information below). <br>
 +
'''Number of Data 2''' – a number which defines how many records is in the packet. This number must be the same as “Number of Data 1”. <br>
 +
'''CRC-16''' – calculated from Codec ID to the Second Number of Data. CRC (Cyclic Redundancy Check) is an error-detecting code using for detect accidental changes to RAW data. For calculation we are using [[Codec#CRC-16|CRC-16/IBM]].<br> <br>
 +
'''Note:''' for [[FMB630]], [[FMB640]] and [[FM6300|FM63XY]], minimum AVL packet size is 45 bytes (all IO elements disabled). Maximum AVL packet size is 255 bytes. For other devices, minimum AVL packet size is 45 bytes (all IO elements disabled). Maximum AVL packet size is 1280 bytes. <br>
  
16 – IO element ID = 22 (dec)
+
*AVL Data
  
0 – IO element’s value = 1
+
Below table represents AVL Data structure:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Timestamp
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Priority
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |GPS Element
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |IO Element
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |8 bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |15 bytes
 +
| style="vertical-align: middle; text-align: center;" |X bytes
 +
|-
 +
|}
  
47 – IO element ID = 71 (dec)
 
  
03 – IO element’s value = 3
+
'''Timestamp''' a difference, in milliseconds, between the current time and midnight, January, 1970 UTC (UNIX time). <br>
 +
'''Priority''' – field which define AVL data priority (more information below). <br>
 +
'''GPS Element''' – locational information of the AVL data (more information below). <br>
 +
'''IO Element''' – additional configurable information from device (more information below). <br>
  
F0 – IO element ID = 240 (dec)
+
*Priority
  
0 – IO element’s value = 0
+
Below table represents Priority values. Packet priority depends on device configuration and records sent.
 +
{| class="nd-othertables_2" style="width:25%;"
 +
|+
 +
! colspan="2" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Priority
 +
|-
 +
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |0
 +
| style="vertical-align: middle; text-align: center;" |Low
 +
|-
 +
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |1
 +
| style="vertical-align: middle; text-align: center;" |High
 +
|-
 +
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |2
 +
| style="vertical-align: middle; text-align: center;" |Panic
 +
|} <br />
  
15 – IO element ID = 21 (dec)
+
*GPS element
  
04 – IO element’s value = 0
+
Below table represents GPS Element structure:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Longitude
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Latitude
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Altitude
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Angle
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Satellites
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Speed
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
|}
  
C8 – IO element ID = 200 (dec)
 
  
0 – IO element’s value = 0
+
'''Longitude''' – east – west position. <br>
 +
'''Latitude''' – north – south position. <br>
 +
'''Altitude''' – meters above sea level. <br>
 +
'''Angle''' – degrees from north pole. <br>
 +
'''Satellites''' – number of visible satellites. <br>
 +
'''Speed''' – speed calculated from satellites. <br> <br>
 +
'''Note:''' If record are without valid coordinates – (there were no GPS fix in the moment of data acquisition) – Longitude, Latitude and Altitude values are last valid fix, and Angle, Satellites and Speed are 0. <br> <br>
 +
Longitude and latitude are integer values built from degrees, minutes, seconds and milliseconds by formula: <br>
 +
[[Image:GPS.png]]
 +
<br>
 +
Where: <br>
 +
d – Degrees; m Minutes; s – Seconds; ms – Milliseconds; p – Precision (10000000) <br>
 +
If longitude is in west or latitude in south, multiply result by –1. <br> <br>
 +
Note: <br>
 +
To determine if the coordinate is negative, convert it to binary format and check the very first bit. If it is <code>0</code>, coordinate is positive, if it is <code>1</code>, coordinate is negative. <br> <br>
 +
Example: <br>
 +
Received value: <code>20 9C CA 80</code> converted to BIN: <code>00100000 10011100 11001010 10000000</code> first bit is 0, which means coordinate is positive converted to DEC: <code>547146368</code>. For more information see two‘s complement arithmetic. <br>
  
0C – 12 IO elements, which value length is 2 Bytes
+
*IO Element
  
09 – IO element ID = 9 (dec)
+
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |Event IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
| rowspan="33" style=" width:5%; vertical-align: middle; text-align: left;" |
 +
| rowspan="33" style=" width:65%; vertical-align: middle; text-align: left;" |'''Event IO ID''' if data is acquired on event – this field defines which IO property has changed and generated an event. For example, when if Ignition state changed and it generate event, Event IO ID will be 0x00EF (AVL ID: 239). If it’s not eventual record – the value is 0x0000. <br>
 +
'''N''' – a total number of properties coming with record (N = N1 + N2 + N4 + N8). <br>
 +
'''N1''' – number of properties, which length is 1 byte. <br>
 +
'''N2''' – number of properties, which length is 2 bytes. <br>
 +
'''N4''' – number of properties, which length is 4 bytes. <br>
 +
'''N8''' – number of properties, which length is 8 bytes. <br>
 +
'''NX''' – a number of properties, which length is defined by length element.
 +
'''N’th IO ID''' - AVL ID. <br>
 +
'''N'th Lenght''' - AVL ID value lenght. <br>
 +
'''N’th IO Value''' - AVL ID value. <br> <br>
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N of Total IO
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N1 of One Byte IO
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
| colspan="2" style="vertical-align: middle; text-align: center;" |...
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N1’th IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N1’th IO Value
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N2 of Two Bytes
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
| colspan="2" style="vertical-align: middle; text-align: center;" |...
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N2’th IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N2’th IO Value
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N4 of Four Bytes
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
|-
 +
| colspan="2" style="vertical-align: middle; text-align: center;" |...
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N4’th IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N4’th IO Value
 +
| style="vertical-align: middle; text-align: center;" |4 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N8 of Eight Bytes
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |8 byte
 +
|-
 +
| colspan="2" style="vertical-align: middle; text-align: center;" |...
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N8’IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N8’IO Value
 +
| style="vertical-align: middle; text-align: center;" |8 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |NX of X Byte IO
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO Length
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |Defined by lenght
 +
|-
 +
| colspan="2" style="vertical-align: middle; text-align: center;" |...
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |NX’th IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |NX’th Length
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |NX’th Value
 +
| style="vertical-align: middle; text-align: center;" |Defined by lenght
 +
|-
 +
|} <br />
  
0073 – IO element’s value
+
*'''Communication with server'''
  
0a – IO element ID = 10 (dec)
+
Communication with server is the same as with Codec8 protocol, except in Codec8 Extended protocol Codec ID is 0x8E. <br>
  
0046 – IO element’s value
+
*Example:
  
0b IO element ID = 11 (dec)
+
Module connects to server and sends IMEI: <br>
 +
<code>000F333536333037303432343431303133</code> <br>
 +
Server accepts the module: <br>
 +
<code>01</code> <br>
 +
Module sends data packet:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data Packet Header
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data Array
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |CRC-16
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Four Zero Bytes – 0x00000000,
 +
“AVL Data Array” length 0x000000FE
 +
| style="vertical-align: middle; text-align: center;" |Codec ID – 0x8E,
 +
Number of Data – '''0x02''' <br>
 +
(Encoded using continuous bit stream. Last byte padded to align to byte boundary)
 +
| style="vertical-align: middle; text-align: center;" |CRC of “AVL Data Array”
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |00000000000000FE
 +
| style="vertical-align: middle; text-align: center;" |8E'''02'''...(data elements)...'''02'''
 +
| style="vertical-align: middle; text-align: center;" |00008612
 +
|-
 +
|}
  
0050 – IO element’s value
 
  
13 – IO element ID = 19 (dec)
+
Server acknowledges data reception (2 data elements): '''<code>00000002</code>''' <br>
  
0046 – IO element’s value
+
*'''Example'''
  
43 – IO element ID = 67 (dec)
+
Hexadecimal stream of AVL Data Packet receiving and response in this example are given in hexadecimal form. The different fields of packet are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding. <br> <br>
 +
Received data in hexadecimal stream: <br>
 +
<code>000000000000004A8E010000016B412CEE000100000000000000000000000000000000010005000100010100010011001D00010010015E2C880002000B000000003544C87
 +
A000E000000001DD7E06A00000100002994</code> <br> <br>
 +
Parsed data:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="3" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data Packet
 +
|-
 +
! colspan="2" rowspan="1" style="width:60%; vertical-align: middle; text-align: center;" |AVL Data Packet Part
 +
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |HEX Code Part
 +
|-
 +
| rowspan="4" style="vertical-align: middle; text-align: center;" |
 +
| style="vertical-align: middle; text-align: center;" |Zero Bytes
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Data Field Length
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 4A
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |8E
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Number of Data 1 (Records)
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| rowspan="25" style="vertical-align: middle; text-align: center;" |AVL Data
 +
| style="vertical-align: middle; text-align: center;" |Timestamp
 +
| style="vertical-align: middle; text-align: center;" |00 00 01 6B 41 2C EE 00 (GMT: Monday, June 10, 2019 11:36:32 AM)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Priority
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Longitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Latitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Altitude
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Angle
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Satellites
 +
| style="vertical-align: middle; text-align: center;" |00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Speed
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Event IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N of Total ID
 +
| style="vertical-align: middle; text-align: center;" |00 05
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N1 of One Byte IO
 +
| style="vertical-align: middle; text-align: center;" |00 01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 01 (AVL ID: 1, Name: DIN1)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N2 of Two Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00 01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 11 (AVL ID: 17, Name: Axis X)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |00 1D
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N4 of Four Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00 01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 10 (AVL ID: 16, Name: Total Odometer)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |01 5E 2C 88
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N8 of Eight Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00 02
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 0B (AVL ID: 11, Name: ICCID1)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00 35 44 C8 7A
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |2’nd IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 0E (AVL ID: 14, Name: ICCID2)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |2’nd IO Value
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00 1D D7 E0 6A
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |NX of X Byte IO
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| rowspan="2" style="vertical-align: middle; text-align: center;" |
 +
| style="vertical-align: middle; text-align: center;" |Number of Data 2 (Number of Total Records)
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |CRC-16
 +
| style="vertical-align: middle; text-align: center;" |00 00 29 94
 +
|-
 +
|}
  
06d7 – IO element’s value
 
  
1 – IO element ID = 68 (dec)
+
Server response: <code>00000001</code> <br>
  
0 – IO element’s value
+
*'''<big>Codec8 Extended protocol sending over UDP</big>'''
  
B5 – IO element ID = 181 (dec)
+
*'''UDP channel protocol'''
  
000b – IO element’s value
+
AVL data packet is the same as with Codec8, except Codec ID is changed to <code>0x8E</code>. AVL Data encoding performed according to Codec8 Extended protocol. <br>
  
B6 – IO element ID = 182 (dec)
+
*'''Communication with server'''
  
0007 – IO element’s value
+
Module sends UDP channel packet with encapsulated AVL data packet. Server sends UDP channel packet with encapsulated response module validates AVL Packet ID and Number of accepted AVL elements. If server response with valid AVL Packet ID is not received within configured timeout, module can retry sending. <br>
  
42 – IO element ID = 66 (dec)
+
*Example:
  
2e9f IO element’s value
+
Module sends the data:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |UDP Channel Header
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Packet Header
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data Array
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Length 0x00FE,
 +
Packet ID – 0xCAFE <br>
 +
Not Usable Byte – 0x01
 +
| style="vertical-align: middle; text-align: center;" |AVL Packet ID – 0xDD,
 +
IMEI Length – 0x000F <br>
 +
IMEI – 0x313233343536373839303132333435
 +
(Encoded using continuous bit stream. Last byte padded to align to byte boundary)
 +
| style="vertical-align: middle; text-align: center;" |Codec ID – 0x8E,
 +
Number of Data – 0x02 <br>
 +
(Encoded using continuous bit stream)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |00FECAFE01
 +
| style="vertical-align: middle; text-align: center;" |DD000F3133343536373839303132333435
 +
| style="vertical-align: middle; text-align: center;" |8E02…(data elements)…02
 +
|-
 +
|}
  
2 – IO element ID = 24 (dec)
 
  
0 IO element’s value
+
Server must respond with acknowledgment:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |UDP Channel Header
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Packet Acknowledgment
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Length 0x0005,
 +
Packet ID – 0xCAFE,
 +
Not Usable Byte – 0x01
 +
| style="vertical-align: middle; text-align: center;" |AVL Packet ID – 0xDD,
 +
Number of Accepted Data – 0x02
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |0005CAFE01
 +
| style="vertical-align: middle; text-align: center;" |DD02
 +
|-
 +
|} <br />
  
cd – IO element ID = 205 (dec)
+
*'''Example'''
  
3 IO element’s value
+
Hexadecimal stream of AVL Data Packet receiving and response in this example are given in hexadecimal form. The different fields of packet are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding. <br> <br>
 +
Received data in hexadecimal stream: <br>
 +
<code>005FCAFE0107000F3335323039333038363430333635358E010000016B4F831C680100000000000000000000000000000000010005000100010100010011009D000100</code>
 +
<code>10015E2C880002000B000000003544C87A000E000000001DD7E06A000001</code> <br> <br>
 +
Parsed:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="3" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data Packet
 +
|-
 +
! colspan="2" rowspan="1" style="width:60%; vertical-align: middle; text-align: center;" |AVL Data Packet Part
 +
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |HEX Code Part
 +
|-
 +
| rowspan="3" style="vertical-align: middle; text-align: center;" |UDP Channel Header
 +
| style="vertical-align: middle; text-align: center;" |Length
 +
| style="vertical-align: middle; text-align: center;" |00 5F
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Packet ID
 +
| style="vertical-align: middle; text-align: center;" |CA FE
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Not usable byte
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| rowspan="3" style="vertical-align: middle; text-align: center;" |AVL Packet Header
 +
| style="vertical-align: middle; text-align: center;" |AVL packet ID
 +
| style="vertical-align: middle; text-align: center;" |05
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |IMEI Length
 +
| style="vertical-align: middle; text-align: center;" |00 0F
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |IMEI
 +
| style="vertical-align: middle; text-align: center;" |33 35 32 30 39 33 30 38 36 34 30 33 36 35 35
 +
|-
 +
| rowspan="27" style="vertical-align: middle; text-align: center;" |AVL Data Array
 +
| style="vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |8E
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Number of Data 1 (Records)
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Timestamp
 +
| style="vertical-align: middle; text-align: center;" |00 00 01 6B 4F 83 1C 68 (GMT: Thursday, June 13, 2019 6:25:21 AM)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Priority
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Longitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Latitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Altitude
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Angle
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Satellites
 +
| style="vertical-align: middle; text-align: center;" |00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Speed
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Event IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N of Total ID
 +
| style="vertical-align: middle; text-align: center;" |00 05
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N1 of One Byte IO
 +
| style="vertical-align: middle; text-align: center;" |00 01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 01 (AVL ID: 1, Name: DIN1)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |00 01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N2 of Two Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00 01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 11 (AVL ID: 17, Name: Axis X)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |00 1D
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N4 of Four Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00 01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 10 (AVL ID: 16, Name: Total Odometer)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |01 5E 2C 88
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N8 of Eight Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00 02
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 0B (AVL ID: 11, Name: ICCID1)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00 35 44 C8 7A
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |2’nd IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 0E (AVL ID: 14, Name: ICCID2)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |2’nd IO Value
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00 1D D7 E0 6A
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |NX of X Byte IO
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
|}
  
CE – IO element ID = 206 (dec)
 
  
0 – IO element’s value
+
Server response in hexadecimal stream:
 +
<code>0005CAFE010701</code> <br> <br>
 +
Parsed:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="3" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Server Response to AVL Data Packet
 +
|-
 +
! colspan="2" rowspan="1" style="width:60%; vertical-align: middle; text-align: center;" |Server Response Part
 +
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |HEX Code Part
 +
|-
 +
| rowspan="3" style="vertical-align: middle; text-align: center;" |UDP Channel Header
 +
| style="vertical-align: middle; text-align: center;" |Length
 +
| style="vertical-align: middle; text-align: center;" |00 05
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Packet ID
 +
| style="vertical-align: middle; text-align: center;" |CA FE
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Not usable byte
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| rowspan="2" style="vertical-align: middle; text-align: center;" |AVL Packet Acknowledgment
 +
| style="vertical-align: middle; text-align: center;" |AVL packet ID
 +
| style="vertical-align: middle; text-align: center;" |07
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Number of Accepted Data
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
|} <br>
  
07 – 7 IO elements, which value length is 4 Bytes
+
=='''<big>Codec 16</big>'''==
  
C7 – IO element ID = 199 (dec)
+
*'''<big>Protocol overview</big>'''
  
0 – IO element’s value
+
Codec16 is using for FMB630/FM63XY devices. This protocol looks familiar like Codec8 but they have some differences. Main differences between are shown in table below:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec8
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec16
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |0x08
 +
| style="vertical-align: middle; text-align: center;" |0x10
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |AVL Data IO element ID event length
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |AVL Data IO element AVL ID length
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |Generation Type
 +
| style="vertical-align: middle; text-align: center;" |Not Using
 +
| style="vertical-align: middle; text-align: center;" |Is Using
 +
|-
 +
|}
  
f1 – IO element ID = 241 (dec)
 
  
0000601a IO element’s value
+
'''Note:''' Codec16 is supported from firmware 00.03.xx and newer. ([[FMB630]]/FM63XY) || AVL ID‘s which are higher than 255 will can be used only in Codec16 protocol. <br>
  
46 – IO element ID = 70 (dec)
+
*'''<big>Codec 16 protocol sending over TCP</big>'''
 +
 +
*'''AVL data packet'''
  
00000134 – IO element’s value
+
Below table represents AVL data packet structure:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |0x00000000 (Preamble)
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Data Field Length
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec ID
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Number of Data 1
 +
! colspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data
 +
! rowspan="1" style="width:14%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Number of Data 2
 +
! rowspan="1" style="width:14%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |CRC-16
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |X bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
|-
 +
|}
  
48 – IO element ID = 72 (dec)
 
  
00000bb8 – IO element’s value
+
'''Preamble''' the packet starts with four zero bytes. <br>
 +
'''Data Field Length''' – size is calculated starting from Codec ID to Number of Data 2. <br>
 +
'''Codec ID''' – in Codec16 it is always 0x10. <br>
 +
'''Number of Data 1''' – a number which defines how many records is in the packet. <br>
 +
'''AVL Data''' – actual data in the packet (more information below). <br>
 +
'''Number of Data 2''' – a number which defines how many records is in the packet. This number must be the same as “Number of Data 1”. <br>
 +
'''CRC-16''' – calculated from Codec ID to the Second Number of Data. CRC (Cyclic Redundancy Check) is an error-detecting code using for detect accidental changes to RAW data. For calculation we are using [[Codec#CRC-16|CRC-16/IBM]].<br> <br>
 +
'''Note:''' for [[FMB630]] and FM63XY, minimum AVL packet size is 45 bytes (all IO elements disabled). Maximum AVL packet size is 255 bytes. <br>
  
4 – IO element ID = 73 (dec)
+
*AVL Data
  
00000bb8 – IO element’s value
+
Below table represents AVL Data structure:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Timestamp
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Priority
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |GPS Element
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |IO Element
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |8 bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |15 bytes
 +
| style="vertical-align: middle; text-align: center;" |X bytes
 +
|-
 +
|}
  
4a – IO element ID = 74 (dec)
 
  
00000bb8 – IO element’s value
+
'''Timestamp''' a difference, in milliseconds, between the current time and midnight, January, 1970 UTC (UNIX time). <br>
 +
'''Priority''' – field which define AVL data priority (more information below). <br>
 +
'''GPS Element''' – location information of the AVL data (more information below). <br>
 +
'''IO Element''' – additional configurable information from device (more information below). <br>
  
4c – IO element ID = 76 (dec)
+
*Priority
  
1 – IO element’s value
+
Below table represents Priority values. Packet priority depends on device configuration and records sent.
 +
{| class="nd-othertables_2" style="width:25%;"
 +
|+
 +
! colspan="2" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Priority
 +
|-
 +
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |0
 +
| style="vertical-align: middle; text-align: center;" |Low
 +
|-
 +
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |1
 +
| style="vertical-align: middle; text-align: center;" |High
 +
|-
 +
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |2
 +
| style="vertical-align: middle; text-align: center;" |Panic
 +
|} <br />
  
02 – 2 IO elements, which value length is 8 Bytes
+
*GPS element
  
4e – IO element ID = 78 (dec)
+
Below table represents GPS Element structure:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Longitude
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Latitude
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Altitude
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Angle
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Satellites
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Speed
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
|}
  
0 – IO element’s value
 
  
cf IO element ID = 207 (dec)
+
'''Longitude''' east – west position. <br>
 +
'''Latitude''' – north – south position. <br>
 +
'''Altitude''' – meters above sea level. <br>
 +
'''Angle''' – degrees from north pole. <br>
 +
'''Satellites''' – number of visible satellites. <br>
 +
'''Speed''' – speed calculated from satellites. <br> <br>
 +
'''Note:''' If record are without valid coordinates – (there were no GPS fix in the moment of data acquisition) – Longitude, Latitude and Altitude values are last valid fix, and Angle, Satellites and Speed are 0. <br> <br>
 +
Longitude and latitude are integer values built from degrees, minutes, seconds and milliseconds by formula: <br>
 +
[[Image:GPS.png]]
 +
<br>
 +
Where: <br>
 +
d – Degrees; m – Minutes; s – Seconds; ms – Milliseconds; p – Precision (10000000) <br>
 +
If longitude is in west or latitude in south, multiply result by –1. <br> <br>
 +
Note: <br>
 +
To determine if the coordinate is negative, convert it to binary format and check the very first bit. If it is <code>0</code>, coordinate is positive, if it is <code>1</code>, coordinate is negative. <br> <br>
 +
Example: <br>
 +
Received value: <code>20 9C CA 80</code> converted to BIN: <code>00100000 10011100 11001010 10000000</code> first bit is 0, which means coordinate is positive converted to DEC: <code>547146368</code>. For more information see two‘s complement arithmetic. <br>
  
0 – IO element’s value
+
*IO Element
  
0 – Number of Data (1 record)
+
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |Event IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
| rowspan="27" style=" width:5%; vertical-align: middle; text-align: left;" |
 +
| rowspan="27" style=" width:65%; vertical-align: middle; text-align: left;" |'''Event IO ID''' – if data is acquired on event – this field defines which IO property has changed and generated an event. For example, when if Ignition state changed and it generate event, Event IO ID will be 0xEF (AVL ID: 239). If it’s not eventual record – the value is 0. <br>
 +
'''Generation type''' - data event generation type. More information about it you can find here. <br>
 +
'''N''' a total number of properties coming with record (N = N1 + N2 + N4 + N8). <br>
 +
'''N1''' – number of properties, which length is 1 byte. <br>
 +
'''N2''' – number of properties, which length is 2 bytes. <br>
 +
'''N4''' – number of properties, which length is 4 bytes. <br>
 +
'''N8''' – number of properties, which length is 8 bytes. <br>
 +
'''N’th IO ID''' - AVL ID. <br>
 +
'''N’th IO Value''' - AVL ID value. <br> <br>
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |Generation Type
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N of Total IO
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N1 of One Byte IO
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
| colspan="2" style="vertical-align: middle; text-align: center;" |...
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N1’th IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N1’th IO Value
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N2 of Two Bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
| colspan="2" style="vertical-align: middle; text-align: center;" |...
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N2’th IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N2’th IO Value
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N4 of Four Bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
|-
 +
| colspan="2" style="vertical-align: middle; text-align: center;" |...
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N4’th IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N4’th IO Value
 +
| style="vertical-align: middle; text-align: center;" |4 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N8 of Eight Bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |8 byte
 +
|-
 +
| colspan="2" style="vertical-align: middle; text-align: center;" |...
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N8’IO ID
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:15%; vertical-align: middle; text-align: center;" |N8’IO Value
 +
| style="vertical-align: middle; text-align: center;" |8 bytes
 +
|-
 +
|} <br />
  
00003fca - CRC-16, 4 Bytes (first 2 are always zeros)
+
*Generation type
  
+
{| class="nd-othertables_2" style="width:30%;"
 +
|+
 +
! rowspan="1" style="width:50%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Value
 +
! rowspan="1" style="width:50%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Record Created
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |0
 +
| style="vertical-align: middle; text-align: center;" |On Exit
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1
 +
| style="vertical-align: middle; text-align: center;" |On Entrance
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |2
 +
| style="vertical-align: middle; text-align: center;" |On Both
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |3
 +
| style="vertical-align: middle; text-align: center;" |Reserved
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |4
 +
| style="vertical-align: middle; text-align: center;" |Hysteresis
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |5
 +
| style="vertical-align: middle; text-align: center;" |On Change
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |6
 +
| style="vertical-align: middle; text-align: center;" |Eventual
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |7
 +
| style="vertical-align: middle; text-align: center;" |Periodical
 +
|-
 +
|} <br />
  
*'''SENDING DATA OVER TCP/IP'''
+
*'''Communication with server'''
  
First when module connects to server, module sends its IMEI. First comes short identifying number of bytes written and then goes IMEI as text (bytes).
+
Communication with server is the same as with Codec8 protocol, except in Codec16 protocol Codec ID is <code>0x10</code> and has generation type. <br>
  
For example IMEI 356307042441013 would be sent as 000f333536333037303432343431303133
+
*Example:
  
First two bytes denote IMEI length. In this case 000F means, that imei is 15 bytes long.
+
Module connects to server and sends IMEI: <br>
 +
<code>000F333536333037303432343431303133</code> <br>
 +
Server accepts the module: <br>
 +
<code>01</code> <br>
 +
Module sends data packet:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data Packet Header
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data Array
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |CRC-16
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Four Zero Bytes – 0x00000000,
 +
“AVL Data Array” length – 0x000000FE
 +
| style="vertical-align: middle; text-align: center;" |Codec ID – 0x10,
 +
Number of Data – '''0x02''' <br>
 +
(Encoded using continuous bit stream. Last byte padded to align to byte boundary)
 +
| style="vertical-align: middle; text-align: center;" |CRC of “AVL Data Array”
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |00000000000000FE
 +
| style="vertical-align: middle; text-align: center;" |10'''02'''...(data elements)...'''02'''
 +
| style="vertical-align: middle; text-align: center;" |00008612
 +
|-
 +
|}
  
After receiving IMEI, server should determine if it would accept data from this module. If yes server will reply to module 01 if not 00. Note that confirmation should be sent as binary packet. I.e. 1 byte 0x01 or 0x00.
 
  
Then module starts to send first AVL data packet. After server receives packet and parses it, server must report to module number of data received as integer (four bytes).
+
Server acknowledges data reception (2 data elements): '''<code>00000002</code>''' <br>
  
If sent data number and reported by server doesn’t match module resends sent data.
+
*'''Example'''
  
 
+
Hexadecimal stream of AVL Data Packet receiving and response in this example are given in hexadecimal form. The different fields of packet are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding. <br> <br>
Example:
+
Received data in hexadecimal stream: <br>
 
+
<code>000000000000005F10020000016BDBC7833000000000000000000000000000000000000B05040200010000030002000B00270042563A00000000016BDBC78718</code>
Module connects to server and sends IMEI:
+
<code>00000000000000000000000000000000000B05040200010000030002000B00260042563A00000200005FB3</code> <br> <br>
 
+
Parsed data:
000f333536333037303432343431303133
+
{| class="nd-othertables_2" style="width:100%;"
 
+
|+
Server accepts the module:
+
! colspan="3" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data Packet
 
+
|-
01
+
! colspan="2" rowspan="1" style="width:60%; vertical-align: middle; text-align: center;" |AVL Data Packet Part
 
+
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |HEX Code Part
Module sends data packet:
+
|-
{| class="wikitable"
+
| rowspan="4" style="vertical-align: middle; text-align: center;" |
 +
| style="vertical-align: middle; text-align: center;" |Zero Bytes
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Data Field Length
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 5F
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |10
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Number of Data 1 (Records)
 +
| style="vertical-align: middle; text-align: center;" |02
 +
|-
 +
| rowspan="23" style="vertical-align: middle; text-align: center;" |AVL Data
 +
(1'st record)
 +
| style="vertical-align: middle; text-align: center;" |Timestamp
 +
| style="vertical-align: middle; text-align: center;" |00 00 01 6B DB C7 83 30 (GMT: Wednesday, July 10, 2019 12:06:54 PM)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Priority
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Longitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Latitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Altitude
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Angle
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Satellites
 +
| style="vertical-align: middle; text-align: center;" |00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Speed
 +
| style="vertical-align: middle; text-align: center;" |00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Event IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 0B
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Generation Type
 +
| style="vertical-align: middle; text-align: center;" |05
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N of Total ID
 +
| style="vertical-align: middle; text-align: center;" |04
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |N1 of One Byte IO
 +
| style="vertical-align: middle; text-align: center;" |02
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 01 (AVL ID: 1, Name: DIN1)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |2’nd IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 03 (AVL ID: 3, Name: DIN3)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |2’nd IO Value
 +
| style="vertical-align: middle; text-align: center;" |00
 
|-
 
|-
! style="background: black; color: white;"|AVL data packet header !! style="background: black; color: white;"|AVL data array !! style="background: black; color: white;"| CRC
+
| style="vertical-align: middle; text-align: center;" |N2 of Two Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |02
 
|-
 
|-
| Four zero bytes,
+
| style="vertical-align: middle; text-align: center;" |1’st IO ID
‘AVL data array’ length – 254
+
| style="vertical-align: middle; text-align: center;" |00 0B (AVL ID: 11, Name: ICCID1)
|| CodecId – 08,  
 
NumberOfData – 2.
 
(Encoded using continuous bit stream.
 
 
 
Last byte padded to align to byte boundary)
 
|| CRC of ‘AVL data array’
 
 
|-
 
|-
| 00000000000000FE || 0802...(data elements)...02 || 00008612
+
| style="vertical-align: middle; text-align: center;" |1’st IO Value
|}
+
| style="vertical-align: middle; text-align: center;" |00 27
 
 
Server acknowledges data reception (2 data elements):
 
00000002
 
 
 
 
 
*'''SENDING DATA OVER UDP/IP'''
 
 
 
 
 
*''UDP channel protocol''
 
 
 
UDP channel is a transport layer protocol above UDP/IP to add reliability to plain UDP/IP using acknowledgment packets. The packet structure is as follows:
 
 
 
{| class="wikitable "
 
 
|-
 
|-
! colspan="4" align="center" style="background: black; color: white;"|UDP datagram
+
| style="vertical-align: middle; text-align: center;" |2’nd IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 42 (AVL ID: 66, Name: External Voltage)
 
|-
 
|-
| rowspan="4"| UDP channel packet x N
+
| style="vertical-align: middle; text-align: center;" |2’nd IO Value
| Example || 2 bytes || Packet length (excluding this field) in big ending byte order
+
| style="vertical-align: middle; text-align: center;" |56 3A
 
|-
 
|-
| Packet Id || 2 bytes || Packet id unique for this channel
+
| style="vertical-align: middle; text-align: center;" |N4 of Four Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00
 
|-
 
|-
| Packet Type || 1 byte || Type of this packet
+
| style="vertical-align: middle; text-align: center;" |N8 of Eight Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00
 
|-
 
|-
| Packet payload || m bytes || Data payload
+
| rowspan="23" style="vertical-align: middle; text-align: center;" |AVL Data
|}
+
(2'nd record)
 
+
| style="vertical-align: middle; text-align: center;" |Timestamp
 
+
| style="vertical-align: middle; text-align: center;" |00 00 01 6B DB C7 87 18 (GMT: Wednesday, July 10, 2019 12:06:55 PM)
{| class="wikitable"
 
 
|-
 
|-
! colspan="2" align="center" style="background: black; color: white;"|Packet Type
+
| style="vertical-align: middle; text-align: center;" |Priority
 +
| style="vertical-align: middle; text-align: center;" |01
 
|-
 
|-
| 1||Data packet requiring acknowledgment
+
| style="vertical-align: middle; text-align: center;" |Longitude
|}
+
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 
 
Acknowledgment packet should have the same packet id as acknowledged data packet and empty data payload. Acknowledgement should be sent in binary format
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! colspan="3" align="center" style="background: black; color: white;"|Acknowledgment packet
+
| style="vertical-align: middle; text-align: center;" |Latitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 
|-
 
|-
| Packet length || 2 bytes || 0x0003
+
| style="vertical-align: middle; text-align: center;" |Altitude
 +
| style="vertical-align: middle; text-align: center;" |00 00
 
|-
 
|-
| Packet id || 2 bytes || same as in acknowledged packet
+
| style="vertical-align: middle; text-align: center;" |Angle
 +
| style="vertical-align: middle; text-align: center;" |00 00
 
|-
 
|-
| Packet type || 1 byte || 0x02
+
| style="vertical-align: middle; text-align: center;" |Satellites
|}
+
| style="vertical-align: middle; text-align: center;" |00
 
 
 
 
*'''Sending AVL data using UDP channel'''
 
 
 
AVL data are sent encapsulated in UDP channel packets (Data payload field).
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! colspan="3" align="center" style="background: black; color: white;"|AVL data encapsulated in UDP channel packet
+
| style="vertical-align: middle; text-align: center;" |Speed
 +
| style="vertical-align: middle; text-align: center;" |00 00
 
|-
 
|-
| AVL packet id (1 byte) || Module IMEI || AVL data array
+
| style="vertical-align: middle; text-align: center;" |Event IO ID
|}
+
| style="vertical-align: middle; text-align: center;" |00 0B
 
 
AVL packet id (1 byte) – id identifying this AVL packet
 
Module IMEI – IMEI of a sending module encoded the same as with TCP
 
AVL data array – array of encoded AVL data
 
 
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! colspan="3" align="center" style="background: black; color: white;"|Server response to AVL data packet
+
| style="vertical-align: middle; text-align: center;" |Generation Type
 +
| style="vertical-align: middle; text-align: center;" |05
 
|-
 
|-
| AVL packet id (1 byte) ||Number of accepted AVL elements (1 byte)
+
| style="vertical-align: middle; text-align: center;" |N of Total ID
|}
+
| style="vertical-align: middle; text-align: center;" |04
 
 
 
 
AVL packet id (1 byte) – id of received AVL data packet
 
 
 
AVL packet id (1 byte) – id of received AVL data packet
 
 
 
Number of AVL data elements accepted (1 byte) – number of AVL data array entries from the beginning of array, which were accepted by the server.
 
 
 
Scenario:
 
 
 
Module sends UDP channel packet with encapsulated AVL data packet (Packet type=1 or 0). If packet type is 0, server should respond with valid UDP channel acknowledgment packet. Since server should respond to the AVL data packet, UDP channel acknowledgment is not necessary in this scenario, so Packet type=1 is recommended.
 
 
 
Server sends UDP channel packet with encapsulated response (Packet type=1 – this packet should not require acknowledgment)
 
 
 
Module validates AVL packet id and Number of accepted AVL elements. If server response with valid AVL packet id is not received within configured timeout, module can retry sending.
 
 
 
 
 
Example:
 
Module sends the data:
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! style="background: black; color: white;"|UDP channel header !!style="background: black; color: white;"| AVL packet header !!style="background: black; color: white;"| AVL data array
+
| style="vertical-align: middle; text-align: center;" |N1 of One Byte IO
 +
| style="vertical-align: middle; text-align: center;" |02
 
|-
 
|-
| Len – 253,
+
| style="vertical-align: middle; text-align: center;" |1’st IO ID
Id – 0xCAFE,
+
| style="vertical-align: middle; text-align: center;" |00 01 (AVL ID: 1, Name: DIN1)
Packet type – 01 (without ACK)
 
|| AVL packet id – 0xDD,  
 
IMEI – 1234567890123456
 
|| CodecId – 08,
 
NumberOfData – 2.
 
(Encoded using continuous bit stream)
 
 
 
 
|-
 
|-
| 00FDCAFE01 || DD000F3133343536373839303132333435 || 0802…(data elements)…02
+
| style="vertical-align: middle; text-align: center;" |1’st IO Value
|}
+
| style="vertical-align: middle; text-align: center;" |00
 
 
 
 
Server must respond with acknowledgment:
 
 
 
{| class="wikitable"
 
 
|-
 
|-
!style="background: black; color: white;"| UDP channel header !!style="background: black; color: white;"| AVL packet acknowledgment
+
| style="vertical-align: middle; text-align: center;" |2’nd IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 03 (AVL ID: 3, Name: DIN3)
 
|-
 
|-
| Len – 5,
+
| style="vertical-align: middle; text-align: center;" |2’nd IO Value
Id – 0xABCD,
+
| style="vertical-align: middle; text-align: center;" |00
Packet type – 01 (without ACK)
 
|| AVL packet id – 0xDD,
 
NumberOfAcceptedData – 2
 
 
 
|-
 
|-
| 0005ABCD01 || DD02
+
| style="vertical-align: middle; text-align: center;" |N2 of Two Bytes IO
|}
+
| style="vertical-align: middle; text-align: center;" |02
 
 
 
 
 
 
== <big>Codec 8 Extended</big>  ==
 
 
 
 
 
 
 
*'''Protocols overview'''
 
 
 
 
 
Difference between codec8 and codec8 extended
 
 
 
{| class="wikitable"
 
 
|-
 
|-
! style="background: black; color: white;"| !!style="background: black; color: white;"| Codec 8 !!style="background: black; color: white;"| Codec 8 Extended
+
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 0B (AVL ID: 11, Name: ICCID1)
 
|-
 
|-
| Codec ID || 0x08 || 0x8E
+
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |00 26
 
|-
 
|-
| AVL Data IO element length || 1 Byte || 2 Bytes
+
| style="vertical-align: middle; text-align: center;" |2’nd IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 42 (AVL ID: 66, Name: External Voltage)
 
|-
 
|-
| AVL Data IO element total IO count length || 1 Byte || 2 Bytes
+
| style="vertical-align: middle; text-align: center;" |2’nd IO Value
 +
| style="vertical-align: middle; text-align: center;" |56 3A
 
|-
 
|-
| AVL Data IO element IO count length || 1 Byte || 2 Bytes
+
| style="vertical-align: middle; text-align: center;" |N4 of Four Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00
 
|-
 
|-
| AVL Data IO element AVL ID length || 1 Byte || 2 Bytes
+
| style="vertical-align: middle; text-align: center;" |N8 of Eight Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00
 
|-
 
|-
| Variable size IO elements || Does not include || include Includes variable size elements
+
| rowspan="2" style="vertical-align: middle; text-align: center;" |
|}
+
| style="vertical-align: middle; text-align: center;" |Number of Data 2 (Number of Total Records)
<small>Table 2. Codec 8 and 8 Extended differences
+
| style="vertical-align: middle; text-align: center;" |02
</small>
 
 
 
Main differences between are shown in above table. AVL data element sizes in codec 8 extended protocol was increased to 2 byte length and new variable type added. For more detailed description look in codec 8
 
and codec 8 extended chapters.
 
 
 
 
 
*'''Codec 8 extended protocol sending over TCP'''
 
 
 
 
'''AVL data packet'''
 
 
 
Below table represents AVL data packet structure.
 
{| class="wikitable"
 
 
|-
 
|-
! style="background: black; color: white;"|4 zeros !! style="background: black; color: white;"|Data field length !! style="background: black; color: white;"|Codec ID !! style="background: black; color: white;"|Number of
+
| style="vertical-align: middle; text-align: center;" |CRC-16
Data 1
+
| style="vertical-align: middle; text-align: center;" |00 00 5F B3
!! style="background: black; color: white;"|AVL Data !! style="background: black; color: white;"|Number of
 
Data 2
 
!! style="background: black; color: white;"|CRC-16
 
 
|-
 
|-
| 4 Bytes || 4 Bytes || 1 Byte || 1 Byte || 38-768
+
|}  
Bytes
 
|| 1 Byte || 4 Bytes
 
|}
 
<small>Table 3. AVL data packet structure</small>
 
  
  
Number of data – number of encoded data (number of records). Codec ID is constant 0x8E.
+
Server response: <code>00000002</code> <br>
  
Data field length is the length of bytes [codec id, number of data 2]. Number of data 1 should always be equal to number of data 2 byte.
+
*'''<big>Codec16 protocol sending over UDP</big>'''
 +
*'''UDP channel protocol'''
  
CRC-16 is 4 bytes, but first two are zeroes and last two are CRC-16 calculated for [codec id, number of data
+
AVL data packet is the same as with Codec8, except Codec ID is changed to <code>0x10</code>. AVL Data encoding performed according to Codec16 protocol. <br>
2]
 
  
Minimum AVL packet size is 53 bytes (all IO elements disabled).
+
*'''Communication with server'''
  
 +
Module sends UDP channel packet with encapsulated AVL data packet. Server sends UDP channel packet with encapsulated response module validates AVL Packet ID and Number of accepted AVL elements. If server response with valid AVL Packet ID is not received within configured timeout, module can retry sending. <br>
  
*'''AVL Data'''
+
*Example:
  
{| class="wikitable"
+
Module sends the data:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |UDP Channel Header
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Packet Header
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data Array
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Length – 0x00FE,
 +
Packet ID – 0xCAFE <br>
 +
Not Usable Byte – 0x01
 +
| style="vertical-align: middle; text-align: center;" |AVL Packet ID – 0xDD,
 +
IMEI Length – 0x000F <br>
 +
IMEI – 0x313233343536373839303132333435
 +
(Encoded using continuous bit stream. Last byte padded to align to byte boundary)
 +
| style="vertical-align: middle; text-align: center;" |Codec ID – 0x10,
 +
Number of Data – 0x02 <br>
 +
(Encoded using continuous bit stream)
 
|-
 
|-
!style="background: black; color: white;"| Timestamp !!style="background: black; color: white;"| Timestamp Priority !!style="background: black; color: white;"| GPS Element !!style="background: black; color: white;"| IO Element
+
| style="vertical-align: middle; text-align: center;" |00FECAFE01
 +
| style="vertical-align: middle; text-align: center;" |DD000F3133343536373839303132333435
 +
| style="vertical-align: middle; text-align: center;" |1002…(data elements)…02
 
|-
 
|-
| 8 Bytes || 1 Byte || 15 Bytes || 14 - 744
+
|}  
|}
 
<small>Table 4. AVL data structure</small>
 
  
  
*'''Priority'''
+
Server must respond with acknowledgment:
{| class="wikitable"
+
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |UDP Channel Header
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Packet Acknowledgment
 
|-
 
|-
| style="background: black; color: white;"| 0 || Low
+
| style="vertical-align: middle; text-align: center;" |Length – 0x0005,
 +
Packet ID – 0xCAFE,
 +
Not Usable Byte – 0x01
 +
| style="vertical-align: middle; text-align: center;" |AVL Packet ID – 0xDD,
 +
Number of Accepted Data – 0x02
 
|-
 
|-
| style="background: black; color: white;"| 1 || High
+
| style="vertical-align: middle; text-align: center;" |0005CAFE01
 +
| style="vertical-align: middle; text-align: center;" |DD02
 
|-
 
|-
| style="background: black; color: white;"| 2 || Panic
+
|} <br />
|}
 
<small>Table 5. Priority element values</small>
 
  
 +
*'''Example'''
  
*'''GPS Element'''
+
Hexadecimal stream of AVL Data Packet receiving and response in this example are given in hexadecimal form. The different fields of packet are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding. <br> <br>
 
+
Received data in hexadecimal stream: <br>
{| class="wikitable"
+
<code>015BCAFE0101000F33353230393430383532333135393210070000015117E40FE80000000000000000000000000000000000EF05050400010000030000B4000</code>
 +
<code>0EF01010042111A000001</code> <br> <br>
 +
Parsed:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="3" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |AVL Data Packet
 
|-
 
|-
!style="background: black; color: white;"| Longitude !!style="background: black; color: white;"| Latitude !!style="background: black; color: white;"| Altitude !!style="background: black; color: white;"| Angle !!style="background: black; color: white;"| Satellites !!style="background: black; color: white;"| Speed
+
! colspan="2" rowspan="1" style="width:60%; vertical-align: middle; text-align: center;" |AVL Data Packet Part
 +
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |HEX Code Part
 
|-
 
|-
| 4 Bytes || 4 Bytes || 2 Bytes || 2 Bytes || 1 Byte || 2 Bytes
+
| rowspan="3" style="vertical-align: middle; text-align: center;" |UDP Channel Header
|}
+
| style="vertical-align: middle; text-align: center;" |Length
<small>Table 6. GPS element structure</small>
+
| style="vertical-align: middle; text-align: center;" |01 5B
 
 
 
 
*<big>IO Element</big>
 
 
 
{| class="wikitable"
 
 
|-
 
|-
|style="background: black; color: white;"| Event IO ID || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |Packet ID
 +
| style="vertical-align: middle; text-align: center;" |CA FE
 
|-
 
|-
|style="background: black; color: white;"| N of Total IO || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |Not usable byte
 +
| style="vertical-align: middle; text-align: center;" |01
 
|-
 
|-
|style="background: black; color: white;"| N1 of One Byte IO || 2 bytes
+
| rowspan="3" style="vertical-align: middle; text-align: center;" |AVL Packet Header
 +
| style="vertical-align: middle; text-align: center;" |AVL packet ID
 +
| style="vertical-align: middle; text-align: center;" |07
 
|-
 
|-
|style="background: black; color: white;"| 1'st IO ID || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |IMEI Length
 +
| style="vertical-align: middle; text-align: center;" |00 0F
 
|-
 
|-
|style="background: black; color: white;"| 1'st IO Value || 1 bytes
+
| style="vertical-align: middle; text-align: center;" |IMEI
 +
| style="vertical-align: middle; text-align: center;" |33 35 32 30 39 34 30 38 35 32 33 31 35 39 32
 
|-
 
|-
| ||  
+
| rowspan="28" style="vertical-align: middle; text-align: center;" |AVL Data Array
 +
| style="vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |10
 
|-
 
|-
|style="background: black; color: white;"| N1'th IO ID || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |Number of Data 1 (Records)
 +
| style="vertical-align: middle; text-align: center;" |01
 
|-
 
|-
|style="background: black; color: white;"| N1'st IO Value || 1 bytes
+
| style="vertical-align: middle; text-align: center;" |Timestamp
 +
| style="vertical-align: middle; text-align: center;" |00 00 01 51 17 E4 0F E8 (GMT: Wednesday, November 18, 2015 12:00:01 AM)
 
|-
 
|-
|style="background: black; color: white;"| N2 of Two Byte IO || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |Priority
 +
| style="vertical-align: middle; text-align: center;" |00
 
|-
 
|-
|style="background: black; color: white;"| 1'st IO ID || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |Longitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 
|-
 
|-
|style="background: black; color: white;"| 1'st IO Value || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |Latitude
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 
|-
 
|-
| ||  
+
| style="vertical-align: middle; text-align: center;" |Altitude
 +
| style="vertical-align: middle; text-align: center;" |00 00
 
|-
 
|-
|style="background: black; color: white;"| N2'th IO ID || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |Angle
 +
| style="vertical-align: middle; text-align: center;" |00 00
 
|-
 
|-
|style="background: black; color: white;"| N2'st IO Value || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |Satellites
 +
| style="vertical-align: middle; text-align: center;" |00
 
|-
 
|-
|style="background: black; color: white;"| N4 of Four Byte IO || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |Speed
 +
| style="vertical-align: middle; text-align: center;" |00 00
 
|-
 
|-
|style="background: black; color: white;"| 1'st IO ID || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |Event IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 EF
 
|-
 
|-
|style="background: black; color: white;"| 1'st IO Value || 4 bytes
+
| style="vertical-align: middle; text-align: center;" |Generation type
 +
| style="vertical-align: middle; text-align: center;" |05
 
|-
 
|-
| ||  
+
| style="vertical-align: middle; text-align: center;" |N of Total ID
 +
| style="vertical-align: middle; text-align: center;" |05
 
|-
 
|-
|style="background: black; color: white;"| N4'th IO ID || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |N1 of One Byte IO
 +
| style="vertical-align: middle; text-align: center;" |04
 
|-
 
|-
|style="background: black; color: white;"| N4'st IO Value || 4 bytes
+
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 01 (AVL ID: 1, Name: DIN1)
 
|-
 
|-
|style="background: black; color: white;"| N2 of Eight Byte IO || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |00
 
|-
 
|-
|style="background: black; color: white;"| 1'st IO ID || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |2’nd IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 03 (AVL ID: 3, Name: DIN3)
 
|-
 
|-
|style="background: black; color: white;"| 1'st IO Value || 8 bytes
+
| style="vertical-align: middle; text-align: center;" |2’nd IO Value
 +
| style="vertical-align: middle; text-align: center;" |00
 
|-
 
|-
| ||  
+
| style="vertical-align: middle; text-align: center;" |3’rd IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 B4 (AVL ID: 180, Name: DOUT2)
 
|-
 
|-
|style="background: black; color: white;"| N8'th IO ID || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |3’rd IO Value
 +
| style="vertical-align: middle; text-align: center;" |00
 
|-
 
|-
|style="background: black; color: white;"| N8'st IO Value || 8 bytes
+
| style="vertical-align: middle; text-align: center;" |4’th IO ID
 +
| style="vertical-align: middle; text-align: center;" |00 EF (AVL ID: 239, Name: Ignition)
 
|-
 
|-
|style="background: black; color: white;"| NX of X Byte IO || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |4’th IO Value
 +
| style="vertical-align: middle; text-align: center;" |00
 
|-
 
|-
|style="background: black; color: white;"| 1'st IO ID || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |N2 of Two Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |01
 
|-
 
|-
|style="background: black; color: white;"| 1'st IO Length || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |1’st IO ID
 +
| style="vertical-align: middle; text-align: center;" |42 (AVL ID: 66, Name: External Voltage)
 
|-
 
|-
|style="background: black; color: white;"| 1'st IO Value || defined by length
+
| style="vertical-align: middle; text-align: center;" |1’st IO Value
 +
| style="vertical-align: middle; text-align: center;" |11 1A
 
|-
 
|-
| ||  
+
| style="vertical-align: middle; text-align: center;" |N4 of Four Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00
 
|-
 
|-
|style="background: black; color: white;"| NX'st IO ID || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |N8 of Eight Bytes IO
 +
| style="vertical-align: middle; text-align: center;" |00
 
|-
 
|-
|style="background: black; color: white;"| NX'st IO Length || 2 bytes
+
| style="vertical-align: middle; text-align: center;" |Number of Data 2 (Number of Total Records)
 +
| style="vertical-align: middle; text-align: center;" |01
 
|-
 
|-
|style="background: black; color: white;"| NX'st IO Value  || defined by length
+
|}  
|}
 
<small>Table 7. IO element structure</small>
 
  
N - total number of properties coming with record (N=N1+N2+N4+N8+NX)
 
  
N1 - number of properties, which length is 1 byte
+
Server response in hexadecimal stream:
 +
<code>0005CAFE010701</code> <br> <br>
 +
Parsed:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="3" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Server Response to AVL Data Packet
 +
|-
 +
! colspan="2" rowspan="1" style="width:60%; vertical-align: middle; text-align: center;" |Server Response Part
 +
! rowspan="1" style="width:40%; vertical-align: middle; text-align: center;" |HEX Code Part
 +
|-
 +
| rowspan="3" style="vertical-align: middle; text-align: center;" |UDP Channel Header
 +
| style="vertical-align: middle; text-align: center;" |Length
 +
| style="vertical-align: middle; text-align: center;" |00 05
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Packet ID
 +
| style="vertical-align: middle; text-align: center;" |CA FE
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Not usable byte
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| rowspan="2" style="vertical-align: middle; text-align: center;" |AVL Packet Acknowledgment
 +
| style="vertical-align: middle; text-align: center;" |AVL packet ID
 +
| style="vertical-align: middle; text-align: center;" |07
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Number of Accepted Data
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
|} <br />
  
N2 - number of properties, which length is 2 bytes  
+
=='''<big>Differences between Codec 8, Codec 8 Extended and Codec 16</big>'''==
 +
In the table below you will see differences between Codec8, Codec8 Extended and Codec16.
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec8
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec8 Extended
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec16
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |0x08
 +
| style="vertical-align: middle; text-align: center;" |0x8E
 +
| style="vertical-align: middle; text-align: center;" |0x10
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |AVL Data IO element length
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |AVL Data IO element total IO count length
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |Generation Type
 +
| style="vertical-align: middle; text-align: center;" |Not Using
 +
| style="vertical-align: middle; text-align: center;" |Not Using
 +
| style="vertical-align: middle; text-align: center;" |Is Using
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |AVL Data IO element IO count length
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |AVL Data IO element AVL ID length
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
| style="vertical-align: middle; text-align: center;" |2 bytes
 +
|-
 +
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |Variable size IO elements
 +
| style="vertical-align: middle; text-align: center;" |Does not include
 +
| style="vertical-align: middle; text-align: center;" |Includes variable size elements
 +
| style="vertical-align: middle; text-align: center;" |Does not include
 +
|-
 +
|} <br />
  
N4 - number of properties, which length is 4 bytes
+
='''<big>Codec for communication over GPRS messages</big>'''=
 +
In this chapter you will find information about every Codec protocol which are using for communication over GPRS messages and differences between them.
  
N8 - number of properties, which length is 8 bytes
+
=='''<big>Codec 12</big>'''==
  
NX - number of properties, which length is defined by length element
+
*'''<big>About Codec12</big>'''
  
 +
Codec12 is the original and main Teltonika protocol for device-server communication over GPRS messages. Codec12 GPRS commands can be used for sending configuration, debug, digital outputs control commands or other (special purpose command on special firmware versions). This protocol is also necessary for using [[FMB630]]/[[FM6300]]/FM5300/FM5500/FM4200 features like: Garmin, LCD communication, COM TCP Link Mode. <br>
  
*'''Communication with server'''
+
*'''<big>FM firmware requirements</big>'''
  
Communication  with  server is  the same as with  codec  8  protocol,  except  in  codec8  extended  protocol codec id is 0x8E.
+
Supported GPRS commands on each device depending on the firmware version. For available GPRS commands on each device, please refer to the table below.
 +
{| class="nd-othertables" style="width:75%;"
 +
|+
 +
! rowspan="1" style="width:25%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Device
 +
! rowspan="1" style="width:25%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |SMS over GPRS via TCP
 +
! rowspan="1" style="width:25%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |SMS over GPRS via UDP
 +
|-
 +
| style="vertical-align: middle; text-align: left;" |FM36YX
 +
| style="vertical-align: middle; text-align: center;" |Available in base firmware
 +
| style="vertical-align: middle; text-align: center;" |Since base firmware 01.06.01
 +
|-
 +
| style="vertical-align: middle; text-align: left;" |FM63YX
 +
| style="vertical-align: middle; text-align: center;" |Available in base firmware
 +
| style="vertical-align: middle; text-align: center;" |Since base firmware 00.02.19
 +
|-
 +
| style="vertical-align: middle; text-align: left;" |FMB, FMC, FMM, FMU family devices (exclude FMB6YX, [[FMC640]], [[FMM640]])
 +
| style="vertical-align: middle; text-align: center;" |Available in base firmware
 +
| style="vertical-align: middle; text-align: center;" |Available in base firmware
 +
|-
 +
| style="vertical-align: middle; text-align: left;" |FMB6YX
 +
| style="vertical-align: middle; text-align: center;" |Available in base firmware
 +
| style="vertical-align: middle; text-align: center;" |Since base firmware 00.02.19
 +
|-
 +
| style="vertical-align: middle; text-align: left;" |[[FMC640]], [[FMM640]]
 +
| style="vertical-align: middle; text-align: center;" |Available in base firmware
 +
| style="vertical-align: middle; text-align: center;" |Available in base firmware
 +
|-
 +
|} <br />
 +
'''Note:''' “SMS over GPRS” means that all standard SMS commands text can be sent to the device via GPRS in Codec12 format. <br>
 +
'''Note:''' UDP commands are sent the same exact way as TCP commands.
  
Example:
+
*'''<big>GPRS command session</big>'''
  
Module connects to server and sends IMEI:
+
The following figure shows how the GRPS command session is started over TCP. <br>
 +
[[File:Codec12.png|1150px]]
 +
First, the Teltonika device opens the GPRS session and sends AVL data to the server (refer device protocols). Once all records are sent and correct sent data array acknowledgment is received by device then GPRS commands in Hex can be sent to the device. <br>
 +
The ACK (acknowledge of IMEI from server) is a one-byte constant 0x01. The acknowledgment of each data array send from the device is four bytes integer – the number of records received. <br>
 +
Note, that the GPRS session should remain active between device and server, while GPRS commands are sent. For this reason, active datalink timeout (global parameters in device configuration) is recommended to be set to 259200 (maximum value). <br>
  
000f333536333037303432343431303133
+
*'''<big>General Codec12 message structure</big>'''
  
Server accepts the module:
+
The following diagram shows basic structure of Codec12 messages. <br> <br>
 
+
'''Command message structure:'''
01
+
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |0x00000000 (Preamble)
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Data Size
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec ID
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Command Quantity 1
 +
! colspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Type (0x05)
 +
! rowspan="1" style="width:14%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Command Size
 +
! rowspan="1" style="width:14%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Command
 +
! rowspan="1" style="width:14%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Command Quantity 2
 +
! rowspan="1" style="width:14%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |CRC-16
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |X bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
|-
 +
|}
  
  
Module sends data packet
+
'''Response message structure:'''
{| class="wikitable"
+
{| class="nd-othertables_2" style="width:100%;"
|-
+
|+
!style="background: black; color: white;"| AVL data packet header !!style="background: black; color: white;"| AVL data array !!style="background: black; color: white;"| CRC
+
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |0x00000000 (Preamble)
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Data Size
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec ID
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Response Quantity 1
 +
! colspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Type (0x06)
 +
! rowspan="1" style="width:14%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Response Size
 +
! rowspan="1" style="width:14%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Response
 +
! rowspan="1" style="width:14%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Response Quantity 2
 +
! rowspan="1" style="width:14%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |CRC-16
 
|-
 
|-
| Four zero bytes,
+
| style="vertical-align: middle; text-align: center;" |4 bytes
‘AVL data array’ length – 254
+
| style="vertical-align: middle; text-align: center;" |4 bytes
|| Codec Id – 8E, NumberOfData – 02.
+
| style="vertical-align: middle; text-align: center;" |1 byte
(Encoded using continuous bit stream.
+
| style="vertical-align: middle; text-align: center;" |1 byte
 
+
| style="vertical-align: middle; text-align: center;" |1 byte
Last byte padded to align to byte boundary)
+
| style="vertical-align: middle; text-align: center;" |4 bytes
|| CRC of ‘AVL data array’
+
| style="vertical-align: middle; text-align: center;" |X bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 
|-
 
|-
| 00000000000000FE || 8E02...(data elements)...02 || 00008612
 
 
|}
 
|}
<small>Table 8. IO element structure
 
</small>
 
  
Server acknowledges data reception (2 data elements):
 
00000002
 
  
*'''Example'''
+
'''Preamble''' - the packet starts with four zero bytes. <br>
 +
'''Data Size''' - size is calculated from Codec ID field to the second command or response quantity field. <br>
 +
'''Codec ID''' - in Codec12 it is always <code>0x0C</code>. <br>
 +
'''Command/Response Quantity 1''' - it is ignored when parsing the message. <br>
 +
'''Type''' - it can be 0x05 to denote command or 0x06 to denote response. <br>
 +
'''Command/Response Size''' – command or response length. <br>
 +
'''Command/Response''' – command or response in HEX. <br>
 +
'''Command/Response Quantity 2''' - a byte which defines how many records (commands or responses) is in the packet. This byte will not be parsed but it’s recommended that it should contain same value as Command/Response Quantity 1. <br>
 +
'''CRC-16''' – calculated from Codec ID to the Command Quantity 2. CRC (Cyclic Redundancy Check) is an error-detecting code using for detect accidental changes to RAW data. For calculation we are using [[Codec#CRC-16|CRC-16/IBM]].<br> <br>
 +
Note that difference between commands and responses is message type field: <code>0x05</code> means command and <code>0x06</code> means response. <br>
  
Received data:
+
*'''<big>Command coding table</big>'''
  
[[Image:Ggg.png|Ggg.png]]
+
Command has to be converted from ASCII characters (char) to hexadecimal (HEX): <br>
 +
[[File:ASCII.png]] <br>
  
00000000 4 zeros, 4 bytes
+
*'''<big>Command parsing example</big>'''
  
0000005F data length, 4 bytes
+
Hexadecimal stream of command and answer in this example is given in hexadecimal form. The different fields of the message are separated into different table columns for better readability and understanding. <br>
  
8E – Codec ID
+
*'''<big>GPRS commands examples</big>'''
  
01- Number of Data (1 record)
+
Hexadecimal stream of GPRS command and answer in these examples are given in hexadecimal form. The different fields of messages are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding. <br> <br>
 +
'''1'st example:''' Sending ''[[FMB getinfo|getinfo]]'' SMS command via GPRS Codec12 <br> <br>
 +
Server request in hexadecimal stream: <br>
 +
<code>000000000000000F0C010500000007676574696E666F0100004312</code> <br> <br>
 +
Parsed:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="2" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Server Command
 +
|-
 +
! rowspan="1" style="width:14%; vertical-align: middle; text-align: center;" |Server Command Part
 +
! rowspan="1" style="width:14%; vertical-align: middle; text-align: center;" |HEX Code Part
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Zero Bytes
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Data Size
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 0F
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |0C
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Command Quantity 1
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Command Type
 +
| style="vertical-align: middle; text-align: center;" |05
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Command Size
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 07
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Command
 +
| style="vertical-align: middle; text-align: center;" |67 65 74 69 6E 66 6F
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Command Quantity 2
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |CRC-16
 +
| style="vertical-align: middle; text-align: center;" |00 00 43 12
 +
|-
 +
|}
  
1’st record data
 
  
0000015FBA40B620– Timestamp in milliseconds (1510658324000)
+
Note that Server Command converted from HEX to ASCII means ''[[FMB getinfo|getinfo]]'' <br> <br>
 +
Device response in hexadecimal stream:  <br>
 +
<code>00000000000000900C010600000088494E493A323031392F372F323220373A3232205254433A323031392F372F323220373A3533205253543A32204552523A</code>
 +
<code>312053523A302042523A302043463A302046473A3020464C3A302054553A302F302055543A3020534D533A30204E4F4750533A303A3330204750533A312053</code>
 +
<code>41543A302052533A332052463A36352053463A31204D443A30010000C78F</code> <br> <br>
 +
Parsed:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="2" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Device Answer
 +
|-
 +
! rowspan="1" style="width:50%; vertical-align: middle; text-align: center;" |Device Answer Part
 +
! rowspan="1" style="width:50%; vertical-align: middle; text-align: center;" |HEX Code Part
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Zero Bytes
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Data Size
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 90
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |0C
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Response Quantity 1
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Response Type
 +
| style="vertical-align: middle; text-align: center;" |06
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Response Size
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 88
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Response
 +
| style="vertical-align: middle; text-align: center;" |49 4E 49 3A 32 30 31 39 2F 37 2F 32 32 20 37 3A 32 32 20 52 54 43 3A 32 30 31 39 2F 37 2F 32 32 20 37 3A 35 33 20 52 53 54 3A 32 20 45 52 52 3A 31 20 53 52 3A 30 20 42 52 3A 30 20 43 46 3A 30 20 46 47 3A 30 20 46 4C 3A 30 20 54 55 3A 30 2F 30 20 55 54 3A 30 20 53 4D 53 3A 30 20 4E 4F 47 50 53 3A 30 3A 33 30 20 47 50 53 3A 31 20 53 41 54 3A 30 20 52 53 3A 33 20 52 46 3A 36 35 20 53 46 3A 31 20 4D 44 3A 30
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Response Quantity 2
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |CRC-16
 +
| style="vertical-align: middle; text-align: center;" |00 00 C7 8F
 +
|-
 +
|} <br>
 +
Note that Device Response converted from HEX to ASCII means: <br>
 +
''INI:2019/7/22 7:22 RTC:2019/7/22 7:53 RST:2 ERR:1 SR:0 BR:0 CF:0 FG:0 FL:0 TU:0/0 UT:0 SMS:0 NOGPS:0:30 GPS:1 SAT:0 RS:3 RF:65 SF:1 MD:0'' <br>
  
GMT: Tuesday, November 14, 2017 11:18:44 AM
+
'''2'nd example:''' Sending ''[[FMB getio|getio]]'' SMS command via GPRS Codec12 <br><br>
 +
Server request in hexadecimal stream: <br>
 +
<code>000000000000000D0C010500000005676574696F01000000CB</code> <br> <br>
 +
Parsed:  
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="2" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Server Command
 +
|-
 +
! rowspan="1" style="width:50%; vertical-align: middle; text-align: center;" |Server Command Part
 +
! rowspan="1" style="width:50%; vertical-align: middle; text-align: center;" |HEX Code Part
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Zero Bytes
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Data Size
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 0D
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |0C
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Command Quantity 1
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Command Type
 +
| style="vertical-align: middle; text-align: center;" |05
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Command Size
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 05
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Command
 +
| style="vertical-align: middle; text-align: center;" |67 65 74 69 6F
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Command Quantity 2
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |CRC-16
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 CB
 +
|-
 +
|}
  
00 – Priority
 
  
GPS Element
+
Note that Server Command converted from HEX to ASCII means ''[[FMB getio|getio]]'' <br> <br>
 +
Device response in hexadecimal stream:  <br>
 +
<code>00000000000000370C01060000002F4449313A31204449323A30204449333A302041494E313A302041494E323A313639323420444F313A3020444F323A3101000066E3</code> <br> <br>
 +
Parsed:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="2" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Device Answer
 +
|-
 +
! rowspan="1" style="width:50%; vertical-align: middle; text-align: center;" |Device Answer Part
 +
! rowspan="1" style="width:50%; vertical-align: middle; text-align: center;" |HEX Code Part
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Zero Bytes
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Data Size
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 37
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |0C
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Response Quantity 1
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Response Type
 +
| style="vertical-align: middle; text-align: center;" |06
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Response Size
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 2F
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Response
 +
| style="vertical-align: middle; text-align: center;" |44 49 31 3A 31 20 44 49 32 3A 30 20 44 49 33 3A 30 20 41 49 4E 31 3A 30 20 41 49 4E 32 3A 31 36 39 32 34 20 44 4F 31 3A 30 20 44 4F 32 3A 31
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Response Quantity 2
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |CRC-16
 +
| style="vertical-align: middle; text-align: center;" |00 00 66 E3
 +
|-
 +
|}
  
0F0DCDE4                      – Longitude 252562916 = 25, 2562916º N
 
  
20959D30                        – Latitude 546676016 = 54,6676016 º E
+
Note that Device Response converted from HEX to ASCII means: <br>
 +
''DI1:1 DI2:0 DI3:0 AIN1:0 AIN2:16924 DO1:0 DO2:1'' <br>
  
008A      – Altitude 138 meters
+
*'''<big>Communication with server</big>'''
  
0000      – Angle 0º
+
The GSM/GPRS commands can be sent from a terminal program. We recommend to use Hercules (in TCP server mode). Simply write command as explained below into Hercules Send field, check HEX box and click Send button. Note that the TCP server must be listening on specified port (see Port field and Listen button below).
  
06                                    – 6 Visible sattelites
+
[[File:Hercules.jpeg]]
 +
<br>
  
0000      – 0 km/h speed
+
*'''<big>FMXX and Codec12 functionality</big>'''
 +
*'''Garmin'''
  
IO Element
+
All information is provided in “FMXX and Garmin development.pdf” document. <br>
  
0000 – IO element ID of Event generated (in this case when 0000 – data generated not on event)
+
*'''COM TCP Link Mode'''
  
0006 – 6 IO elements in record (total)
+
All information is provided in “FMxx TCP Link mode test instructions.pdf” document.
  
0001 – 1 IO elements, which length is 1 Byte
+
=='''<big>Codec 13</big>'''==
  
00EF            – IO element ID = 239 (dec)
+
*'''<big>About Codec13</big>'''
  
00                – IO element’s value
+
Codec13 is original Teltonika protocol for device-server communication over GPRS messages. This protocol is necessary for using following FM features: COM TCP Link Mode (binary/ASCII/binary buffered/ASCII buffered) if message timestamp parameter is enabled in device configuration. Codec13 messages are one way only (Device → Server sending).<br>
  
0001 – 1 IO elements, which length is 2 Byte
+
*'''<big>General Codec13 message structure</big>'''
  
0011            – IO element ID = 17 (dec )
+
The following diagram shows basic structure of Codec 13 messages:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |0x00000000 (Preamble)
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Data Size
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec ID
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Response Quantity 1
 +
! colspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Type
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Response Size
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Timestamp
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Response
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Response Quantity 2
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |CRC-16
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |X bytes
 +
| style="vertical-align: middle; text-align: center;" |1 byte
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
|-
 +
|}
  
001E            – IO element’s value
 
  
0001 – 1 IO elements, which length is 4 Byte
+
'''Preamble''' the packet starts with preamble field (four zero bytes). <br>
 +
'''Data Size''' – size is calculated from Codec ID field to the second Response Quantity field. <br>
 +
'''Codec ID''' – in Codec13 it is always <code>0x0D</code>. <br>
 +
'''Response Quantity 1''' – <code>0x01</code>, it is ignored when parsing the message. <br>
 +
'''Response Type''' – it is always <code>0x06</code> since the packet is direction is FM->Server. <br>
 +
'''Response Size''' – response size field includes size of timestamp too, so it is equal to size of payload + size of timestamp. <br>
 +
'''Timestamp''' – a difference, in seconds, between the current time and midnight, January, 1970 UTC (UNIX time). <br>
 +
'''Response''' – actual received data. <br>
 +
'''Response Quantity 2''' – a byte which defines how many records (responses) is in the packet. This byte will not be parsed but it’s recommended that it should contain same value as Response Quantity 1. <br>
 +
'''CRC-16''' – calculated from Codec ID to the Second Number of Data. CRC (Cyclic Redundancy Check) is an error-detecting code using for detect accidental changes to RAW data. For calculation we are using [[Codec#CRC-16|CRC-16/IBM]].<br> <br>
 +
'''Note:''' Codec13 packets are used only when “Message Timestamp” parameter in RS232 settings is enabled. <br>
  
0010            – IO element ID = 16 (dec )
+
*'''<big>Command parsing example</big>'''
  
0000CBDF  – IO element’s value
+
Hexadecimal stream of GPRS command in this example is given in hexadecimal form. The different fields of message are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding. <br> <br>
 
+
Receiving "hello lets test" SMS response via GPRS Codec13<br> <br>
0002 – 2 IO elements, which length is 2 Byte
+
Hexadecimal stream: <br>
 
+
<code>000000000000001D0D01060000001564E8328168656C6C6F206C65747320746573740D0A0100003548</code> <br> <br>
000B  – IO element ID = 11 (dec )
+
Parsed:
 
+
{| class="nd-othertables_2" style="width:100%;"
000000003544C875 – IO element’s value
+
|+
 
+
! colspan="2" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Device answer
000E  – IO element ID = 14 (dec )
+
|-
 
+
! rowspan="1" style="width:50%; vertical-align: middle; text-align: center;" |Device answer part
0000000029BFE4D1  – IO element’s value
+
! rowspan="1" style="width:50%; vertical-align: middle; text-align: center;" |HEX Code Part
 
+
|-
01  – Number of Data (1 record)
+
| style="vertical-align: middle; text-align: center;" |Zero Bytes
 
+
| style="vertical-align: middle; text-align: center;" |00 00 00 00
0000D153  – CRC-16, 4 Bytes (first 2 are always zeros
+
|-
 
+
| style="vertical-align: middle; text-align: center;" |Data Size
 
+
| style="vertical-align: middle; text-align: center;" |00 00 00 1D
'''<big>Codec 8 extended protocol sending over UDP</big>'''
+
|-
 
+
| style="vertical-align: middle; text-align: center;" |Codec ID
*'''AVL data packet'''
+
| style="vertical-align: middle; text-align: center;" |0D
 
+
|-
AVL data packet is the same as with codec 8, except codec ID is changed to 0x8E.
+
| style="vertical-align: middle; text-align: center;" |Response Quantity 1
 
+
| style="vertical-align: middle; text-align: center;" |01
 
+
|-
Example:
+
| style="vertical-align: middle; text-align: center;" |Response Type
 
+
| style="vertical-align: middle; text-align: center;" |06
Module sends the data:
 
{| class="wikitable"
 
 
|-
 
|-
!style="background: black; color: white;"| UDP channel header !!style="background: black; color: white;"| AVL packet header !!style="background: black; color: white;"| AVL data array
+
| style="vertical-align: middle; text-align: center;" |Response Size
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 15
 
|-
 
|-
| Len – 253,
+
| style="vertical-align: middle; text-align: center;" |Timestamp
Id – 0xCAFE, Packet type – 01
+
| style="vertical-align: middle; text-align: center;" |64 E8 32 81
|| AVL packet id – 0xDD,
 
IMEI – 1234567890123456
 
|| Codec Id – 8E, NumberOfData – 02.
 
(Encoded using continuous bit stream
 
 
 
 
|-
 
|-
| 00FDCAFE01 || DD000F3133343536373839303132333435 ||8E02…(data elements)…02
+
| style="vertical-align: middle; text-align: center;" |Response
|}
+
| style="vertical-align: middle; text-align: center;" |68 65 6C 6C 6F 20 6C 65 74 73 20 74 65 73 74 0D 0A
<small>Table 9. Example packet send to server</small>
 
 
 
 
 
Server must respond with acknowledgment:
 
{| class="wikitable"
 
 
|-
 
|-
!style="background: black; color: white;"| UDP channel header!!style="background: black; color: white;"| AVL packet acknowledgment
+
| style="vertical-align: middle; text-align: center;" |Response Quantity 2
 +
| style="vertical-align: middle; text-align: center;" |01
 
|-
 
|-
| Len – 5,
+
| style="vertical-align: middle; text-align: center;" |CRC-16
Id – 0xCAFE, Packet type – 01
+
| style="vertical-align: middle; text-align: center;" |00 00 35 48
|| AVL packet id -0xDD
 
Number of Accepted Data -2
 
 
|-
 
|-
| 0005CAFE01 || DD02
+
|}  
|}
 
<small>Table 10.  Example packet server response</small>
 
  
  
Example
+
Note that Server Response converted from HEX to ASCII means "hello lets test"
  
Server received data:
+
=='''<big>Codec 14</big>'''==
  
[[Image:Penkt.png|Penkt.png]]
+
*'''<big>About Codec14</big>'''
  
'''Data length''': 00a1 or 161 Bytes (not counting the first 2 data length bytes)
+
Codec14 is original Teltonika protocol for device-server communication over GPRS messages and it is based on Codec12 protocol. <br>
 +
Main difference of Codec14 is that, device will answer to GPRS command if device physical IMEI number matches specified IMEI number in GPRS command. <br>
  
'''Packet identification''': 0xCAFE 2 bytes
+
Codec14 GPRS commands can be used for sending configuration, debug, digital outputs control commands or other (special purpose command on special firmware versions). <br>
  
'''Packet type''': 01
+
*'''<big>FMB firmware requirements</big>'''
  
'''Packet id''': 1b
+
Implemented in base firmware from FMB.Ver.03.25.04.Rev.00 and newer. <br>
  
'''Imei length''': 000f
+
*'''<big>General Codec14 message structure</big>'''
  
'''Actual imei''': 333536333037303432343431303133
+
The following diagram shows basic structure of Codec14 messages. <br>
  
'''Codec id''': 8E
+
'''Command message structure'''
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |0x00000000 (preamble)
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Data size
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |0x0E (Codec ID)
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Command quantity
 +
! colspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |0x05<br>(Message type)
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Command size + IMEI size (8 bytes)
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |IMEI (HEX)
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Command
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Command quantity
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |CRC-16
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |1 bytes
 +
| style="vertical-align: middle; text-align: center;" |1 bytes
 +
| style="vertical-align: middle; text-align: center;" |1 bytes
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |8 bytes
 +
| style="vertical-align: middle; text-align: center;" |X bytes
 +
| style="vertical-align: middle; text-align: center;" |1 bytes
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
|-
 +
|}
  
'''Number of data''': 01
 
  
'''Timestamp''': 0000013febdd19c8
+
'''Response message structure'''
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |0x00000000 (preamble)
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Data size
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |0x0E (Codec ID)
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Response quantity
 +
! colspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |0x06 / 0x11 (Message type)
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Response size + IMEI size (8 bytes)
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |IMEI (HEX)
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Response
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Response quantity
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |CRC-16
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |1 bytes
 +
| style="vertical-align: middle; text-align: center;" |1 bytes
 +
| style="vertical-align: middle; text-align: center;" |1 bytes
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
| style="vertical-align: middle; text-align: center;" |8 bytes
 +
| style="vertical-align: middle; text-align: center;" |X bytes
 +
| style="vertical-align: middle; text-align: center;" |1 bytes
 +
| style="vertical-align: middle; text-align: center;" |4 bytes
 +
|-
 +
|}
  
'''Priority''': 00
 
  
'''GPS data''':  0f0e9ff0209a718000690000120000
+
'''Preamble''' – the packet starts with four zero bytes. <br>
 +
'''Data Size''' – size is calculated from Codec ID field to the second command or response quantity field. <br>
 +
'''Codec ID''' – in Codec14 it is always <code>0x0E</code>. <br>
 +
'''Command/Response Quantity 1''' – it is ignored when parsing the message. <br>
 +
'''Type''' – if it is request command from server it has to contain 0x05. The response type field will contain <code>0x06</code> if it’s ACK or <code>0x11</code> if it’s nACK. <br>
 +
''Explanation:'' If command message IMEI is equal to actual device IMEI, received command will be executed and response will be sent with ACK (<code>0x06</code>) message type field value. If command message IMEI doesn’t match actual device IMEI, received command won’t be executed and response to server will be sent with nACK (<code>0x11</code>) message type field value. <br>
 +
'''Command/Response Size''' – command or response length. <br>
 +
''Note:'' make sure that size is IMEI size 8 + actual command size. Minimal value is 8 because Codec14 always contain IMEI and it’s 8 bytes. <br>
 +
'''IMEI (HEX)''' – it is send as HEX value. Example if device IMEI is 123456789123456 then IMEI data field will contain <code>0x0123456789123456</code> value. <br>
 +
'''Command/Response''' – command or response in HEX. <br>
 +
'''Command/Response Quantity 2''' - a byte which defines how many records (commands or responses) is in the packet. This byte will not be parsed but it’s recommended that it should contain same value as Command/Response Quantity 1. <br>'''CRC-16''' – calculated from Codec ID to the Second Number of Data. CRC (Cyclic Redundancy Check) is an error-detecting code using for detect accidental changes to RAW data. For calculation we are using [[Codec#CRC-16|CRC-16/IBM]].<br>
  
== <big>Codec 12 Nebaigta</big> ==
+
*'''<big>GPRS in Codec14 examples</big>'''
  
*'''About Codec12'''
+
Hexadecimal stream of GPRS command and answer in this example are given in hexadecimal form. The different fields of message are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding. <br> <br>
 +
Sending ''[[FMB getver|getver]]'' SMS command via GPRS Codec14: <br> <br>
 +
Server requests in Hexadecimal stream: <br>
 +
<code>00000000000000160E01050000000E0352093081452251676574766572010000D2C1</code> <br> <br>
 +
Parsed:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="2" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Server Command
 +
|-
 +
! rowspan="1" style="width:50%; vertical-align: middle; text-align: center;" |Server Command Part
 +
! rowspan="1" style="width:50%; vertical-align: middle; text-align: center;" |HEX Code Part
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Zero Bytes
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Data Size
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 16
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |0E
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Command Quantity 1
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Command Type
 +
| style="vertical-align: middle; text-align: center;" |05
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Command Size
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 0E
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |IMEI
 +
| style="vertical-align: middle; text-align: center;" |03 52 09 30 81 45 22 51
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Command
 +
| style="vertical-align: middle; text-align: center;" |67 65 74 76 65 72
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Command Quantity 2
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |CRC-16
 +
| style="vertical-align: middle; text-align: center;" |00 00 D2 C1
 +
|-
 +
|}
  
Codec12 is original Teltonika protocol for device-server communication over GPRS messages.
 
  
Codec12 GPRS commands can be used for sending configuration, debug, digital outputs control commands or other (special purpose command on special firmware versions).
+
Note that Server Command converted from HEX to ASCII means ''[[FMB getver|getver]]'' <br> <br>
This protocol is also necessary for using FMB63/FM63/FM5300/FM5500/FM4200 features like: Garmin, LCD communication, COM TCP Link Mode.
+
Device ACK response in hexadecimal stream: <br>
 +
<code>00000000000000AB0E0106000000A303520930814522515665723A30332E31382E31345F3034204750533A41584E5F352E31305F333333332048773A464D42313230</code>
 +
<code>204D6F643A313520494D45493A33353230393330383134353232353120496E69743A323031382D31312D323220373A313320557074696D653A3137323334204D4143</code>
 +
<code>3A363042444430303136323631205350433A312830292041584C3A30204F42443A3020424C3A312E362042543A340100007AAE</code> <br> <br>
 +
Parsed:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="2" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Device Answer
 +
|-
 +
! rowspan="1" style="width:50%; vertical-align: middle; text-align: center;" |Device Answer Part
 +
! rowspan="1" style="width:50%; vertical-align: middle; text-align: center;" |HEX Code Part
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Zero Bytes
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Data Size
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 37
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |0E
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Response Quantity 1
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Response Type
 +
| style="vertical-align: middle; text-align: center;" |06
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Response Size
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 A3
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |IMEI
 +
| style="vertical-align: middle; text-align: center;" |03 52 09 30 81 45 22 51
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Response
 +
| style="vertical-align: middle; text-align: center;" |56 65 72 3A 30 33 2E 31 38 2E 31 34 5F 30 34 20 47 50 53 3A 41 58 4E 5F 35 2E 31 30 5F 33 33 33 33 20 48 77 3A 46 4D 42 31 32 30 20 4D 6F 64 3A 31 35 20 49 4D 45 49 3A 33 35 32 30 39 33 30 38 31 34 35 32 32 35 31 20 49 6E 69 74 3A 32 30 31 38 2D 31 31 2D 32 32 20 37 3A 31 33 20 55 70 74 69 6D 65 3A 31 37 32 33 34 20 4D 41 43 3A 36 30 42 44 44 30 30 31 36 32 36 31 20 53 50 43 3A 31 28 30 29 20 41 58 4C 3A 30 20 4F 42 44 3A 30 20 42 4C 3A 31 2E 36 20 42 54 3A 34
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Response Quantity 2
 +
| style="vertical-align: middle; text-align: center;" |01
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |CRC-16
 +
| style="vertical-align: middle; text-align: center;" |00 00 7A AE
 +
|-
 +
|}
  
Note: GPRS commands are supported only through TCP connection
 
  
*'''FM firmware requirements'''
+
Note that Device Response converted from HEX to ASCII means: <br>
 
+
''Ver:03.18.14_04 GPS:AXN_5.10_3333 Hw:FMB120 Mod:15 IMEI:352093081452251 Init:2018-11-22 7:13 Uptime:17234 MAC:60BDD0016261 SPC:1(0) AXL:0 OBD:0 BL:1.6 BT:4'' <br> <br>
Supported GPRS commands on each device depend on firmware version. For available GPRS commands on each device, please refer to Table1 FM firmware requirement “SMS over GPRS” means that all standard SMS commands text can be sent to device via GPRS in Codec12 format.
+
Device nACK response in hexadecimal stream: <br>
 
+
<code>00000000000000100E011100000008035209308145246801000032AC</code> <br> <br>
{| class="wikitable"
+
Parsed:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="2" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Device Answer
 +
|-
 +
! rowspan="1" style="width:50%; vertical-align: middle; text-align: center;" |Device Answer Part
 +
! rowspan="1" style="width:50%; vertical-align: middle; text-align: center;" |HEX Code Part
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Zero Bytes
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 00
 
|-
 
|-
!style="background: black; color: white;"| Device !!style="background: black; color: white;"| SMS over GPRS !!style="background: black; color: white;"| SMS over GPRS via UDP !!style="background: black; color: white;"| Special Codec12 GPRS commands
+
| style="vertical-align: middle; text-align: center;" |Data Size
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 10
 
|-
 
|-
| FM11YX || Available since base firmware 01.11.XX || Since base firmware
+
| style="vertical-align: middle; text-align: center;" |Codec ID
1.26.00
+
| style="vertical-align: middle; text-align: center;" |0E
|| Available in FM1100 and FM1110 special firmware version 12.XX.XX*
 
 
|-
 
|-
| FM12YX || Available since base firmware 01.03.XX || - || Available in FM12YX special firmware 09.XX.XX*
+
| style="vertical-align: middle; text-align: center;" |Response Quantity 1
 +
| style="vertical-align: middle; text-align: center;" |01
 
|-
 
|-
| FM10YX || Available since base firmware 00.03.XX || - || Available since base firmware 00.06.XX and later versions**
+
| style="vertical-align: middle; text-align: center;" |Response Type
 +
| style="vertical-align: middle; text-align: center;" |11
 
|-
 
|-
| FM3400 || Available since base firmware 01.01.XX || - || -
+
| style="vertical-align: middle; text-align: center;" |Response Size
 +
| style="vertical-align: middle; text-align: center;" |00 00 00 08
 
|-
 
|-
| FM36YX || Available in base firmware || Since base firmware 01.06.01 || -
+
| style="vertical-align: middle; text-align: center;" |IMEI
 +
| style="vertical-align: middle; text-align: center;" |03 52 09 30 81 45 24 68
 
|-
 
|-
| FM5300 || Available in all firmware versions || - || Available in all firmware versions**
+
| style="vertical-align: middle; text-align: center;" |Response Quantity 2
 +
| style="vertical-align: middle; text-align: center;" |01
 
|-
 
|-
| FM5500 || Available in all firmware versions || - || Available in all firmware versions**
+
| style="vertical-align: middle; text-align: center;" |CRC-16
 +
| style="vertical-align: middle; text-align: center;" |00 00 32 AC
 
|-
 
|-
| FM2200 || Not available || - || Special firmware version 07.XX.XX*
+
|} <br />
 +
 
 +
=='''<big>Differences between Codec 12, Codec 13 and Codec 14</big>'''==
 +
In the table below you will see differences between Codec12, Codec13 and Codec14.
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec12
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec13
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Codec14
 
|-
 
|-
| FM4200 || Not available || - || Special firmware version 42.XX.XX*
+
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |Communication
 +
| style="vertical-align: middle; text-align: center;" |Server ⇄ Device Communication
 +
| style="vertical-align: middle; text-align: center;" |One-way (Device → Server communication)
 +
| style="vertical-align: middle; text-align: center;" |Server ⇄ Device Communication
 
|-
 
|-
| FM63YX || Available in all firmware versions || Since base firmware 00.02.19 || Available in all firmware versions**
+
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |Codec ID
 +
| style="vertical-align: middle; text-align: center;" |0x0C
 +
| style="vertical-align: middle; text-align: center;" |0x0D
 +
| style="vertical-align: middle; text-align: center;" |0x0E
 
|-
 
|-
| FMB9YX || Available in base firmware || Available in base firmware || -
+
! style="vertical-align: middle; text-align: center;" |command message type
 +
| style="vertical-align: middle; text-align: center;" |0x05
 +
| style="vertical-align: middle; text-align: center;" |-
 +
| style="vertical-align: middle; text-align: center;" |0x05
 
|-
 
|-
| FMB0YX || Available in base firmware || Available in base firmware || -
+
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |Response Message Type
 +
| style="vertical-align: middle; text-align: center;" |0x06
 +
| style="vertical-align: middle; text-align: center;" | 0x06
 +
| style="vertical-align: middle; text-align: center;" |0x06 (if it is ACK) or 0x11 (if it is nACK)
 
|-
 
|-
| FMB1YX || Available in base firmware || Available in base firmware || -
+
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |Command / Response size
 +
| style="vertical-align: middle; text-align: center;" |Command/Response
 +
| style="vertical-align: middle; text-align: center;" |Only Response
 +
| style="vertical-align: middle; text-align: center;" |Command/Response + IMEI
 
|-
 
|-
| FMB6YX || Available in all firmware versions || Since base firmware 00.02.19 || Available in all firmware versions**
+
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |Timestamp
 +
| style="vertical-align: middle; text-align: center;" |Not Using
 +
| style="vertical-align: middle; text-align: center;" |Is Using
 +
| style="vertical-align: middle; text-align: center;" |Not Using
 
|-
 
|-
| FMA1YX || Available in base firmware || Since base firmware 1.26.00 || Available in special firmware version 12.XX.XX*
+
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |IMEI
 +
| style="vertical-align: middle; text-align: center;" |Not Using
 +
| style="vertical-align: middle; text-align: center;" |Not Using
 +
| style="vertical-align: middle; text-align: center;" |Is Using
 
|-
 
|-
| FMA2YX || Available in base firmware || Available in base firmware || -
+
|} <br />
|}
 
<small>Table 1. FM firmware requirement</small>
 
  
'*' - supported special commands are listed on special firmware description. Please contact Your Teltonika sales manager for more details;
+
='''<big>24 Position SMS Data Protocol</big>'''=
  
'**' - supported special commands are listed on device user manual, chapter “GPRS Commands”
+
24-hour SMS is usually sent once every day and contains GPS data of last 24 hours. TP-DCS field of this SMS should indicate that message contains 8-bit data (i.e. TP-DCS can be <code>0x04</code>). <br>
 +
Note, that 24 position data protocol is used only with subscribed SMS. Event SMS use standard AVL data protocol. <br>
  
 +
*'''<big>Encoding</big>'''
  
 +
To be able to compress 24 GPS data entries into one SMS (140 octets), the data is encoded extensively using bit fields. Data packet can be interpreted as a bit stream, where all bits are numbered as follows:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Byte 1
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Byte 2
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Byte 3
 +
! rowspan="1" style="width:10%; border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |Byte 4 ...
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |Bits 0 - 7
 +
| style="vertical-align: middle; text-align: center;" |Bits 8 - 15
 +
| style="vertical-align: middle; text-align: center;" |Bits 16 - 24
 +
| style="vertical-align: middle; text-align: center;" |Bits 25 - ...
 +
|-
 +
|}
  
*'''GPRS command session'''
 
  
Following figure shows how GRPS command session is started over TCP.
+
Bits in a byte are numbered starting from least significant bit. A field of 25 bits would consist of bits 0 to 24 where 0 is the least significant bit and bit 24 – most significant bit. <br>
[[Image:wq.png|wq.png]]
 
  
First FM opens GPRS session and sends AVL data to server (refer FM protocols). Once all records are sent and correct sent data array acknowledgment is received by FM then GPRS commands in Hex can be sent to FM.
+
*'''<big>Structure</big>'''
  
The ACK (acknowledge of IMEI from server) is a one byte constant 0x01. The acknowledgement of each data array send from FMXXXX is four bytes integer – number of records received.
+
Below in the tables you will see SMS Data Structure:
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
 +
! colspan="3" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |SMS Data Structure
 +
|-
 +
| style="width:10%; vertical-align: middle; text-align: center;" |8
 +
| style="width:10%; vertical-align: middle; text-align: center;" |Codec ID
 +
| style="width:10%; vertical-align: middle; text-align: center;" |Codec ID = 4 (0x04)
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |35
 +
| style="vertical-align: middle; text-align: center;" |Timestamp
 +
| style="vertical-align: middle; text-align: center;" |Time corresponding to the first (oldest) GPS data element, represented in seconds elapsed from 2000.01.01 00:00 EET.
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |5
 +
| style="vertical-align: middle; text-align: center;" |ElementCount
 +
| style="vertical-align: middle; text-align: center;" |Number of GPS data elements
 +
|-
 +
|} <br>
 +
{| class="nd-othertables_2" style="width:100%;"
 +
|+
  
Note, that GPRS session should remain active between FM and server, while GPRS commands are sent. For this reason active datalink timeout (global parameters in FMXXXX configuration) is recommended to be set to 259200 (maximum value).
+
! colspan="4" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |SMS Data Structure
 +
|-
 +
| rowspan="3" style="width:10%; vertical-align: middle; text-align: center;" |ElementCount *
 +
| style="width:10%; vertical-align: middle; text-align: center;" |
 +
| style="width:10%; vertical-align: middle; text-align: center;" |GPSDataElement
 +
| style="width:10%; vertical-align: middle; text-align: center;" |GPS data elements
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |
 +
| style="vertical-align: middle; text-align: center;" |Byte - align padding
 +
| style="vertical-align: middle; text-align: center;" |Padding bits to align to 8 - bits boundary represented in seconds elapsed from 2000.01.01 00:00 EET.
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |64
 +
| style="vertical-align: middle; text-align: center;" |IMEI
 +
| style="vertical-align: middle; text-align: center;" |IMEI of sending device as 8 byte long integer
 +
|-
 +
|}
  
  
*'''General Codec12 message structure'''
+
The time of only the first GPS data element is specified in Timestamp field. Time corresponding to each further element can be computed as elementTime = Timestamp + (1 hour * elementNumber). <br>
 
+
{| class="nd-othertables_2" style="width:100%;"
The following diagram shows basic structure of Codec 12 messages.
+
|+
 
+
! colspan="5" rowspan="1" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |GPS Data Element
 
+
|-
Command message structure
+
! rowspan="1" style="width:20%; vertical-align: middle; text-align: center;" |
{| class="wikitable"
+
! rowspan="1" style="width:20%; vertical-align: middle; text-align: center;" |
 +
! rowspan="1" style="width:12%; vertical-align: middle; text-align: center;" |Size (bits)
 +
! colspan="1" style="width:20%; vertical-align: middle; text-align: center;" |Field
 +
! rowspan="1" style="width:28%; vertical-align: middle; text-align: center;" |Description
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |
 +
| style="vertical-align: middle; text-align: center;" |
 +
| style="vertical-align: middle; text-align: center;" |1
 +
| style="vertical-align: middle; text-align: center;" |ValidElement
 +
| style="vertical-align: middle; text-align: center;" |ValidElement = 1 – there is a valid Gps Data Element following,
 +
ValidElement = 0 – no element at this position
 +
|-
 +
| rowspan="5" style="vertical-align: middle; text-align: center;" |ValidElement == 1
 +
| style="vertical-align: middle; text-align: center;" |
 +
| style="vertical-align: middle; text-align: center;" |1
 +
| style="vertical-align: middle; text-align: center;" |DifferentialCoords
 +
| style="vertical-align: middle; text-align: center;" |Format of following data
 +
|-
 +
| rowspan="2" style="vertical-align: middle; text-align: center;" |DifferentialCoords == 1
 +
| style="vertical-align: middle; text-align: center;" |14
 +
| style="vertical-align: middle; text-align: center;" |LongitudeDiff
 +
| style="vertical-align: middle; text-align: center;" |Difference from previous element‘s longitude.
 +
LongitudeDiff = prevLongitude – Longitude + 213 – 1
 +
|-
 +
| style="vertical-align: middle; text-align: center;" |14
 +
| style="vertical-align: middle; text-align: center;" |LatitudeDiff
 +
| style="vertical-align: middle; text-align: center;" |Difference from previous element‘s latitude
 +
LatitudeDiff = prevLatitude – Latitude + 213 – 1
 
|-
 
|-
! 0x00000000 !! Data size !! 0x0C !! Command quantity !! 0x05 !! Command size !! Command !! Command quantity !! CRC
+
| rowspan="2" style="vertical-align: middle; text-align: center;" |DifferentialCoords == 0
 +
| style="vertical-align: middle; text-align: center;" |21
 +
| style="vertical-align: middle; text-align: center;" |Longitude
 +
| style="vertical-align: middle; text-align: center;" |Longitude = {(LongDegMult + 18 * 108) * (221 – 1)} over {36*108}
 
|-
 
|-
| 4 bytes || 4 bytes || 1 byte || 1 byte || 1 byte || 4 bytes || X bytes || 1 byte || 4 bytes
+
| style="vertical-align: middle; text-align: center;" |20
|}
+
| style="vertical-align: middle; text-align: center;" |Latitude
 
+
| style="vertical-align: middle; text-align: center;" |Latitude = (LatDegMult + 9*108) * (220 – 1) over {18*108}
 
 
Response message structure
 
{| class="wikitable"
 
 
|-
 
|-
! 0x00000000 !! Data size !! 0x0C !! Command quantity !! 0x06 !! Command size !! Command !! Command quantity !! CRC
+
| style="vertical-align: middle; text-align: center;" |
 +
| style="vertical-align: middle; text-align: center;" |
 +
| style="vertical-align: middle; text-align: center;" |8
 +
| style="vertical-align: middle; text-align: center;" |Speed
 +
| style="vertical-align: middle; text-align: center;" |Speed in km/h
 
|-
 
|-
| 4 bytes || 4 bytes || 1 byte || 1 byte || 1 byte || 4 bytes || X bytes || 1 byte || 4 bytes
 
 
|}
 
|}
  
  
Structure explanation:
+
'''Longitude''' - longitude field value of GPSDataElement <br>
 +
'''Latitude''' - latitude field value of GPSDataElement <br>
 +
'''LongDegMult''' - longitude in degrees multiplied by 107 (integer part) <br>
 +
'''LatDegMult''' - latitude in degrees multiplied by 107 (integer part) <br>
 +
'''prevLongitude''' - longitude field value of previous GPSDataElemen <br>
 +
'''prevLatitude''' - latitude field value of previous GPSDataElement <br>
  
The message starts with preamble field - four zero bytes. Then goes four bytes data size field (size is calculated from 0x0C field to the second command or response quantity field). Then follows one byte Codec ID field (in Codec 12 it is always 0x0C). Then goes command or response quantity field (it is ignored when parsing the message). After that goes one byte message type field. It can be 0x05 to denote command or 0x06 to denote response. Then follows four bytes command or response size field. After it follows the command or response field itself.  After that goes the second command or response quantity field. At the end there’s four bytes CRC field.
+
*'''<big>Decoding GPS position</big>'''
  
Note that difference between commands and responses is message type field: 0x05 means command and 0x06 means response.
+
When decoding GPS data with DifferentialCoords = 1, Latitude and Longitude values can be computed as follows: Longitude = prevLongitude – LongitudeDiff + 213 – 1, Latitude = prevLatitude – LatitudeDiff + 213 – 1. <br>
 +
If there were no previous non-differential positions, differential coordinates should be computed assuming prevLongitude = prevLatitude = 0. <br>
 +
When Longitude and Latitude values are known, longitude and latitude representation in degrees can be computed as follows:
  
The algorithm to calculate CRC is CRC-16 (also known as CRC-16-IBM). All the fields from codec ID to second command/response quantity field are used to calculate CRC. The algorithm of how to calculate
+
[[File:24SMS.png]]
  
 +
*'''<big>SMS Events</big>'''
  
CRC is shown in Figure 3 CRC calculation algorithm.
+
When Configured to generate SMS event user will get this SMS upon event: <br>
 +
''<Year/Month/Day> <Hour:Minute:Second> P:<profile_nr> <SMS Text> Val:<Event Value> Lon:<longitude> Lat:<latitude> Q:<HDOP>'' <br> <br>
 +
Example: <br>
 +
''2016./04/11 12:00:00 P:3 Digital Input 1 Val:1 Lon:51.12258 Lat: 25.7461 Q:0.6'' <br>
  
[[Image:qqq.png|qqq.png]]
+
='''<big>Sending data using SMS</big>'''=
 +
This type data sending is using for FMBXXX devices which can be configured in [[FMB120 SMS/Call settings#SMS Data Sending|SMS Data Sending settings]].<br>
  
== <big>Codec 13 Nebaigta</big> ==
+
*'''<big>Data sending via SMS</big>'''
  
*'''About Codec13'''
+
AVL data or events can be sent encapsulated in binary SMS. TP-DCS field of these SMS should indicate that message contains 8-bit data (for example: TP-DCS can be <code>0x04</code>).  
 
+
{| class="nd-othertables_2" style="width:100%;"
Codec13 is original Teltonika protocol for device-server communication over GPRS messages. This protocol is necessary for using following FM features:  COM TCP Link Mode (binary/ASCII/binary buffered/ASCII buffered) if message timestamp parameter is enabled in device configuration. Codec13 messages are one way only (Codec 13 is used for FM->Server sending).
+
|+
 
+
! colspan="2" style="border-bottom: 2px solid #0054A6; vertical-align: middle; text-align: center;" |SMS data (TP-UD)
*'''FM firmware requirements'''
+
|-
 
+
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |AVL data array
Codec13 availability depends on device and firmware version.
+
! rowspan="1" style="width:10%; vertical-align: middle; text-align: center;" |IMEI
 
+
|-
== <big>Codec 16 Nebaigta</big> ==
+
| style="vertical-align: middle; text-align: center;" |X bytes
 
+
| style="vertical-align: middle; text-align: center;" |8 bytes
 
+
|-
*'''Description and example'''
+
|}
 
 
Records to server will be sended as shown in table bellow.
 
The main difference between CODEC8 and CODEC16 is CODEC ID which will be 0x10 instead of 0x08, AVL ID‘s in AVL data is sent in 2  bytes, instead of 1 byte.
 
  
'''Also new parameter – Generation type is adeed.'''
 
  
By receiving 0x10 codec ID server must know that AVL data record will be parsed different.
+
'''AVL data array''' – array of encoded AVL data. <br>
 +
'''IMEI''' – IMEI of sending module encoded as a big endian 8 byte long number.
  
Codec16 is supported from firmware – 00.03.xx and newer.  
+
='''<big>CRC-16</big>'''=
ll AVL ID‘s which are higher then 255 will can be used only in CODEC16 protocol.
+
CRC (Cyclic Redundancy Check) is an error-detecting code using for detect accidental changes to RAW data. The algorithm how to calculate CRC-16 (also known as CRC-16/IBM) you will find below. <br>
 +
[[File:CRC16.png]]

Latest revision as of 17:32, 7 May 2024

Introduction

A codec is a device or computer program for encoding or decoding a digital data stream or signal. Codec is a portmanteau of coder – decoder. A codec encodes a data stream or a signal for transmission and storage, possibly in encrypted form, and the decoder function reverses the encoding for playback or editing.

Below you will see a table of all Codec types with ID’s:

Codec 8 Codec 8 Extended Codec 16 Codec 12 Codec 13 Codec 14
0x08 0x8E 0x10 0x0C 0x0D 0x0E

Also, there are using two data transport protocols: TCP and UDP. But it is not important which one will be used in Codec.

Codec for device data sending

In this chapter you will find information about every Codec protocol which are using for device data sending and differences between them.

Codec 8

  • Protocol Overview

Codec8 – a main FM device protocol that is used for sending data to server.

  • Codec 8 protocol sending over TCP

TCP is a connection-oriented protocol that is used for communication between devices. The workings of this type of protocol is described below in the communication with server section.

  • AVL Data Packet

Below table represents AVL Data Packet structure:

0x00000000 (Preamble) Data Field Length Codec ID Number of Data 1 AVL Data Number of Data 2 CRC-16
4 bytes 4 bytes 1 byte 1 byte X bytes 1 byte 4 bytes


Preamble – the packet starts with four zero bytes.
Data Field Length – size is calculated starting from Codec ID to Number of Data 2.
Codec ID – in Codec8 it is always 0x08.
Number of Data 1 – a number which defines how many records is in the packet.
AVL Data – actual data in the packet (more information below).
Number of Data 2 – a number which defines how many records is in the packet. This number must be the same as “Number of Data 1”.
CRC-16 – calculated from Codec ID to the Second Number of Data. CRC (Cyclic Redundancy Check) is an error-detecting code using for detect accidental changes to RAW data. For calculation we are using CRC-16/IBM.

Note: for FMB630, FMB640 and FM63XY, minimum AVL record size is 45 bytes (all IO elements disabled). Maximum AVL record size is 255 bytes. Maximum AVL packet size is 512 bytes. For other devices, minimum AVL record size is 45 bytes (all IO elements disabled). Maximum AVL packet size is 1280 bytes.

  • AVL Data

Below table represents AVL Data structure.

Timestamp Priority GPS Element IO Element
8 bytes 1 byte 15 bytes X bytes


Timestamp – a difference, in milliseconds, between the current time and midnight, January, 1970 UTC (UNIX time).
Priority – field which define AVL data priority (more information below).
GPS Element – location information of the AVL data (more information below).
IO Element – additional configurable information from device (more information below).

  • Priority

Below table represents Priority values. Packet priority depends on device configuration and records sent.

Priority
0 Low
1 High
2 Panic


  • GPS element

Below table represents GPS Element structure:

Longitude Latitude Altitude Angle Satellites Speed
4 bytes 4 bytes 2 bytes 2 bytes 1 byte 2 bytes


Longitude – east – west position.
Latitude – north – south position.
Altitude – meters above sea level.
Angle – degrees from north pole.
Satellites – number of visible satellites.
Speed – speed calculated from satellites.

Note: If record are without valid coordinates – (there were no GPS fix in the moment of data acquisition) – Longitude, Latitude and Altitude values are last valid fix, and Angle, Satellites and Speed are 0.

Longitude and latitude are integer values built from degrees, minutes, seconds and milliseconds by formula:
GPS.png
Where:
d – Degrees; m – Minutes; s – Seconds; ms – Milliseconds; p – Precision (10000000)
If longitude is in west or latitude in south, multiply result by –1.

Note:
To determine if the coordinate is negative, convert it to binary format and check the very first bit. If it is 0, coordinate is positive, if it is 1, coordinate is negative.

Example:
Received value: 20 9C CA 80 converted to BIN: 00100000 10011100 11001010 10000000 first bit is 0, which means coordinate is positive converted to DEC: 547146368. For more information see two‘s complement arithmetic.

  • IO Element
Event IO ID 1 byte Event IO ID – if data is acquired on event – this field defines which IO property has changed and generated an event. For example, when if Ignition state changed and it generate event, Event IO ID will be 0xEF (AVL ID: 239). If it’s not eventual record – the value is 0.

N – a total number of properties coming with record (N = N1 + N2 + N4 + N8).
N1 – number of properties, which length is 1 byte.
N2 – number of properties, which length is 2 bytes.
N4 – number of properties, which length is 4 bytes.
N8 – number of properties, which length is 8 bytes.
N’th IO ID - AVL ID.
N’th IO Value - AVL ID value.

N of Total IO 1 byte
N1 of One Byte IO 1 byte
1’st IO ID 1 byte
1’st IO Value 1 byte
...
N1’th IO ID 1 byte
N1’th IO Value 1 byte
N2 of Two Bytes 1 byte
1’st IO ID 1 byte
1’st IO Value 2 bytes
...
N2’th IO ID 1 byte
N2’th IO Value 2 bytes
N4 of Four Bytes 1 byte
1’st IO ID 1 byte
1’st IO Value 4 bytes
...
N4’th IO ID 1 byte
N4’th IO Value 4 byte
N8 of Eight Bytes 1 byte
1’st IO ID 1 byte
1’st IO Value 8 byte
...
N8’IO ID 1 byte
N8’IO Value 8 bytes


  • Communication with server

First, when module connects to server, module sends its IMEI. First comes short identifying number of bytes written and then goes IMEI as text (bytes).
For example, IMEI 356307042441013 would be sent as 000F333536333037303432343431303133.
First two bytes denote IMEI length. In this case 0x000F means, that IMEI is 15 bytes long.
After receiving IMEI, server should determine if it would accept data from this module. If yes, server will reply to module 01, if not - 00. Note that confirmation should be sent as binary packet. I.e. 1 byte 0x01 or 0x00.
Then module starts to send first AVL data packet. After server receives packet and parses it, server must report to module number of data received as integer (four bytes).
If sent data number and reported by server doesn’t match module resends sent data.

  • Example:

Module connects to server and sends IMEI:
000F333536333037303432343431303133
Server accepts the module:
01
Module sends data packet:

AVL Data Packet Header AVL Data Array CRC-16
Four Zero Bytes – 0x00000000,

“AVL Data Array” length – 0x000000FE

Codec ID – 0x08,

Number of Data – 0x02
(Encoded using continuous bit stream. Last byte padded to align to byte boundary)

CRC of “AVL Data Array”
00000000000000FE 0802...(data elements)...02 00008612


Server acknowledges data reception (2 data elements): 00000002

  • Examples

Hexadecimal stream of AVL Data Packet receiving and response in these examples are given in hexadecimal form. The different fields of packets are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding.

1'st example
Receiving one data record with each element property (1 byte, 2 bytes, 4 byte and 8 byte).

Received data in hexadecimal stream:
000000000000003608010000016B40D8EA30010000000000000000000000000000000105021503010101425E0F01F10000601A014E0000000000000000010000C7CF

Parsed:

AVL Data Packet
AVL Data Packet Part HEX Code Part
Zero Bytes 00 00 00 00
Data Field Length 00 00 00 36
Codec ID 08
Number of Data 1 (Records) 01
AVL Data Timestamp 00 00 01 6B 40 D8 EA 30 (GMT: Monday, June 10, 2019 10:04:46 AM)
Priority 01
Longitude 00 00 00 00
Latitude 00 00 00 00
Altitude 00 00
Angle 00 00
Satellites 00
Speed 00 00
Event IO ID 01
N of Total ID 05
N1 of One Byte IO 02
1’st IO ID 15 (AVL ID: 21, Name: GSM Signal)
1’st IO Value 03
2’nd IO ID 01 (AVL ID: 1, Name: DIN1)
2’nd IO Value 01
N2 of Two Bytes IO 01
1’st IO ID 42 (AVL ID: 66, Name: External Voltage)
1’st IO Value 5E 0F
N4 of Four Bytes IO 01
1’st IO ID F1 (AVL ID: 241, Name: Active GSM Operator)
1’st IO Value 00 00 60 1A
N8 of Eight Bytes IO 01
1’st IO ID 4E (AVL ID: 78, Name: iButton)
1’st IO Value 00 00 00 00 00 00 00 00
Number of Data 2 (Number of Total Records) 01
CRC-16 00 00 C7 CF


Server response: 00000001

2'nd example
Receiving one data record with one or two different element properties (1 byte, 2 byte).

Received data in hexadecimal stream:
000000000000002808010000016B40D9AD80010000000000000000000000000000000103021503010101425E100000010000F22A

Parsed:

AVL Data Packet
AVL Data Packet Part HEX Code Part
Zero Bytes 00 00 00 00
Data Field Length 00 00 00 28
Codec ID 08
Number of Data 1 (Records) 01
AVL Data Timestamp 00 00 01 6B 40 D9 AD 80 (GMT: Monday, June 10, 2019 10:05:36 AM)
Priority 01
Longitude 00 00 00 00
Latitude 00 00 00 00
Altitude 00 00
Angle 00 00
Satellites 00
Speed 00 00
Event IO ID 01
N of Total ID 03
N1 of One Byte IO 02
1’st IO ID 15 (AVL ID: 21, Name: GSM Signal)
1’st IO Value 03
2’nd IO ID 01 (AVL ID: 1, Name: DIN1)
2’nd IO Value 01
N2 of Two Bytes IO 01
1’st IO ID 42 (AVL ID: 66, Name: External Voltage)
1’st IO Value 5E 10
N4 of Four Bytes IO 00
N8 of Eight Bytes IO 00
Number of Data 2 (Number of Total Records) 01
CRC-16 00 00 F2 2A


Server response: 00000001

3'rd example
Receiving two or more data records with one or more different element properties.

Received data in hexadecimal stream:
000000000000004308020000016B40D57B480100000000000000000000000000000001010101000000000000016B40D5C198010000000000000000000000000000000 101010101000000020000252C

Parsed:

AVL Data Packet
AVL Data Packet Part HEX Code Part
Zero Bytes 00 00 00 00
Data Field Length 00 00 00 43
Codec ID 08
Number of Data 1 (Records) 02
AVL Data

(1'st record)

Timestamp 00 00 01 6B 40 D5 7B 48 (GMT: Monday, June 10, 2019 10:01:01 AM)
Priority 01
Longitude 00 00 00 00
Latitude 00 00 00 00
Altitude 00 00
Angle 00 00
Satellites 00
Speed 00 00
Event IO ID 01
N of Total ID 01
N1 of One Byte IO 01
1’st IO ID 01 (AVL ID: 1, Name: DIN1)
1’st IO Value 00
N2 of Two Bytes IO 00
N4 of Four Bytes IO 00
N8 of Eight Bytes IO 00
AVL Data

(2'nd record)

Timestamp 00 00 01 6B 40 D5 C1 98 (GMT: Monday, June 10, 2019 10:01:19 AM)
Priority 01
Longitude 00 00 00 00
Latitude 00 00 00 00
Altitude 00 00
Angle 00 00
Satellites 00
Speed 00 00
Event IO ID 01
N of Total ID 01
N1 of One Byte IO 01
1’st IO ID 01 (AVL ID: 1, Name: DIN1)
1’st IO Value 01
N2 of Two Bytes IO 00
N4 of Four Bytes IO 00
N8 of Eight Bytes IO 00
Number of Data 2 (Number of Total Records) 02
CRC-16 00 00 25 2C


Server response: 00000002

  • Codec8 protocol sending over UDP

Codec8 protocol over UDP is a transport layer protocol above UDP/IP to add reliability to plain UDP/IP using acknowledgment packets.

  • AVL Data Packet

The packet structure is as follows:

UDP Datagram
Example 2 bytes
Packet ID 2 bytes
Not Usable Byte 1 byte
Packet Payload Variable


Example – packet length (excluding this field) in big ending byte order.
Packet ID – packet ID unique for this channel.
Not Usable Byte – not usable byte.
Packet payload – data payload.

  • Acknowledgment packet

Acknowledgment packet should have the same Packet ID as acknowledged data packet and empty Data Payload. Acknowledgement should be sent in binary format.

Acknowledgment Packet
Packet Length Packet ID Not Usable Byte
2 bytes 2 bytes 1 byte


Packet Length – packet length by sending/response data.
Packet ID – same as in acknowledgment packet.
Not Usable Byte – always will be 0x01.

  • Sending AVL Packet Payload using UDP channel

Below table represents Sending Packet Payload structure.

AVL data encapsulated in UDP channel packet
AVL Packet ID IMEI Length Module IMEI AVL Data Array
1 byte 2 bytes 15 bytes X bytes

AVL Packet ID – ID identifying this AVL packet.
IMEI Length – always will be 0x000F.
Module IMEI – IMEI of a sending module encoded the same as with TCP.
AVL Data Array – array of encoded AVL data (same as TCP AVL Data Array).

  • Server response Packet Payload using UDP channel

Below table represents Server Response Packet Payload structure.

Server Response to AVL Data Packet
AVL Packet ID Number of Accepted AVL Elements
1 byte 1 byte


  • Communication with server

Module sends UDP channel packet with encapsulated AVL data packet. Server sends UDP channel packet with encapsulated response module validates AVL Packet ID and Number of accepted AVL elements. If server response with valid AVL Packet ID is not received within configured timeout, module can retry sending.

  • Example:

Module sends the data:

UDP Channel Header AVL Packet Header AVL Data Array
Length – 0x00FE,

Packet ID – 0xCAFE
Not Usable Byte – 0x01

AVL Packet ID – 0xDD,

IMEI Length – 0x000F
IMEI – 0x313233343536373839303132333435 (Encoded using continuous bit stream. Last byte padded to align to byte boundary)

Codec ID – 0x08,

Number of Data – 0x02
(Encoded using continuous bit stream)

00FECAFE01 DD000F3133343536373839303132333435 0802…(data elements)…02


Server must respond with acknowledgment:

UDP Channel Header AVL Packet Acknowledgment
Length – 0x0005,

Packet ID – 0xCAFE, Not Usable Byte – 0x01

AVL Packet ID – 0xDD,

Number of Accepted Data – 0x02

0005CAFE01 DD02


  • Example

Hexadecimal stream of AVL Data Packet receiving and response in this example are given in hexadecimal form. The different fields of packet are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding.

Received data in hexadecimal stream:
003DCAFE0105000F33353230393330383634303336353508010000016B4F815B30010000000000000000000000000000000103021503010101425DBC000001

Parsed:

AVL Data Packet
AVL Data Packet Part HEX Code Part
UDP Channel Header Length 00 3D
Packet ID CA FE
Not usable byte 01
AVL Packet Header AVL packet ID 05
IMEI Length 00 0F
IMEI 33 35 32 30 39 33 30 38 36 34 30 33 36 35 35
AVL Data Array Codec ID 08
Number of Data 1 (Records) 01
Timestamp 00 00 01 6B 4F 81 5B 30 (GMT: Thursday, June 13, 2019 6:23:26 AM)
Priority 01
Longitude 00 00 00 00
Latitude 00 00 00 00
Altitude 00 00
Angle 00 00
Satellites 00
Speed 00 00
Event IO ID 01
N of Total ID 03
N1 of One Byte IO 02
1’st IO ID 15 (AVL ID: 21, Name: GSM Signal)
1’st IO Value 03
2’nd IO ID 01 (AVL ID: 1, Name: DIN1)
2’nd IO Value 01
N2 of Two Bytes IO 01
1’st IO ID 42 (AVL ID: 66, Name: External Voltage)
1’st IO Value 5D BC
N4 of Four Bytes IO 00
N8 of Eight Bytes IO 00
Number of Data 2 (Number of Total Records) 01


Server response in hexadecimal stream: 0005CAFE010501

Parsed:

Server Response to AVL Data Packet
Server Response Part HEX Code Part
UDP Channel Header Length 00 05
Packet ID CA FE
Not usable byte 01
AVL Packet Acknowledgment AVL packet ID 05
Number of Accepted Data 01


Codec 8 Extended

  • Protocols overview

Codec8 Extended is using for FMBXXX family devices. This protocol looks familiar like Codec8 but they have some differences. Main differences between are shown in below table:

Codec8 Codec8 Extended
Codec ID 0x08 0x8E
AVL Data IO element length 1 byte 2 bytes
AVL Data IO element total IO count length 1 byte 2 bytes
AVL Data IO element IO count length 1 byte 2 bytes
AVL Data IO element AVL ID length 1 byte 2 bytes
Variable size IO elements Does not include Includes variable size elements


  • Codec 8 Extended protocol sending over TCP
  • AVL data packet

Below table represents AVL data packet structure:

0x00000000 (Preamble) Data Field Length Codec ID Number of Data 1 AVL Data Number of Data 2 CRC-16
4 bytes 4 bytes 1 byte 1 byte X bytes 1 byte 4 bytes


Preamble – the packet starts with four zero bytes.
Data Field Length – size is calculated starting from Codec ID to Number of Data 2.
Codec ID – in Codec8 Extended it is always 0x8E.
Number of Data 1 – a number which defines how many records is in the packet.
AVL Data – actual data in the packet (more information below).
Number of Data 2 – a number which defines how many records is in the packet. This number must be the same as “Number of Data 1”.
CRC-16 – calculated from Codec ID to the Second Number of Data. CRC (Cyclic Redundancy Check) is an error-detecting code using for detect accidental changes to RAW data. For calculation we are using CRC-16/IBM.

Note: for FMB630, FMB640 and FM63XY, minimum AVL packet size is 45 bytes (all IO elements disabled). Maximum AVL packet size is 255 bytes. For other devices, minimum AVL packet size is 45 bytes (all IO elements disabled). Maximum AVL packet size is 1280 bytes.

  • AVL Data

Below table represents AVL Data structure:

Timestamp Priority GPS Element IO Element
8 bytes 1 byte 15 bytes X bytes


Timestamp – a difference, in milliseconds, between the current time and midnight, January, 1970 UTC (UNIX time).
Priority – field which define AVL data priority (more information below).
GPS Element – locational information of the AVL data (more information below).
IO Element – additional configurable information from device (more information below).

  • Priority

Below table represents Priority values. Packet priority depends on device configuration and records sent.

Priority
0 Low
1 High
2 Panic


  • GPS element

Below table represents GPS Element structure:

Longitude Latitude Altitude Angle Satellites Speed
4 bytes 4 bytes 2 bytes 2 bytes 1 byte 2 bytes


Longitude – east – west position.
Latitude – north – south position.
Altitude – meters above sea level.
Angle – degrees from north pole.
Satellites – number of visible satellites.
Speed – speed calculated from satellites.

Note: If record are without valid coordinates – (there were no GPS fix in the moment of data acquisition) – Longitude, Latitude and Altitude values are last valid fix, and Angle, Satellites and Speed are 0.

Longitude and latitude are integer values built from degrees, minutes, seconds and milliseconds by formula:
GPS.png
Where:
d – Degrees; m – Minutes; s – Seconds; ms – Milliseconds; p – Precision (10000000)
If longitude is in west or latitude in south, multiply result by –1.

Note:
To determine if the coordinate is negative, convert it to binary format and check the very first bit. If it is 0, coordinate is positive, if it is 1, coordinate is negative.

Example:
Received value: 20 9C CA 80 converted to BIN: 00100000 10011100 11001010 10000000 first bit is 0, which means coordinate is positive converted to DEC: 547146368. For more information see two‘s complement arithmetic.

  • IO Element
Event IO ID 2 bytes Event IO ID – if data is acquired on event – this field defines which IO property has changed and generated an event. For example, when if Ignition state changed and it generate event, Event IO ID will be 0x00EF (AVL ID: 239). If it’s not eventual record – the value is 0x0000.

N – a total number of properties coming with record (N = N1 + N2 + N4 + N8).
N1 – number of properties, which length is 1 byte.
N2 – number of properties, which length is 2 bytes.
N4 – number of properties, which length is 4 bytes.
N8 – number of properties, which length is 8 bytes.
NX – a number of properties, which length is defined by length element. N’th IO ID - AVL ID.
N'th Lenght - AVL ID value lenght.
N’th IO Value - AVL ID value.

N of Total IO 2 bytes
N1 of One Byte IO 2 bytes
1’st IO ID 2 bytes
1’st IO Value 1 byte
...
N1’th IO ID 2 bytes
N1’th IO Value 1 byte
N2 of Two Bytes 2 bytes
1’st IO ID 2 bytes
1’st IO Value 2 bytes
...
N2’th IO ID 2 bytes
N2’th IO Value 2 bytes
N4 of Four Bytes 2 bytes
1’st IO ID 2 bytes
1’st IO Value 4 bytes
...
N4’th IO ID 2 bytes
N4’th IO Value 4 byte
N8 of Eight Bytes 2 bytes
1’st IO ID 2 bytes
1’st IO Value 8 byte
...
N8’IO ID 2 bytes
N8’IO Value 8 bytes
NX of X Byte IO 2 bytes
1’st IO ID 2 bytes
1’st IO Length 2 bytes
1’st IO Value Defined by lenght
...
NX’th IO ID 2 bytes
NX’th Length 2 bytes
NX’th Value Defined by lenght


  • Communication with server

Communication with server is the same as with Codec8 protocol, except in Codec8 Extended protocol Codec ID is 0x8E.

  • Example:

Module connects to server and sends IMEI:
000F333536333037303432343431303133
Server accepts the module:
01
Module sends data packet:

AVL Data Packet Header AVL Data Array CRC-16
Four Zero Bytes – 0x00000000,

“AVL Data Array” length – 0x000000FE

Codec ID – 0x8E,

Number of Data – 0x02
(Encoded using continuous bit stream. Last byte padded to align to byte boundary)

CRC of “AVL Data Array”
00000000000000FE 8E02...(data elements)...02 00008612


Server acknowledges data reception (2 data elements): 00000002

  • Example

Hexadecimal stream of AVL Data Packet receiving and response in this example are given in hexadecimal form. The different fields of packet are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding.

Received data in hexadecimal stream:
000000000000004A8E010000016B412CEE000100000000000000000000000000000000010005000100010100010011001D00010010015E2C880002000B000000003544C87 A000E000000001DD7E06A00000100002994

Parsed data:

AVL Data Packet
AVL Data Packet Part HEX Code Part
Zero Bytes 00 00 00 00
Data Field Length 00 00 00 4A
Codec ID 8E
Number of Data 1 (Records) 01
AVL Data Timestamp 00 00 01 6B 41 2C EE 00 (GMT: Monday, June 10, 2019 11:36:32 AM)
Priority 01
Longitude 00 00 00 00
Latitude 00 00 00 00
Altitude 00 00
Angle 00 00
Satellites 00
Speed 00 00
Event IO ID 00 01
N of Total ID 00 05
N1 of One Byte IO 00 01
1’st IO ID 00 01 (AVL ID: 1, Name: DIN1)
1’st IO Value 01
N2 of Two Bytes IO 00 01
1’st IO ID 00 11 (AVL ID: 17, Name: Axis X)
1’st IO Value 00 1D
N4 of Four Bytes IO 00 01
1’st IO ID 00 10 (AVL ID: 16, Name: Total Odometer)
1’st IO Value 01 5E 2C 88
N8 of Eight Bytes IO 00 02
1’st IO ID 00 0B (AVL ID: 11, Name: ICCID1)
1’st IO Value 00 00 00 00 35 44 C8 7A
2’nd IO ID 00 0E (AVL ID: 14, Name: ICCID2)
2’nd IO Value 00 00 00 00 1D D7 E0 6A
NX of X Byte IO 00 00
Number of Data 2 (Number of Total Records) 01
CRC-16 00 00 29 94


Server response: 00000001

  • Codec8 Extended protocol sending over UDP
  • UDP channel protocol

AVL data packet is the same as with Codec8, except Codec ID is changed to 0x8E. AVL Data encoding performed according to Codec8 Extended protocol.

  • Communication with server

Module sends UDP channel packet with encapsulated AVL data packet. Server sends UDP channel packet with encapsulated response module validates AVL Packet ID and Number of accepted AVL elements. If server response with valid AVL Packet ID is not received within configured timeout, module can retry sending.

  • Example:

Module sends the data:

UDP Channel Header AVL Packet Header AVL Data Array
Length – 0x00FE,

Packet ID – 0xCAFE
Not Usable Byte – 0x01

AVL Packet ID – 0xDD,

IMEI Length – 0x000F
IMEI – 0x313233343536373839303132333435 (Encoded using continuous bit stream. Last byte padded to align to byte boundary)

Codec ID – 0x8E,

Number of Data – 0x02
(Encoded using continuous bit stream)

00FECAFE01 DD000F3133343536373839303132333435 8E02…(data elements)…02


Server must respond with acknowledgment:

UDP Channel Header AVL Packet Acknowledgment
Length – 0x0005,

Packet ID – 0xCAFE, Not Usable Byte – 0x01

AVL Packet ID – 0xDD,

Number of Accepted Data – 0x02

0005CAFE01 DD02


  • Example

Hexadecimal stream of AVL Data Packet receiving and response in this example are given in hexadecimal form. The different fields of packet are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding.

Received data in hexadecimal stream:
005FCAFE0107000F3335323039333038363430333635358E010000016B4F831C680100000000000000000000000000000000010005000100010100010011009D000100 10015E2C880002000B000000003544C87A000E000000001DD7E06A000001

Parsed:

AVL Data Packet
AVL Data Packet Part HEX Code Part
UDP Channel Header Length 00 5F
Packet ID CA FE
Not usable byte 01
AVL Packet Header AVL packet ID 05
IMEI Length 00 0F
IMEI 33 35 32 30 39 33 30 38 36 34 30 33 36 35 35
AVL Data Array Codec ID 8E
Number of Data 1 (Records) 01
Timestamp 00 00 01 6B 4F 83 1C 68 (GMT: Thursday, June 13, 2019 6:25:21 AM)
Priority 01
Longitude 00 00 00 00
Latitude 00 00 00 00
Altitude 00 00
Angle 00 00
Satellites 00
Speed 00 00
Event IO ID 00 01
N of Total ID 00 05
N1 of One Byte IO 00 01
1’st IO ID 00 01 (AVL ID: 1, Name: DIN1)
1’st IO Value 00 01
N2 of Two Bytes IO 00 01
1’st IO ID 00 11 (AVL ID: 17, Name: Axis X)
1’st IO Value 00 1D
N4 of Four Bytes IO 00 01
1’st IO ID 00 10 (AVL ID: 16, Name: Total Odometer)
1’st IO Value 01 5E 2C 88
N8 of Eight Bytes IO 00 02
1’st IO ID 00 0B (AVL ID: 11, Name: ICCID1)
1’st IO Value 00 00 00 00 35 44 C8 7A
2’nd IO ID 00 0E (AVL ID: 14, Name: ICCID2)
2’nd IO Value 00 00 00 00 1D D7 E0 6A
NX of X Byte IO 00 00


Server response in hexadecimal stream: 0005CAFE010701

Parsed:

Server Response to AVL Data Packet
Server Response Part HEX Code Part
UDP Channel Header Length 00 05
Packet ID CA FE
Not usable byte 01
AVL Packet Acknowledgment AVL packet ID 07
Number of Accepted Data 01


Codec 16

  • Protocol overview

Codec16 is using for FMB630/FM63XY devices. This protocol looks familiar like Codec8 but they have some differences. Main differences between are shown in table below:

Codec8 Codec16
Codec ID 0x08 0x10
AVL Data IO element ID event length 1 byte 2 bytes
AVL Data IO element AVL ID length 1 byte 2 bytes
Generation Type Not Using Is Using


Note: Codec16 is supported from firmware – 00.03.xx and newer. (FMB630/FM63XY) || AVL ID‘s which are higher than 255 will can be used only in Codec16 protocol.

  • Codec 16 protocol sending over TCP
  • AVL data packet

Below table represents AVL data packet structure:

0x00000000 (Preamble) Data Field Length Codec ID Number of Data 1 AVL Data Number of Data 2 CRC-16
4 bytes 4 bytes 1 byte 1 byte X bytes 1 byte 4 bytes


Preamble – the packet starts with four zero bytes.
Data Field Length – size is calculated starting from Codec ID to Number of Data 2.
Codec ID – in Codec16 it is always 0x10.
Number of Data 1 – a number which defines how many records is in the packet.
AVL Data – actual data in the packet (more information below).
Number of Data 2 – a number which defines how many records is in the packet. This number must be the same as “Number of Data 1”.
CRC-16 – calculated from Codec ID to the Second Number of Data. CRC (Cyclic Redundancy Check) is an error-detecting code using for detect accidental changes to RAW data. For calculation we are using CRC-16/IBM.

Note: for FMB630 and FM63XY, minimum AVL packet size is 45 bytes (all IO elements disabled). Maximum AVL packet size is 255 bytes.

  • AVL Data

Below table represents AVL Data structure:

Timestamp Priority GPS Element IO Element
8 bytes 1 byte 15 bytes X bytes


Timestamp – a difference, in milliseconds, between the current time and midnight, January, 1970 UTC (UNIX time).
Priority – field which define AVL data priority (more information below).
GPS Element – location information of the AVL data (more information below).
IO Element – additional configurable information from device (more information below).

  • Priority

Below table represents Priority values. Packet priority depends on device configuration and records sent.

Priority
0 Low
1 High
2 Panic


  • GPS element

Below table represents GPS Element structure:

Longitude Latitude Altitude Angle Satellites Speed
4 bytes 4 bytes 2 bytes 2 bytes 1 byte 2 bytes


Longitude – east – west position.
Latitude – north – south position.
Altitude – meters above sea level.
Angle – degrees from north pole.
Satellites – number of visible satellites.
Speed – speed calculated from satellites.

Note: If record are without valid coordinates – (there were no GPS fix in the moment of data acquisition) – Longitude, Latitude and Altitude values are last valid fix, and Angle, Satellites and Speed are 0.

Longitude and latitude are integer values built from degrees, minutes, seconds and milliseconds by formula:
GPS.png
Where:
d – Degrees; m – Minutes; s – Seconds; ms – Milliseconds; p – Precision (10000000)
If longitude is in west or latitude in south, multiply result by –1.

Note:
To determine if the coordinate is negative, convert it to binary format and check the very first bit. If it is 0, coordinate is positive, if it is 1, coordinate is negative.

Example:
Received value: 20 9C CA 80 converted to BIN: 00100000 10011100 11001010 10000000 first bit is 0, which means coordinate is positive converted to DEC: 547146368. For more information see two‘s complement arithmetic.

  • IO Element
Event IO ID 2 bytes Event IO ID – if data is acquired on event – this field defines which IO property has changed and generated an event. For example, when if Ignition state changed and it generate event, Event IO ID will be 0xEF (AVL ID: 239). If it’s not eventual record – the value is 0.

Generation type - data event generation type. More information about it you can find here.
N – a total number of properties coming with record (N = N1 + N2 + N4 + N8).
N1 – number of properties, which length is 1 byte.
N2 – number of properties, which length is 2 bytes.
N4 – number of properties, which length is 4 bytes.
N8 – number of properties, which length is 8 bytes.
N’th IO ID - AVL ID.
N’th IO Value - AVL ID value.

Generation Type 1 byte
N of Total IO 1 byte
N1 of One Byte IO 1 byte
1’st IO ID 2 bytes
1’st IO Value 1 byte
...
N1’th IO ID 2 bytes
N1’th IO Value 1 byte
N2 of Two Bytes 1 byte
1’st IO ID 2 bytes
1’st IO Value 2 bytes
...
N2’th IO ID 2 bytes
N2’th IO Value 2 bytes
N4 of Four Bytes 1 byte
1’st IO ID 2 bytes
1’st IO Value 4 bytes
...
N4’th IO ID 2 bytes
N4’th IO Value 4 byte
N8 of Eight Bytes 1 byte
1’st IO ID 2 bytes
1’st IO Value 8 byte
...
N8’IO ID 2 bytes
N8’IO Value 8 bytes


  • Generation type
Value Record Created
0 On Exit
1 On Entrance
2 On Both
3 Reserved
4 Hysteresis
5 On Change
6 Eventual
7 Periodical


  • Communication with server

Communication with server is the same as with Codec8 protocol, except in Codec16 protocol Codec ID is 0x10 and has generation type.

  • Example:

Module connects to server and sends IMEI:
000F333536333037303432343431303133
Server accepts the module:
01
Module sends data packet:

AVL Data Packet Header AVL Data Array CRC-16
Four Zero Bytes – 0x00000000,

“AVL Data Array” length – 0x000000FE

Codec ID – 0x10,

Number of Data – 0x02
(Encoded using continuous bit stream. Last byte padded to align to byte boundary)

CRC of “AVL Data Array”
00000000000000FE 1002...(data elements)...02 00008612


Server acknowledges data reception (2 data elements): 00000002

  • Example

Hexadecimal stream of AVL Data Packet receiving and response in this example are given in hexadecimal form. The different fields of packet are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding.

Received data in hexadecimal stream:
000000000000005F10020000016BDBC7833000000000000000000000000000000000000B05040200010000030002000B00270042563A00000000016BDBC78718 00000000000000000000000000000000000B05040200010000030002000B00260042563A00000200005FB3

Parsed data:

AVL Data Packet
AVL Data Packet Part HEX Code Part
Zero Bytes 00 00 00 00
Data Field Length 00 00 00 5F
Codec ID 10
Number of Data 1 (Records) 02
AVL Data

(1'st record)

Timestamp 00 00 01 6B DB C7 83 30 (GMT: Wednesday, July 10, 2019 12:06:54 PM)
Priority 01
Longitude 00 00 00 00
Latitude 00 00 00 00
Altitude 00 00
Angle 00 00
Satellites 00
Speed 00 00
Event IO ID 00 0B
Generation Type 05
N of Total ID 04
N1 of One Byte IO 02
1’st IO ID 00 01 (AVL ID: 1, Name: DIN1)
1’st IO Value 00
2’nd IO ID 00 03 (AVL ID: 3, Name: DIN3)
2’nd IO Value 00
N2 of Two Bytes IO 02
1’st IO ID 00 0B (AVL ID: 11, Name: ICCID1)
1’st IO Value 00 27
2’nd IO ID 00 42 (AVL ID: 66, Name: External Voltage)
2’nd IO Value 56 3A
N4 of Four Bytes IO 00
N8 of Eight Bytes IO 00
AVL Data

(2'nd record)

Timestamp 00 00 01 6B DB C7 87 18 (GMT: Wednesday, July 10, 2019 12:06:55 PM)
Priority 01
Longitude 00 00 00 00
Latitude 00 00 00 00
Altitude 00 00
Angle 00 00
Satellites 00
Speed 00 00
Event IO ID 00 0B
Generation Type 05
N of Total ID 04
N1 of One Byte IO 02
1’st IO ID 00 01 (AVL ID: 1, Name: DIN1)
1’st IO Value 00
2’nd IO ID 00 03 (AVL ID: 3, Name: DIN3)
2’nd IO Value 00
N2 of Two Bytes IO 02
1’st IO ID 00 0B (AVL ID: 11, Name: ICCID1)
1’st IO Value 00 26
2’nd IO ID 00 42 (AVL ID: 66, Name: External Voltage)
2’nd IO Value 56 3A
N4 of Four Bytes IO 00
N8 of Eight Bytes IO 00
Number of Data 2 (Number of Total Records) 02
CRC-16 00 00 5F B3


Server response: 00000002

  • Codec16 protocol sending over UDP
  • UDP channel protocol

AVL data packet is the same as with Codec8, except Codec ID is changed to 0x10. AVL Data encoding performed according to Codec16 protocol.

  • Communication with server

Module sends UDP channel packet with encapsulated AVL data packet. Server sends UDP channel packet with encapsulated response module validates AVL Packet ID and Number of accepted AVL elements. If server response with valid AVL Packet ID is not received within configured timeout, module can retry sending.

  • Example:

Module sends the data:

UDP Channel Header AVL Packet Header AVL Data Array
Length – 0x00FE,

Packet ID – 0xCAFE
Not Usable Byte – 0x01

AVL Packet ID – 0xDD,

IMEI Length – 0x000F
IMEI – 0x313233343536373839303132333435 (Encoded using continuous bit stream. Last byte padded to align to byte boundary)

Codec ID – 0x10,

Number of Data – 0x02
(Encoded using continuous bit stream)

00FECAFE01 DD000F3133343536373839303132333435 1002…(data elements)…02


Server must respond with acknowledgment:

UDP Channel Header AVL Packet Acknowledgment
Length – 0x0005,

Packet ID – 0xCAFE, Not Usable Byte – 0x01

AVL Packet ID – 0xDD,

Number of Accepted Data – 0x02

0005CAFE01 DD02


  • Example

Hexadecimal stream of AVL Data Packet receiving and response in this example are given in hexadecimal form. The different fields of packet are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding.

Received data in hexadecimal stream:
015BCAFE0101000F33353230393430383532333135393210070000015117E40FE80000000000000000000000000000000000EF05050400010000030000B4000 0EF01010042111A000001

Parsed:

AVL Data Packet
AVL Data Packet Part HEX Code Part
UDP Channel Header Length 01 5B
Packet ID CA FE
Not usable byte 01
AVL Packet Header AVL packet ID 07
IMEI Length 00 0F
IMEI 33 35 32 30 39 34 30 38 35 32 33 31 35 39 32
AVL Data Array Codec ID 10
Number of Data 1 (Records) 01
Timestamp 00 00 01 51 17 E4 0F E8 (GMT: Wednesday, November 18, 2015 12:00:01 AM)
Priority 00
Longitude 00 00 00 00
Latitude 00 00 00 00
Altitude 00 00
Angle 00 00
Satellites 00
Speed 00 00
Event IO ID 00 EF
Generation type 05
N of Total ID 05
N1 of One Byte IO 04
1’st IO ID 00 01 (AVL ID: 1, Name: DIN1)
1’st IO Value 00
2’nd IO ID 00 03 (AVL ID: 3, Name: DIN3)
2’nd IO Value 00
3’rd IO ID 00 B4 (AVL ID: 180, Name: DOUT2)
3’rd IO Value 00
4’th IO ID 00 EF (AVL ID: 239, Name: Ignition)
4’th IO Value 00
N2 of Two Bytes IO 01
1’st IO ID 42 (AVL ID: 66, Name: External Voltage)
1’st IO Value 11 1A
N4 of Four Bytes IO 00
N8 of Eight Bytes IO 00
Number of Data 2 (Number of Total Records) 01


Server response in hexadecimal stream: 0005CAFE010701

Parsed:

Server Response to AVL Data Packet
Server Response Part HEX Code Part
UDP Channel Header Length 00 05
Packet ID CA FE
Not usable byte 01
AVL Packet Acknowledgment AVL packet ID 07
Number of Accepted Data 01


Differences between Codec 8, Codec 8 Extended and Codec 16

In the table below you will see differences between Codec8, Codec8 Extended and Codec16.

Codec8 Codec8 Extended Codec16
Codec ID 0x08 0x8E 0x10
AVL Data IO element length 1 byte 2 bytes 2 bytes
AVL Data IO element total IO count length 1 byte 2 bytes 2 bytes
Generation Type Not Using Not Using Is Using
AVL Data IO element IO count length 1 byte 2 bytes 1 byte
AVL Data IO element AVL ID length 1 byte 2 bytes 2 bytes
Variable size IO elements Does not include Includes variable size elements Does not include


Codec for communication over GPRS messages

In this chapter you will find information about every Codec protocol which are using for communication over GPRS messages and differences between them.

Codec 12

  • About Codec12

Codec12 is the original and main Teltonika protocol for device-server communication over GPRS messages. Codec12 GPRS commands can be used for sending configuration, debug, digital outputs control commands or other (special purpose command on special firmware versions). This protocol is also necessary for using FMB630/FM6300/FM5300/FM5500/FM4200 features like: Garmin, LCD communication, COM TCP Link Mode.

  • FM firmware requirements

Supported GPRS commands on each device depending on the firmware version. For available GPRS commands on each device, please refer to the table below.

Device SMS over GPRS via TCP SMS over GPRS via UDP
FM36YX Available in base firmware Since base firmware 01.06.01
FM63YX Available in base firmware Since base firmware 00.02.19
FMB, FMC, FMM, FMU family devices (exclude FMB6YX, FMC640, FMM640) Available in base firmware Available in base firmware
FMB6YX Available in base firmware Since base firmware 00.02.19
FMC640, FMM640 Available in base firmware Available in base firmware


Note: “SMS over GPRS” means that all standard SMS commands text can be sent to the device via GPRS in Codec12 format.
Note: UDP commands are sent the same exact way as TCP commands.

  • GPRS command session

The following figure shows how the GRPS command session is started over TCP.
Codec12.png First, the Teltonika device opens the GPRS session and sends AVL data to the server (refer device protocols). Once all records are sent and correct sent data array acknowledgment is received by device then GPRS commands in Hex can be sent to the device.
The ACK (acknowledge of IMEI from server) is a one-byte constant 0x01. The acknowledgment of each data array send from the device is four bytes integer – the number of records received.
Note, that the GPRS session should remain active between device and server, while GPRS commands are sent. For this reason, active datalink timeout (global parameters in device configuration) is recommended to be set to 259200 (maximum value).

  • General Codec12 message structure

The following diagram shows basic structure of Codec12 messages.

Command message structure:

0x00000000 (Preamble) Data Size Codec ID Command Quantity 1 Type (0x05) Command Size Command Command Quantity 2 CRC-16
4 bytes 4 bytes 1 byte 1 byte 1 byte 4 bytes X bytes 1 byte 4 bytes


Response message structure:

0x00000000 (Preamble) Data Size Codec ID Response Quantity 1 Type (0x06) Response Size Response Response Quantity 2 CRC-16
4 bytes 4 bytes 1 byte 1 byte 1 byte 4 bytes X bytes 1 byte 4 bytes


Preamble - the packet starts with four zero bytes.
Data Size - size is calculated from Codec ID field to the second command or response quantity field.
Codec ID - in Codec12 it is always 0x0C.
Command/Response Quantity 1 - it is ignored when parsing the message.
Type - it can be 0x05 to denote command or 0x06 to denote response.
Command/Response Size – command or response length.
Command/Response – command or response in HEX.
Command/Response Quantity 2 - a byte which defines how many records (commands or responses) is in the packet. This byte will not be parsed but it’s recommended that it should contain same value as Command/Response Quantity 1.
CRC-16 – calculated from Codec ID to the Command Quantity 2. CRC (Cyclic Redundancy Check) is an error-detecting code using for detect accidental changes to RAW data. For calculation we are using CRC-16/IBM.

Note that difference between commands and responses is message type field: 0x05 means command and 0x06 means response.

  • Command coding table

Command has to be converted from ASCII characters (char) to hexadecimal (HEX):
ASCII.png

  • Command parsing example

Hexadecimal stream of command and answer in this example is given in hexadecimal form. The different fields of the message are separated into different table columns for better readability and understanding.

  • GPRS commands examples

Hexadecimal stream of GPRS command and answer in these examples are given in hexadecimal form. The different fields of messages are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding.

1'st example: Sending getinfo SMS command via GPRS Codec12

Server request in hexadecimal stream:
000000000000000F0C010500000007676574696E666F0100004312

Parsed:

Server Command
Server Command Part HEX Code Part
Zero Bytes 00 00 00 00
Data Size 00 00 00 0F
Codec ID 0C
Command Quantity 1 01
Command Type 05
Command Size 00 00 00 07
Command 67 65 74 69 6E 66 6F
Command Quantity 2 01
CRC-16 00 00 43 12


Note that Server Command converted from HEX to ASCII means getinfo

Device response in hexadecimal stream:
00000000000000900C010600000088494E493A323031392F372F323220373A3232205254433A323031392F372F323220373A3533205253543A32204552523A 312053523A302042523A302043463A302046473A3020464C3A302054553A302F302055543A3020534D533A30204E4F4750533A303A3330204750533A312053 41543A302052533A332052463A36352053463A31204D443A30010000C78F

Parsed:

Device Answer
Device Answer Part HEX Code Part
Zero Bytes 00 00 00 00
Data Size 00 00 00 90
Codec ID 0C
Response Quantity 1 01
Response Type 06
Response Size 00 00 00 88
Response 49 4E 49 3A 32 30 31 39 2F 37 2F 32 32 20 37 3A 32 32 20 52 54 43 3A 32 30 31 39 2F 37 2F 32 32 20 37 3A 35 33 20 52 53 54 3A 32 20 45 52 52 3A 31 20 53 52 3A 30 20 42 52 3A 30 20 43 46 3A 30 20 46 47 3A 30 20 46 4C 3A 30 20 54 55 3A 30 2F 30 20 55 54 3A 30 20 53 4D 53 3A 30 20 4E 4F 47 50 53 3A 30 3A 33 30 20 47 50 53 3A 31 20 53 41 54 3A 30 20 52 53 3A 33 20 52 46 3A 36 35 20 53 46 3A 31 20 4D 44 3A 30
Response Quantity 2 01
CRC-16 00 00 C7 8F


Note that Device Response converted from HEX to ASCII means:
INI:2019/7/22 7:22 RTC:2019/7/22 7:53 RST:2 ERR:1 SR:0 BR:0 CF:0 FG:0 FL:0 TU:0/0 UT:0 SMS:0 NOGPS:0:30 GPS:1 SAT:0 RS:3 RF:65 SF:1 MD:0

2'nd example: Sending getio SMS command via GPRS Codec12

Server request in hexadecimal stream:
000000000000000D0C010500000005676574696F01000000CB

Parsed:

Server Command
Server Command Part HEX Code Part
Zero Bytes 00 00 00 00
Data Size 00 00 00 0D
Codec ID 0C
Command Quantity 1 01
Command Type 05
Command Size 00 00 00 05
Command 67 65 74 69 6F
Command Quantity 2 01
CRC-16 00 00 00 CB


Note that Server Command converted from HEX to ASCII means getio

Device response in hexadecimal stream:
00000000000000370C01060000002F4449313A31204449323A30204449333A302041494E313A302041494E323A313639323420444F313A3020444F323A3101000066E3

Parsed:

Device Answer
Device Answer Part HEX Code Part
Zero Bytes 00 00 00 00
Data Size 00 00 00 37
Codec ID 0C
Response Quantity 1 01
Response Type 06
Response Size 00 00 00 2F
Response 44 49 31 3A 31 20 44 49 32 3A 30 20 44 49 33 3A 30 20 41 49 4E 31 3A 30 20 41 49 4E 32 3A 31 36 39 32 34 20 44 4F 31 3A 30 20 44 4F 32 3A 31
Response Quantity 2 01
CRC-16 00 00 66 E3


Note that Device Response converted from HEX to ASCII means:
DI1:1 DI2:0 DI3:0 AIN1:0 AIN2:16924 DO1:0 DO2:1

  • Communication with server

The GSM/GPRS commands can be sent from a terminal program. We recommend to use Hercules (in TCP server mode). Simply write command as explained below into Hercules Send field, check HEX box and click Send button. Note that the TCP server must be listening on specified port (see Port field and Listen button below).

Hercules.jpeg

  • FMXX and Codec12 functionality
  • Garmin

All information is provided in “FMXX and Garmin development.pdf” document.

  • COM TCP Link Mode

All information is provided in “FMxx TCP Link mode test instructions.pdf” document.

Codec 13

  • About Codec13

Codec13 is original Teltonika protocol for device-server communication over GPRS messages. This protocol is necessary for using following FM features: COM TCP Link Mode (binary/ASCII/binary buffered/ASCII buffered) if message timestamp parameter is enabled in device configuration. Codec13 messages are one way only (Device → Server sending).

  • General Codec13 message structure

The following diagram shows basic structure of Codec 13 messages:

0x00000000 (Preamble) Data Size Codec ID Response Quantity 1 Type Response Size Timestamp Response Response Quantity 2 CRC-16
4 bytes 4 bytes 1 byte 1 byte 1 byte 4 bytes 4 bytes X bytes 1 byte 4 bytes


Preamble – the packet starts with preamble field (four zero bytes).
Data Size – size is calculated from Codec ID field to the second Response Quantity field.
Codec ID – in Codec13 it is always 0x0D.
Response Quantity 10x01, it is ignored when parsing the message.
Response Type – it is always 0x06 since the packet is direction is FM->Server.
Response Size – response size field includes size of timestamp too, so it is equal to size of payload + size of timestamp.
Timestamp – a difference, in seconds, between the current time and midnight, January, 1970 UTC (UNIX time).
Response – actual received data.
Response Quantity 2 – a byte which defines how many records (responses) is in the packet. This byte will not be parsed but it’s recommended that it should contain same value as Response Quantity 1.
CRC-16 – calculated from Codec ID to the Second Number of Data. CRC (Cyclic Redundancy Check) is an error-detecting code using for detect accidental changes to RAW data. For calculation we are using CRC-16/IBM.

Note: Codec13 packets are used only when “Message Timestamp” parameter in RS232 settings is enabled.

  • Command parsing example

Hexadecimal stream of GPRS command in this example is given in hexadecimal form. The different fields of message are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding.

Receiving "hello lets test" SMS response via GPRS Codec13

Hexadecimal stream:
000000000000001D0D01060000001564E8328168656C6C6F206C65747320746573740D0A0100003548

Parsed:

Device answer
Device answer part HEX Code Part
Zero Bytes 00 00 00 00
Data Size 00 00 00 1D
Codec ID 0D
Response Quantity 1 01
Response Type 06
Response Size 00 00 00 15
Timestamp 64 E8 32 81
Response 68 65 6C 6C 6F 20 6C 65 74 73 20 74 65 73 74 0D 0A
Response Quantity 2 01
CRC-16 00 00 35 48


Note that Server Response converted from HEX to ASCII means "hello lets test"

Codec 14

  • About Codec14

Codec14 is original Teltonika protocol for device-server communication over GPRS messages and it is based on Codec12 protocol.
Main difference of Codec14 is that, device will answer to GPRS command if device physical IMEI number matches specified IMEI number in GPRS command.

Codec14 GPRS commands can be used for sending configuration, debug, digital outputs control commands or other (special purpose command on special firmware versions).

  • FMB firmware requirements

Implemented in base firmware from FMB.Ver.03.25.04.Rev.00 and newer.

  • General Codec14 message structure

The following diagram shows basic structure of Codec14 messages.

Command message structure

0x00000000 (preamble) Data size 0x0E (Codec ID) Command quantity 0x05
(Message type)
Command size + IMEI size (8 bytes) IMEI (HEX) Command Command quantity CRC-16
4 bytes 4 bytes 1 bytes 1 bytes 1 bytes 4 bytes 8 bytes X bytes 1 bytes 4 bytes


Response message structure

0x00000000 (preamble) Data size 0x0E (Codec ID) Response quantity 0x06 / 0x11 (Message type) Response size + IMEI size (8 bytes) IMEI (HEX) Response Response quantity CRC-16
4 bytes 4 bytes 1 bytes 1 bytes 1 bytes 4 bytes 8 bytes X bytes 1 bytes 4 bytes


Preamble – the packet starts with four zero bytes.
Data Size – size is calculated from Codec ID field to the second command or response quantity field.
Codec ID – in Codec14 it is always 0x0E.
Command/Response Quantity 1 – it is ignored when parsing the message.
Type – if it is request command from server it has to contain 0x05. The response type field will contain 0x06 if it’s ACK or 0x11 if it’s nACK.
Explanation: If command message IMEI is equal to actual device IMEI, received command will be executed and response will be sent with ACK (0x06) message type field value. If command message IMEI doesn’t match actual device IMEI, received command won’t be executed and response to server will be sent with nACK (0x11) message type field value.
Command/Response Size – command or response length.
Note: make sure that size is IMEI size 8 + actual command size. Minimal value is 8 because Codec14 always contain IMEI and it’s 8 bytes.
IMEI (HEX) – it is send as HEX value. Example if device IMEI is 123456789123456 then IMEI data field will contain 0x0123456789123456 value.
Command/Response – command or response in HEX.
Command/Response Quantity 2 - a byte which defines how many records (commands or responses) is in the packet. This byte will not be parsed but it’s recommended that it should contain same value as Command/Response Quantity 1.
CRC-16 – calculated from Codec ID to the Second Number of Data. CRC (Cyclic Redundancy Check) is an error-detecting code using for detect accidental changes to RAW data. For calculation we are using CRC-16/IBM.

  • GPRS in Codec14 examples

Hexadecimal stream of GPRS command and answer in this example are given in hexadecimal form. The different fields of message are separate into different table columns for better readability and some of them are converted to ASCII values for better understanding.

Sending getver SMS command via GPRS Codec14:

Server requests in Hexadecimal stream:
00000000000000160E01050000000E0352093081452251676574766572010000D2C1

Parsed:

Server Command
Server Command Part HEX Code Part
Zero Bytes 00 00 00 00
Data Size 00 00 00 16
Codec ID 0E
Command Quantity 1 01
Command Type 05
Command Size 00 00 00 0E
IMEI 03 52 09 30 81 45 22 51
Command 67 65 74 76 65 72
Command Quantity 2 01
CRC-16 00 00 D2 C1


Note that Server Command converted from HEX to ASCII means getver

Device ACK response in hexadecimal stream:
00000000000000AB0E0106000000A303520930814522515665723A30332E31382E31345F3034204750533A41584E5F352E31305F333333332048773A464D42313230 204D6F643A313520494D45493A33353230393330383134353232353120496E69743A323031382D31312D323220373A313320557074696D653A3137323334204D4143 3A363042444430303136323631205350433A312830292041584C3A30204F42443A3020424C3A312E362042543A340100007AAE

Parsed:

Device Answer
Device Answer Part HEX Code Part
Zero Bytes 00 00 00 00
Data Size 00 00 00 37
Codec ID 0E
Response Quantity 1 01
Response Type 06
Response Size 00 00 00 A3
IMEI 03 52 09 30 81 45 22 51
Response 56 65 72 3A 30 33 2E 31 38 2E 31 34 5F 30 34 20 47 50 53 3A 41 58 4E 5F 35 2E 31 30 5F 33 33 33 33 20 48 77 3A 46 4D 42 31 32 30 20 4D 6F 64 3A 31 35 20 49 4D 45 49 3A 33 35 32 30 39 33 30 38 31 34 35 32 32 35 31 20 49 6E 69 74 3A 32 30 31 38 2D 31 31 2D 32 32 20 37 3A 31 33 20 55 70 74 69 6D 65 3A 31 37 32 33 34 20 4D 41 43 3A 36 30 42 44 44 30 30 31 36 32 36 31 20 53 50 43 3A 31 28 30 29 20 41 58 4C 3A 30 20 4F 42 44 3A 30 20 42 4C 3A 31 2E 36 20 42 54 3A 34
Response Quantity 2 01
CRC-16 00 00 7A AE


Note that Device Response converted from HEX to ASCII means:
Ver:03.18.14_04 GPS:AXN_5.10_3333 Hw:FMB120 Mod:15 IMEI:352093081452251 Init:2018-11-22 7:13 Uptime:17234 MAC:60BDD0016261 SPC:1(0) AXL:0 OBD:0 BL:1.6 BT:4

Device nACK response in hexadecimal stream:
00000000000000100E011100000008035209308145246801000032AC

Parsed:

Device Answer
Device Answer Part HEX Code Part
Zero Bytes 00 00 00 00
Data Size 00 00 00 10
Codec ID 0E
Response Quantity 1 01
Response Type 11
Response Size 00 00 00 08
IMEI 03 52 09 30 81 45 24 68
Response Quantity 2 01
CRC-16 00 00 32 AC


Differences between Codec 12, Codec 13 and Codec 14

In the table below you will see differences between Codec12, Codec13 and Codec14.

Codec12 Codec13 Codec14
Communication Server ⇄ Device Communication One-way (Device → Server communication) Server ⇄ Device Communication
Codec ID 0x0C 0x0D 0x0E
command message type 0x05 - 0x05
Response Message Type 0x06 0x06 0x06 (if it is ACK) or 0x11 (if it is nACK)
Command / Response size Command/Response Only Response Command/Response + IMEI
Timestamp Not Using Is Using Not Using
IMEI Not Using Not Using Is Using


24 Position SMS Data Protocol

24-hour SMS is usually sent once every day and contains GPS data of last 24 hours. TP-DCS field of this SMS should indicate that message contains 8-bit data (i.e. TP-DCS can be 0x04).
Note, that 24 position data protocol is used only with subscribed SMS. Event SMS use standard AVL data protocol.

  • Encoding

To be able to compress 24 GPS data entries into one SMS (140 octets), the data is encoded extensively using bit fields. Data packet can be interpreted as a bit stream, where all bits are numbered as follows:

Byte 1 Byte 2 Byte 3 Byte 4 ...
Bits 0 - 7 Bits 8 - 15 Bits 16 - 24 Bits 25 - ...


Bits in a byte are numbered starting from least significant bit. A field of 25 bits would consist of bits 0 to 24 where 0 is the least significant bit and bit 24 – most significant bit.

  • Structure

Below in the tables you will see SMS Data Structure:

SMS Data Structure
8 Codec ID Codec ID = 4 (0x04)
35 Timestamp Time corresponding to the first (oldest) GPS data element, represented in seconds elapsed from 2000.01.01 00:00 EET.
5 ElementCount Number of GPS data elements


SMS Data Structure
ElementCount * GPSDataElement GPS data elements
Byte - align padding Padding bits to align to 8 - bits boundary represented in seconds elapsed from 2000.01.01 00:00 EET.
64 IMEI IMEI of sending device as 8 byte long integer


The time of only the first GPS data element is specified in Timestamp field. Time corresponding to each further element can be computed as elementTime = Timestamp + (1 hour * elementNumber).

GPS Data Element
Size (bits) Field Description
1 ValidElement ValidElement = 1 – there is a valid Gps Data Element following,

ValidElement = 0 – no element at this position

ValidElement == 1 1 DifferentialCoords Format of following data
DifferentialCoords == 1 14 LongitudeDiff Difference from previous element‘s longitude.

LongitudeDiff = prevLongitude – Longitude + 213 – 1

14 LatitudeDiff Difference from previous element‘s latitude

LatitudeDiff = prevLatitude – Latitude + 213 – 1

DifferentialCoords == 0 21 Longitude Longitude = {(LongDegMult + 18 * 108) * (221 – 1)} over {36*108}
20 Latitude Latitude = (LatDegMult + 9*108) * (220 – 1) over {18*108}
8 Speed Speed in km/h


Longitude - longitude field value of GPSDataElement
Latitude - latitude field value of GPSDataElement
LongDegMult - longitude in degrees multiplied by 107 (integer part)
LatDegMult - latitude in degrees multiplied by 107 (integer part)
prevLongitude - longitude field value of previous GPSDataElemen
prevLatitude - latitude field value of previous GPSDataElement

  • Decoding GPS position

When decoding GPS data with DifferentialCoords = 1, Latitude and Longitude values can be computed as follows: Longitude = prevLongitude – LongitudeDiff + 213 – 1, Latitude = prevLatitude – LatitudeDiff + 213 – 1.
If there were no previous non-differential positions, differential coordinates should be computed assuming prevLongitude = prevLatitude = 0.
When Longitude and Latitude values are known, longitude and latitude representation in degrees can be computed as follows:

24SMS.png

  • SMS Events

When Configured to generate SMS event user will get this SMS upon event:
<Year/Month/Day> <Hour:Minute:Second> P:<profile_nr> <SMS Text> Val:<Event Value> Lon:<longitude> Lat:<latitude> Q:<HDOP>

Example:
2016./04/11 12:00:00 P:3 Digital Input 1 Val:1 Lon:51.12258 Lat: 25.7461 Q:0.6

Sending data using SMS

This type data sending is using for FMBXXX devices which can be configured in SMS Data Sending settings.

  • Data sending via SMS

AVL data or events can be sent encapsulated in binary SMS. TP-DCS field of these SMS should indicate that message contains 8-bit data (for example: TP-DCS can be 0x04).

SMS data (TP-UD)
AVL data array IMEI
X bytes 8 bytes


AVL data array – array of encoded AVL data.
IMEI – IMEI of sending module encoded as a big endian 8 byte long number.

CRC-16

CRC (Cyclic Redundancy Check) is an error-detecting code using for detect accidental changes to RAW data. The algorithm how to calculate CRC-16 (also known as CRC-16/IBM) you will find below.
CRC16.png