Telemetry Packet: Difference between revisions
No edit summary |
No edit summary |
||
| (6 intermediate revisions by the same user not shown) | |||
| Line 23: | Line 23: | ||
* 04 - Device Configuration Packet | * 04 - Device Configuration Packet | ||
* 05 - IP Configuration Packet | * 05 - IP Configuration Packet | ||
| 01 - Telemetry Packet | |||
|- | |- | ||
! colspan="5" style="background:#D3D3D3;" | Data (= 55 bytes × number of packets) | ! colspan="5" style="background:#D3D3D3;" | Data (= 55 bytes × number of packets) | ||
| Line 32: | Line 33: | ||
| AlertID || 5 || 97–101 || Alert identifier || | | AlertID || 5 || 97–101 || Alert identifier || | ||
|- | |- | ||
| Operator || 4 || 102–105 || Network operator || 00- | | Operator || 4 || 102–105 || Network operator || 00-Unknown, 01-BSNL, 02-VI, 03-AIRTEL, 04-JIO | ||
|- | |- | ||
| Signal Strength || 5 || 106–110|| Signal strength || Integer (0–31) | | Signal Strength || 5 || 106–110|| Signal strength || Integer (0–31) | ||
| Line 54: | Line 55: | ||
| EW_Indication || 1 || 223 || East/West Indication || 0: E, 1: W | | EW_Indication || 1 || 223 || East/West Indication || 0: E, 1: W | ||
|- | |- | ||
| HDOP || 10 || 224–233 || Horizontal dilution || Divide by | | HDOP || 10 || 224–233 || Horizontal dilution || Divide by 100 for float value | ||
|- | |- | ||
| PDOP || 10 || 234–243 || Position dilution || Divide by | | PDOP || 10 || 234–243 || Position dilution || Divide by 100 for float value | ||
|- | |- | ||
| Speed || 15 || 244–258 || Speed in km/h || Divide by | | Speed || 15 || 244–258 || Speed in km/h || Divide by 100 for float value | ||
|- | |- | ||
| Altitude || 15 || 259–273 || Altitude in meters || Divide by | | Altitude || 15 || 259–273 || Altitude in meters || Divide by 100 for float value | ||
|- | |- | ||
| Power Status || 1 || 274 || Power connection status || 0: Power disconnected, 1: Power connected | | Power Status || 1 || 274 || Power connection status || 0: Power disconnected, 1: Power connected | ||
| Line 68: | Line 69: | ||
| Immobilizer Status || 1 || 276 || Immobilizer status || 0: OFF, 1: ON | | Immobilizer Status || 1 || 276 || Immobilizer status || 0: OFF, 1: ON | ||
|- | |- | ||
| Tamper || 1 || 277 || Wire Tamper detection || 0: Tamper alert OFF, 1: Tamper alert ON | | Tamper detection || 1 || 277 || Wire Tamper detection || 0: Tamper alert OFF, 1: Tamper alert ON | ||
|- | |- | ||
| Supply Voltage || 10 || 278–287 || | | Supply Voltage || 10 || 278–287 || Supply voltage || Divide by 10 for float value | ||
|- | |- | ||
| Internal Battery Voltage || 6 || 288–293 || Internal battery voltage || Divide by 10 for float value | | Internal Battery Voltage || 6 || 288–293 || Internal battery voltage || Divide by 10 for float value | ||
| Line 106: | Line 107: | ||
| Temperature sensor status 1 || 1 || 399 || Status of temperature sensor 1 || 1 if connected, 0 if not connected | | Temperature sensor status 1 || 1 || 399 || Status of temperature sensor 1 || 1 if connected, 0 if not connected | ||
|- | |- | ||
| Temperature 1 || 12 || 400–411 || Temperature in °C || Signed, divide by 10 | | Temperature 1 || 12 || 400–411 || Temperature in °C || Signed, divide by 10 for decimal value | ||
|- | |- | ||
| Temperature sensor status 2 || 1 || 412 || Status of temperature sensor 2 || 1 if connected, 0 if not connected | | Temperature sensor status 2 || 1 || 412 || Status of temperature sensor 2 || 1 if connected, 0 if not connected | ||
|- | |- | ||
| Temperature 2 || 12 || 413–424 || Temperature in °C || Signed, divide by 10 | | Temperature 2 || 12 || 413–424 || Temperature in °C || Signed, divide by 10 for decimal value | ||
|- | |- | ||
| Temperature sensor status 3 || 1 || 425 || Status of temperature sensor 3 || 1 if connected, 0 if not connected | | Temperature sensor status 3 || 1 || 425 || Status of temperature sensor 3 || 1 if connected, 0 if not connected | ||
|- | |- | ||
| Temperature 3 || 12 || 426–437 || Temperature in °C || Signed, divide by 10 | | Temperature 3 || 12 || 426–437 || Temperature in °C || Signed, divide by 10 for decimal value | ||
|- | |- | ||
| Humidity || 7 || 438–444 || Humidity percentage || | | Humidity || 7 || 438–444 || Humidity percentage || Integer value | ||
|- | |- | ||
| Odometer || 35 || 445–479 || Odometer value in meters || | | Odometer || 35 || 445–479 || Odometer value in meters || | ||
|- | |- | ||
| DateTime UTC || 32 ||480–511|| Timestamp || UTC time in seconds | | DateTime UTC || 32 ||480–511|| UTC Timestamp || UTC time in seconds | ||
|- | |- | ||
| TimeZone || 8 || 512–519 || | | TimeZone || 8 || 512–519 || Timezone in quarter-hours (e.g., 22 = +5:30). Each unit = 15 mins. Value 22 = 22 × 15 mins = 330 mins = +5:30 Range: -48 to 56, 2's complement ||Timezone in quarter-hours | ||
Timezone in quarter-hours (e.g., 22 = +5:30). | |||
Each unit = 15 mins. | |||
Value 22 = 22 × 15 mins = 330 mins = +5:30 | |||
Range: -48 to 56, 2's complement || | |||
|- | |- | ||
! colspan="5" "style="background:#D3D3D3;" | Tail | ! colspan="5" "style="background:#D3D3D3;" | Tail | ||
| Line 138: | Line 135: | ||
<pre> | <pre> | ||
HEX "240370e21aeb7abfd5818011047aca0260081b780000000000000000000000000000307890000000000000000000000000000000000000000000000068a7f192162abf" | HEX "240370e21aeb7abfd5818011047aca0260081b780000000000000000000000000000307890000000000000000000000000000000000000000000000068a7f192162abf" | ||
JSON | |||
{"imei": 862942074896044, "packet_type": 1, "no_packets": 1, "packet_status": 1, "frame_number": 34, "alert_id": 1, "operator": 1, "signal_strength": 29, "mcc": 404, "mnc": 19, "cell_id": 64, "lac": 56256, "fix_status": 0, "latitude": 0.0, "latitude_dir": 0, "longitude": 0.0, "longitude_dir": 0, "hdop": 0.0, "pdop": 0.0, "speed": 0.0, "altitude": 0.0, "power": 1, "ignition": 1, "immobilizer": 0, "tamper": 0, "supply_volatge": 12.0, "internal_battery_volatge": 3.6, "fuel_sensor_status_1": 0, "fuel_percentage_1": 0.0, "fuel_value_sensor_1": 0, "fuel_sensor_status_2": 0, "fuel_percentage_2": 0.0, "fuel_value_sensor_2": 0, "fuel_sensor_status_3": 0, "fuel_percentage_3": 0.0, "fuel_value_sensor_3": 0, "analog_input1": 0.0, "analog_input2": 0.0, "digital_input1": 0, "digital_input2": 0, "digital_output1": 0, "digital_output2": 0, "temp_sensor_status_1": 0, "temperature_1": 0.0, "temp_sensor_status_2": 0, "temperature_2": 0.0, "temp_sensor_status_3": 0, "temperature_3": 0.0, "humidity": 0, "odometer": 0, "dateTime": 1755836818, "timezone": 22, "dateTime_tz": "2025-08-22 09:56:58", "error_code": 0 | {"imei": 862942074896044, "packet_type": 1, "no_packets": 1, "packet_status": 1, "frame_number": 34, "alert_id": 1, "operator": 1, "signal_strength": 29, "mcc": 404, "mnc": 19, "cell_id": 64, "lac": 56256, "fix_status": 0, "latitude": 0.0, "latitude_dir": 0, "longitude": 0.0, "longitude_dir": 0, "hdop": 0.0, "pdop": 0.0, "speed": 0.0, "altitude": 0.0, "power": 1, "ignition": 1, "immobilizer": 0, "tamper": 0, "supply_volatge": 12.0, "internal_battery_volatge": 3.6, "fuel_sensor_status_1": 0, "fuel_percentage_1": 0.0, "fuel_value_sensor_1": 0, "fuel_sensor_status_2": 0, "fuel_percentage_2": 0.0, "fuel_value_sensor_2": 0, "fuel_sensor_status_3": 0, "fuel_percentage_3": 0.0, "fuel_value_sensor_3": 0, "analog_input1": 0.0, "analog_input2": 0.0, "digital_input1": 0, "digital_input2": 0, "digital_output1": 0, "digital_output2": 0, "temp_sensor_status_1": 0, "temperature_1": 0.0, "temp_sensor_status_2": 0, "temperature_2": 0.0, "temp_sensor_status_3": 0, "temperature_3": 0.0, "humidity": 0, "odometer": 0, "dateTime": 1755836818, "timezone": 22, "dateTime_tz": "2025-08-22 09:56:58", "error_code": 0 | ||
} | } | ||
| Line 146: | Line 143: | ||
<html lang="en"> | <html lang="en"> | ||
<head> | <head> | ||
<meta charset="UTF-8" | <meta charset="UTF-8"> | ||
<title>Telemetry Packet Parser | <title>Telemetry Packet Parser</title> | ||
<style> | <style> | ||
body { font-family: Arial, sans-serif | body { font-family: Arial, sans-serif; } | ||
textarea { width: 100%; height: | textarea { width: 100%; height: 100px; font-family: monospace; } | ||
button { | button { | ||
padding: 10px 20px; border-radius: 50px; font-weight: bold; | padding: 10px 20px; | ||
background-color: #680022; color: white; border: none; cursor: pointer; | border-radius: 50px; | ||
font-weight: bold; | |||
background-color: #680022; | |||
color: white; | |||
border: none; | |||
cursor: pointer; | |||
} | |||
button:hover { | |||
background-color: #4c0019; | |||
} | } | ||
table { width: 100%; border-collapse: collapse; margin-top: 20px; } | |||
table { width: 100%; border-collapse: collapse; margin-top: | th, td { border: 1px solid #ccc; padding: 8px; text-align: left; } | ||
th, td { border: 1px solid #ccc; padding: | |||
th { background-color: #680022; color: white; } | th { background-color: #680022; color: white; } | ||
</style> | </style> | ||
</head> | </head> | ||
<body> | <body> | ||
<h2>Telemetry Packet Parser</h2> | |||
<textarea id="hexInput" placeholder="Paste packet here..."></textarea><br> | |||
<button onclick="parseTelemetry()">Parse Packet</button> | |||
<h3>Parsed Output:</h3> | |||
<table id="resultTable"> | |||
<thead><tr><th>Field</th><th>Value</th></tr></thead> | |||
<tbody></tbody> | |||
</table> | |||
<script> | <script> | ||
function | function hexToBits(hex) { | ||
return ( | return hex.match(/.{1,2}/g).map(byte => | ||
parseInt(byte, 16).toString(2).padStart(8, '0')).join(''); | |||
} | } | ||
function | |||
return | function bitsToInt(bits) { | ||
return parseInt(bits, 2); | |||
} | } | ||
function bitsToSignedInt(bits) { | function bitsToSignedInt(bits) { | ||
let value = parseInt(bits, 2); | |||
const max = Math.pow(2, bits.length); | |||
const max = | return value >= max / 2 ? value - max : value; | ||
return | |||
} | } | ||
function bigIntFromBits(bits) { | |||
return BigInt('0b' + bits).toString(); | |||
} | } | ||
function parseTelemetry() { | |||
const hex = document.getElementById("hexInput").value.trim().toLowerCase(); | |||
const hex = | const resultBody = document.querySelector("#resultTable tbody"); | ||
resultBody.innerHTML = ""; | |||
const | |||
if (!hex || !hex.startsWith("24")) { | |||
alert("Invalid packet"); | |||
return; | |||
} | |||
if (!hex | |||
const bits = hexToBits(hex); | const bits = hexToBits(hex); | ||
const | const output = (label, value) => { | ||
const row = document.createElement("tr"); | |||
row.innerHTML = `<td>${label}</td><td>${value}</td>`; | |||
resultBody.appendChild(row); | |||
}; | |||
const fields = [ | |||
const | ["Start Byte", 0, 8], ["Data Length", 8, 20], ["No. of Packets", 20, 25], | ||
["IMEI", 25, 75], ["Packet Type", 75, 80], ["Packet Status", 80, 81], | |||
["Frame Number", 81, 97], ["Alert ID", 97, 102], ["Operator", 102, 106], | |||
["Signal Strength", 106, 111], ["MCC", 111, 121], ["MNC", 121, 131], | |||
["Cell ID", 131, 147], ["LAC", 147, 163], ["Fix Status", 163, 164], | |||
["Latitude", 164, 193], ["NS Indication", 193, 194], ["Longitude", 194, 223], | |||
["EW Indication", 223, 224], ["HDOP", 224, 234], ["PDOP", 234, 244], | |||
["Speed", 244, 259], ["Altitude", 259, 274], ["Power Status", 274, 275], | |||
["Ignition Status", 275, 276], ["Immobilizer Status", 276, 277], | |||
["Tamper", 277, 278], ["Supply Voltage", 278, 288], ["Internal Battery Voltage", 288, 294], | |||
["Fuel Sensor Status 1", 294, 295], ["Fuel Percentage 1", 295, 305], | |||
["Fuel Sensor Value 1", 305, 321], ["Fuel Sensor Status 2", 321, 322], | |||
["Fuel Percentage 2", 322, 332], ["Fuel Sensor Value 2", 332, 348], | |||
["Fuel Sensor Status 3", 348, 349], ["Fuel Percentage 3", 349, 359], | |||
["Fuel Sensor Value 3", 359, 375], ["Analog Input 1", 375, 385], | |||
["Analog Input 2", 385, 395], ["Digital Input 1", 395, 396], | |||
["Digital Input 2", 396, 397], ["Digital Output 1", 397, 398], | |||
["Digital Output 2", 398, 399], ["Temperature Sensor Status 1", 399, 400], | |||
["Temperature 1", 400, 412], ["Temperature Sensor Status 2", 412, 413], | |||
["Temperature 2", 413, 425], ["Temperature Sensor Status 3", 425, 426], | |||
["Temperature 3", 426, 438], ["Humidity", 438, 445], ["Odometer", 445, 480], | |||
["DateTime UTC", 480, 512], ["TimeZone", 512, 520] | |||
]; | |||
let tempDateTime = 0; | |||
for (const [label, start, end] of fields) { | |||
const val = bits.slice(start, end); | |||
switch (label) { | |||
case "IMEI": | |||
output(label, bigIntFromBits(val)); | |||
val = | break; | ||
case "Latitude": | |||
case "Longitude": | |||
output(label, bitsToInt(val) / 1e6); | |||
break; | |||
case "HDOP": | |||
case "PDOP": | |||
output(label, bitsToInt(val) / 100); | |||
break; | |||
case "Speed": | |||
output(label, bitsToInt(val) / 100); | |||
break; | |||
case "Altitude": | |||
case "Supply Voltage": | |||
case "Internal Battery Voltage": | |||
case "Fuel Percentage 1": | |||
case "Fuel Percentage 2": | |||
case "Fuel Percentage 3": | |||
case "Analog Input 1": | |||
case "Analog Input 2": | |||
output(label, bitsToInt(val) / 10); | |||
break; | |||
case "Temperature 1": | |||
case "Temperature 2": | |||
case "Temperature 3": | |||
output(label, bitsToSignedInt(val) / 10); | |||
break; | |||
case "DateTime UTC": | |||
tempDateTime = bitsToInt(val); | |||
const utc = new Date(tempDateTime * 1000); | |||
output("DateTime (UTC)", utc.toISOString()); | |||
break; | |||
case "TimeZone": | |||
const tz = bitsToSignedInt(val); | |||
const offsetMin = tz * 15; | |||
const sign = offsetMin >= 0 ? "+" : "-"; | |||
const h = Math.floor(Math.abs(offsetMin) / 60); | |||
const m = Math.abs(offsetMin % 60); | |||
output("TimeZone", `${offsetMin} mins = UTC${sign}${h}:${m.toString().padStart(2, '0')}`); | |||
const localTime = new Date((tempDateTime + offsetMin * 60) * 1000); | |||
const formatted = localTime.toISOString().replace("T", " ").replace(".000Z", ""); | |||
output("DateTime (Local Time)", formatted); | |||
break; | |||
default: | |||
output(label, bitsToInt(val)); | |||
} | } | ||
} | } | ||
} | |||
</script> | </script> | ||
</body> | </body> | ||
</html> | </html> | ||
Latest revision as of 05:06, 4 February 2026
| Field | Size (bits) | Bit Range | Description | Breakdown |
|---|---|---|---|---|
| Header (10 bytes) | ||||
| Start byte | 8 | 0–7 | Starting character $ (ASCII value 36) | $ |
| Data length | 12 | 08–19 | 2-byte length of the data following the header | |
| Num of data packets | 5 | 20–24 | Number of packets (0–32) | 0–32 |
| IMEI | 50 | 25–74 | Unique device identifier | e.g., 887744556677882 |
| packet type | 5 | 75–79 | Integer type:
|
01 - Telemetry Packet |
| Data (= 55 bytes × number of packets) | ||||
| Packet Status | 1 | 80 | Type of packet | 0:History, 1:Live |
| Frame Number | 16 | 81-96 | Frame number | |
| AlertID | 5 | 97–101 | Alert identifier | |
| Operator | 4 | 102–105 | Network operator | 00-Unknown, 01-BSNL, 02-VI, 03-AIRTEL, 04-JIO |
| Signal Strength | 5 | 106–110 | Signal strength | Integer (0–31) |
| MCC | 10 | 111–120 | Mobile country code | Integer |
| MNC | 10 | 121–130 | Mobile network code | Integer |
| Cell Id | 16 | 131–146 | Cell tower ID | Integer |
| Location Area Code | 16 | 147–162 | Location area code | Integer |
| Fix_status | 1 | 163 | GPS fix status | 0: No fix, 1: Valid Fix |
| Latitude | 29 | 164–192 | Latitude coordinate | Divide by 1,000,000 for float value |
| NS_Indication | 1 | 193 | N or S | 0: N, 1: S |
| Longitude | 29 | 194–222 | Longitude coordinate | Divide by 1,000,000 for float value |
| EW_Indication | 1 | 223 | East/West Indication | 0: E, 1: W |
| HDOP | 10 | 224–233 | Horizontal dilution | Divide by 100 for float value |
| PDOP | 10 | 234–243 | Position dilution | Divide by 100 for float value |
| Speed | 15 | 244–258 | Speed in km/h | Divide by 100 for float value |
| Altitude | 15 | 259–273 | Altitude in meters | Divide by 100 for float value |
| Power Status | 1 | 274 | Power connection status | 0: Power disconnected, 1: Power connected |
| Ignition Status | 1 | 275 | Ignition status | 0: OFF, 1: ON |
| Immobilizer Status | 1 | 276 | Immobilizer status | 0: OFF, 1: ON |
| Tamper detection | 1 | 277 | Wire Tamper detection | 0: Tamper alert OFF, 1: Tamper alert ON |
| Supply Voltage | 10 | 278–287 | Supply voltage | Divide by 10 for float value |
| Internal Battery Voltage | 6 | 288–293 | Internal battery voltage | Divide by 10 for float value |
| FuelSensorstatus 1 | 1 | 294 | Status of fuel sensor 1 | 1 if connected, 0 if not connected |
| Fuel Percentage 1 | 10 | 295–304 | Fuel level percentage | Divide by 10 for float value |
| Fuel SensorValue 1 | 16 | 305–320 | Fuel sensor value | Divide by 10 if float |
| FuelSensorstatus 2 | 1 | 321 | Status of fuel sensor 2 | 1 if connected, 0 if not connected |
| Fuel Percentage 2 | 10 | 322–331 | Fuel level percentage | Divide by 10 for float value |
| Fuel SensorValue 2 | 16 | 332–347 | Fuel sensor value | Divide by 10 if float |
| FuelSensorstatus 3 | 1 | 348 | Status of fuel sensor 3 | 1 if connected, 0 if not connected |
| Fuel Percentage 3 | 16 | 349–358 | Fuel sensor value | Divide by 10 if float |
| Fuel SensorValue 3 | 16 | 359–374 | Fuel level percentage | Divide by 10 for float value |
| Analog Input 1 | 10 | 375–384 | Analog input | Divide by 10 for float value |
| Analog Input 2 | 10 | 385–394 | Analog input 1 | Divide by 10 for float value |
| Digital Input 1 | 1 | 395 | Digital input 1 | 0 or 1 |
| Digital Input 2 | 1 | 396 | Digital input 2 | 0 or 1 |
| Digital Output 1 | 1 | 397 | Digital output 1 | 0 or 1 |
| Digital Output 2 | 1 | 398 | Digital output 2 | 0 or 1 |
| Temperature sensor status 1 | 1 | 399 | Status of temperature sensor 1 | 1 if connected, 0 if not connected |
| Temperature 1 | 12 | 400–411 | Temperature in °C | Signed, divide by 10 for decimal value |
| Temperature sensor status 2 | 1 | 412 | Status of temperature sensor 2 | 1 if connected, 0 if not connected |
| Temperature 2 | 12 | 413–424 | Temperature in °C | Signed, divide by 10 for decimal value |
| Temperature sensor status 3 | 1 | 425 | Status of temperature sensor 3 | 1 if connected, 0 if not connected |
| Temperature 3 | 12 | 426–437 | Temperature in °C | Signed, divide by 10 for decimal value |
| Humidity | 7 | 438–444 | Humidity percentage | Integer value |
| Odometer | 35 | 445–479 | Odometer value in meters | |
| DateTime UTC | 32 | 480–511 | UTC Timestamp | UTC time in seconds |
| TimeZone | 8 | 512–519 | Timezone in quarter-hours (e.g., 22 = +5:30). Each unit = 15 mins. Value 22 = 22 × 15 mins = 330 mins = +5:30 Range: -48 to 56, 2's complement | Timezone in quarter-hours |
| Tail | ||||
| End Character | 8 | 0–7 | Starting character * (ASCII value 42) | * |
| CRC | 8 | 8–15 | 8-bit XOR CRC of data starting from $ to * (excluding $ and *) | |
Sample Packet
HEX "240370e21aeb7abfd5818011047aca0260081b780000000000000000000000000000307890000000000000000000000000000000000000000000000068a7f192162abf"
JSON
{"imei": 862942074896044, "packet_type": 1, "no_packets": 1, "packet_status": 1, "frame_number": 34, "alert_id": 1, "operator": 1, "signal_strength": 29, "mcc": 404, "mnc": 19, "cell_id": 64, "lac": 56256, "fix_status": 0, "latitude": 0.0, "latitude_dir": 0, "longitude": 0.0, "longitude_dir": 0, "hdop": 0.0, "pdop": 0.0, "speed": 0.0, "altitude": 0.0, "power": 1, "ignition": 1, "immobilizer": 0, "tamper": 0, "supply_volatge": 12.0, "internal_battery_volatge": 3.6, "fuel_sensor_status_1": 0, "fuel_percentage_1": 0.0, "fuel_value_sensor_1": 0, "fuel_sensor_status_2": 0, "fuel_percentage_2": 0.0, "fuel_value_sensor_2": 0, "fuel_sensor_status_3": 0, "fuel_percentage_3": 0.0, "fuel_value_sensor_3": 0, "analog_input1": 0.0, "analog_input2": 0.0, "digital_input1": 0, "digital_input2": 0, "digital_output1": 0, "digital_output2": 0, "temp_sensor_status_1": 0, "temperature_1": 0.0, "temp_sensor_status_2": 0, "temperature_2": 0.0, "temp_sensor_status_3": 0, "temperature_3": 0.0, "humidity": 0, "odometer": 0, "dateTime": 1755836818, "timezone": 22, "dateTime_tz": "2025-08-22 09:56:58", "error_code": 0
}
Telemetry Packet Parser
Parsed Output:
| Field | Value |
|---|