Device Info Packet: Difference between revisions
No edit summary |
No edit summary |
||
| (28 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
{| class="wikitable | {| class="wikitable" | ||
! Field | |- | ||
! Size (bits) | ! style="background-color:#680022; color:white;" | Field | ||
! Bit Range | ! style="background-color:#680022; color:white;" | Size (bits) | ||
! Description | ! style="background-color:#680022; color:white;" | Bit Range | ||
! Breakdown | ! style="background-color:#680022; color:white;" | Description | ||
! style="background-color:#680022; color:white;" | Breakdown | |||
|- | |- | ||
! colspan="5" style="background:#D3D3D3;" | Header (10 Bytes) | ! colspan="5" style="background:#D3D3D3;" | Header (10 Bytes) | ||
| Line 43: | Line 44: | ||
|- | |- | ||
! colspan="5" style="background:#D3D3D3;" | Data | ! colspan="5" style="background:#D3D3D3;" | Data (110 Bytes) | ||
|- | |- | ||
| Time | | Time | ||
| 32 | | 32 | ||
| | | 80-111 | ||
| UTC Timestamp | | UTC Timestamp | ||
| UTC time in seconds | | UTC time in seconds | ||
| Line 54: | Line 55: | ||
| Time Zone | | Time Zone | ||
| 8 | | 8 | ||
| | | 112-119 | ||
| Timezone in quarter-hours (e.g., 22 = +5:30), quarter-hour increment means each unit represents 15 minutes. The value 22 represents 22 quarter hours. Ranges from -48 to 56, negative timezone to 2's complement representation | | Timezone in quarter-hours (e.g., 22 = +5:30), quarter-hour increment means each unit represents 15 minutes. The value 22 represents 22 quarter hours. Ranges from -48 to 56, negative timezone to 2's complement representation | ||
| eg: 22 (+5:30) → 22×15=330 minutes → 330÷60=5.5 hours → 5 hours and 30 minutes | | eg: 22 (+5:30) → 22×15=330 minutes → 330÷60=5.5 hours → 5 hours and 30 minutes | ||
| Line 61: | Line 62: | ||
| ICCID | | ICCID | ||
| 160 | | 160 | ||
| | | 120-279 | ||
| 20 Bytes, Character string | | 20 Bytes, Character string | ||
| 8991000903297069053F | | 8991000903297069053F | ||
| Line 68: | Line 69: | ||
| VID | | VID | ||
| 32 | | 32 | ||
| | | 280-311 | ||
| 4 Bytes, Character string | | 4 Bytes, Character string | ||
| TRAN | | TRAN | ||
| Line 75: | Line 76: | ||
| CELLULAR_MODULE_FV NAME | | CELLULAR_MODULE_FV NAME | ||
| 40 | | 40 | ||
| | | 312-351 | ||
| 5 Bytes, Character string | | 5 Bytes, Character string | ||
| TSPJT | | TSPJT | ||
| Line 82: | Line 83: | ||
| CELLULAR_MODULE_FV VERSION | | CELLULAR_MODULE_FV VERSION | ||
| 80 | | 80 | ||
| | | 352-431 | ||
| 10 Bytes, Character string | | 10 Bytes, Character string | ||
| XX.YY.ZZZZ | | XX.YY.ZZZZ | ||
| Line 89: | Line 90: | ||
| CELLULAR_MODULE_FV BUILD NO | | CELLULAR_MODULE_FV BUILD NO | ||
| 40 | | 40 | ||
| | | 432-471 | ||
| 5 Bytes, Character string | | 5 Bytes, Character string | ||
| YYDDD | | YYDDD | ||
| Line 96: | Line 97: | ||
| MCU_APP_MODULE_FV NAME | | MCU_APP_MODULE_FV NAME | ||
| 40 | | 40 | ||
| | | 472-511 | ||
| 5 Bytes, Character string | | 5 Bytes, Character string | ||
| TSPJT | | TSPJT | ||
| Line 103: | Line 104: | ||
| MCU_APP_MODULE_FV VERSION | | MCU_APP_MODULE_FV VERSION | ||
| 80 | | 80 | ||
| | | 512-591 | ||
| 10 Bytes, Character string | | 10 Bytes, Character string | ||
| XX.YY.ZZZZ | | XX.YY.ZZZZ | ||
| Line 110: | Line 111: | ||
| MCU_APP_MODULE_FV BUILD NO | | MCU_APP_MODULE_FV BUILD NO | ||
| 40 | | 40 | ||
| | | 592-631 | ||
| 5 Bytes, Character string | | 5 Bytes, Character string | ||
| YYDDD | | YYDDD | ||
| Line 117: | Line 118: | ||
| MCU_BTL_MODULE_FV NAME | | MCU_BTL_MODULE_FV NAME | ||
| 40 | | 40 | ||
| | | 632-671 | ||
| 5 Bytes, Character string | | 5 Bytes, Character string | ||
| TSPJT | | TSPJT | ||
| Line 124: | Line 125: | ||
| MCU_BTL_MODULE_FV VERSION | | MCU_BTL_MODULE_FV VERSION | ||
| 80 | | 80 | ||
| | | 672-751 | ||
| 10 Bytes, Character string | | 10 Bytes, Character string | ||
| XX.YY.ZZZZ | | XX.YY.ZZZZ | ||
| Line 131: | Line 132: | ||
| MCU_BTL_MODULE_FV BUILD NO | | MCU_BTL_MODULE_FV BUILD NO | ||
| 40 | | 40 | ||
| | | 752-791 | ||
| 5 Bytes, Character string | | 5 Bytes, Character string | ||
| YYDDD | | YYDDD | ||
| Line 138: | Line 139: | ||
| VN | | VN | ||
| 80 | | 80 | ||
| | | 792-871 | ||
| 10 Bytes, Character string | | 10 Bytes, Character string | ||
| KL07CP8490 | | KL07CP8490 | ||
| Line 145: | Line 146: | ||
| HWINFO | | HWINFO | ||
| 88 | | 88 | ||
| | | 872-959 | ||
| 11 Bytes, Character string | | 11 Bytes, Character string | ||
| PCB-0220-AB | | PCB-0220-AB | ||
| Line 170: | Line 171: | ||
==Sample Packet== | ==Sample Packet== | ||
<pre> | |||
{ HEX: "2406e0e21aeb7abfd58068abec441638393931343632313630353131303436363837465452414e545344344720332e20302e20202035202020203054532d443420332e20302e20202035323532313154532d445220332e20302e202020323235323131585858585858585858585043422d303236312d41412a44" "imei": 862942074896044, "packet_type": 0, "no_packets": 1, "dateTime": 1756097604, "timezone": 22, "dateTime_tz": "2025-08-25 10:23:24", "iccid": "8991462160511046687F", "vid": "TRAN", "cmfv_name": "TSD4G", "cmfv_version": " 3. 0. 5", "cmfv_build": " 0", "mcua_name": "TS-D4", "mcua_version": " 3. 0. 5", "mcua_build": "25211", "mcub_name": "TS-DR", "mcub_version": " 3. 0. 2", "mcub_build": "25211", "vn": "XXXXXXXXXX", "hwinfo_build": "PCB-0261-AA", "error_code": 0 } | |||
</pre> | |||
<html lang="en"> | |||
<head> | |||
<meta charset="UTF-8"> | |||
<title>Device Info Packet Parser</title> | |||
<style> | |||
body { font-family: Arial, sans-serif; } | |||
textarea { width: 100%; height: 100px; font-family: monospace; } | |||
button { | |||
padding: 5px 15px; | |||
border-radius: 20px; | |||
margin-top: 10px; | |||
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; } | |||
th, td { border: 1px solid #ccc; padding: 8px; text-align: left; } | |||
th { background-color: #680022; color: white; } | |||
</style> | |||
</head> | |||
<body> | |||
<h2>Device Info Packet Parser</h2> | |||
<textarea id="packetInput" placeholder="Paste packet here..."></textarea><br> | |||
<button onclick="parsePacket()">Parse Packet</button> | |||
<h3>Parsed Output:</h3> | |||
<table id="resultTable"> | |||
<thead><tr><th>Field</th><th>Value</th></tr></thead> | |||
<tbody></tbody> | |||
</table> | |||
<script> | |||
function hexToBits(hex) { | |||
return hex.match(/.{1,2}/g).map(byte => | |||
parseInt(byte, 16).toString(2).padStart(8, '0')).join(''); | |||
} | |||
function bitsToInt(bits) { | |||
return parseInt(bits, 2); | |||
} | |||
function bitsToSignedInt(bits) { | |||
const value = parseInt(bits, 2); | |||
const max = Math.pow(2, bits.length); | |||
return value >= max / 2 ? value - max : value; | |||
} | |||
function bitsToAscii(bits) { | |||
return bits.match(/.{8}/g).map(b => String.fromCharCode(parseInt(b, 2))).join('').trim(); | |||
} | |||
function bigIntFromBits(bits) { | |||
return BigInt('0b' + bits).toString(); | |||
} | |||
function parsePacket() { | |||
const hex = document.getElementById('packetInput').value.trim().toLowerCase(); | |||
const resultBody = document.querySelector("#resultTable tbody"); | |||
resultBody.innerHTML = ""; | |||
if (!hex || !hex.startsWith("24")) { | |||
alert("Invalid packet"); | |||
return; | |||
} | |||
const bits = hexToBits(hex); | |||
const output = (label, value) => { | |||
const row = document.createElement("tr"); | |||
row.innerHTML = `<td>${label}</td><td>${value}</td>`; | |||
resultBody.appendChild(row); | |||
}; | |||
// Corrected IMEI extraction using bit-level parsing | |||
const imei = bigIntFromBits(bits.slice(25, 75)); | |||
output("IMEI", imei); | |||
const packetType = bitsToInt(bits.slice(75, 80)); | |||
output("Packet Type", packetType); | |||
const tsBits = bits.slice(80, 112); | |||
const timezoneBits = bits.slice(112, 120); | |||
const ts = bitsToInt(tsBits); | |||
const timezoneRaw = bitsToSignedInt(timezoneBits); | |||
const offsetMin = timezoneRaw * 15; | |||
const sign = offsetMin >= 0 ? "+" : "-"; | |||
const h = Math.floor(Math.abs(offsetMin) / 60); | |||
const m = Math.abs(offsetMin % 60); | |||
const localDate = new Date((ts + offsetMin * 60) * 1000); | |||
const localStr = localDate.toISOString().replace("T", " ").replace(".000Z", ""); | |||
output("DateTime (Epoch)", ts); | |||
output("TimeZone", `${offsetMin} mins = UTC${sign}${h}:${m.toString().padStart(2, '0')}`); | |||
output("DateTime (Local Time)", localStr); | |||
const asciiFields = [ | |||
["ICCID", 120, 279], | |||
["VID", 280, 311], | |||
["CMFV Name", 312, 351], | |||
["CMFV Version", 352, 431], | |||
["CMFV Build", 432, 471], | |||
["MCUA Name", 472, 511], | |||
["MCUA Version", 512, 591], | |||
["MCUA Build", 592, 631], | |||
["MCUB Name", 632, 671], | |||
["MCUB Version", 672, 751], | |||
["MCUB Build", 752, 791], | |||
["VN", 792, 871], | |||
["HWINFO", 872, 959] | |||
]; | |||
for (const [label, start, end] of asciiFields) { | |||
const value = bitsToAscii(bits.slice(start, end + 1)); | |||
output(label, value); | |||
} | |||
output("Error Code", 0); // Optional placeholder | |||
} | |||
</script> | |||
</body> | |||
</html> | |||
Latest revision as of 05:21, 18 December 2025
| 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 | |
| Number of data packets | 5 | 20–24 | Number of packets (0–32) | 0–32 |
| IMEI | 50 | 25–74 | Unique device identifier | |
| Packet type | 5 | 75–79 | Type of packet | 00 - Device Info |
| Data (110 Bytes) | ||||
| Time | 32 | 80-111 | UTC Timestamp | UTC time in seconds |
| Time Zone | 8 | 112-119 | Timezone in quarter-hours (e.g., 22 = +5:30), quarter-hour increment means each unit represents 15 minutes. The value 22 represents 22 quarter hours. Ranges from -48 to 56, negative timezone to 2's complement representation | eg: 22 (+5:30) → 22×15=330 minutes → 330÷60=5.5 hours → 5 hours and 30 minutes |
| ICCID | 160 | 120-279 | 20 Bytes, Character string | 8991000903297069053F |
| VID | 32 | 280-311 | 4 Bytes, Character string | TRAN |
| CELLULAR_MODULE_FV NAME | 40 | 312-351 | 5 Bytes, Character string | TSPJT |
| CELLULAR_MODULE_FV VERSION | 80 | 352-431 | 10 Bytes, Character string | XX.YY.ZZZZ |
| CELLULAR_MODULE_FV BUILD NO | 40 | 432-471 | 5 Bytes, Character string | YYDDD |
| MCU_APP_MODULE_FV NAME | 40 | 472-511 | 5 Bytes, Character string | TSPJT |
| MCU_APP_MODULE_FV VERSION | 80 | 512-591 | 10 Bytes, Character string | XX.YY.ZZZZ |
| MCU_APP_MODULE_FV BUILD NO | 40 | 592-631 | 5 Bytes, Character string | YYDDD |
| MCU_BTL_MODULE_FV NAME | 40 | 632-671 | 5 Bytes, Character string | TSPJT |
| MCU_BTL_MODULE_FV VERSION | 80 | 672-751 | 10 Bytes, Character string | XX.YY.ZZZZ |
| MCU_BTL_MODULE_FV BUILD NO | 40 | 752-791 | 5 Bytes, Character string | YYDDD |
| VN | 80 | 792-871 | 10 Bytes, Character string | KL07CP8490 |
| HWINFO | 88 | 872-959 | 11 Bytes, Character string | PCB-0220-AB |
| Tail(2 Bytes) | ||||
| 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: "2406e0e21aeb7abfd58068abec441638393931343632313630353131303436363837465452414e545344344720332e20302e20202035202020203054532d443420332e20302e20202035323532313154532d445220332e20302e202020323235323131585858585858585858585043422d303236312d41412a44" "imei": 862942074896044, "packet_type": 0, "no_packets": 1, "dateTime": 1756097604, "timezone": 22, "dateTime_tz": "2025-08-25 10:23:24", "iccid": "8991462160511046687F", "vid": "TRAN", "cmfv_name": "TSD4G", "cmfv_version": " 3. 0. 5", "cmfv_build": " 0", "mcua_name": "TS-D4", "mcua_version": " 3. 0. 5", "mcua_build": "25211", "mcub_name": "TS-DR", "mcub_version": " 3. 0. 2", "mcub_build": "25211", "vn": "XXXXXXXXXX", "hwinfo_build": "PCB-0261-AA", "error_code": 0 }
Device Info Packet Parser
Parsed Output:
| Field | Value |
|---|