Device Info Packet: Difference between revisions
No edit summary |
No edit summary |
||
| Line 333: | Line 333: | ||
</script> | </script> | ||
</body> | |||
</html> | |||
<html lang="en"> | |||
<head> | |||
<meta charset="UTF-8"> | |||
<title>Device Info Packet Parser</title> | |||
<style> | |||
body { font-family: Arial, sans-serif; padding: 20px; } | |||
textarea { width: 100%; height: 100px; font-family: monospace; } | |||
button { | |||
padding: 10px 20px; | |||
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 your hex packet here..."></textarea><br> | |||
<button onclick="parsePacket()">Parse Packet</button> | |||
<pre id="output"></pre> | |||
<script> | |||
function parsePacket() { | |||
const hex = document.getElementById('packetInput').value.trim(); | |||
const bits = hex.match(/.{1,2}/g).map(h => parseInt(h, 16).toString(2).padStart(8, '0')).join(''); | |||
const getBits = (start, end) => bits.slice(start, end + 1); | |||
const getAscii = (start, end) => { | |||
return bits.slice(start, end + 1).match(/.{8}/g).map(b => String.fromCharCode(parseInt(b, 2))).join('').trim(); | |||
}; | |||
const getInt = (start, end) => parseInt(getBits(start, end), 2); | |||
const getBCD = (start, end) => getBits(start, end).match(/.{4}/g).map(b => parseInt(b, 2).toString(16)).join('').toUpperCase(); | |||
const getTimestamp = (start, end, tzBits) => { | |||
const ts = getInt(start, end); | |||
const tzRaw = parseInt(getBits(tzBits, tzBits + 7), 2); | |||
const timezone = tzRaw > 127 ? tzRaw - 256 : tzRaw; | |||
const date = new Date((ts + timezone * 900) * 1000); // 900s = 15 min | |||
return { ts, timezone, local: date.toISOString().replace('T', ' ').slice(0, 19) }; | |||
}; | |||
const parsed = { | |||
imei: parseInt(getBits(24, 74), 2), | |||
packet_type: getInt(75, 79), | |||
no_packets: getInt(19, 23), | |||
...(() => { | |||
const ts = getTimestamp(80, 111, 112); | |||
return { | |||
dateTime: ts.ts, | |||
timezone: ts.timezone, | |||
dateTime_tz: ts.local | |||
}; | |||
})(), | |||
iccid: getAscii(120, 279), | |||
vid: getAscii(280, 311), | |||
cmfv_name: getAscii(312, 351), | |||
cmfv_version: getAscii(352, 431), | |||
cmfv_build: getAscii(432, 471), | |||
mcua_name: getAscii(472, 511), | |||
mcua_version: getAscii(512, 591), | |||
mcua_build: getAscii(592, 631), | |||
mcub_name: getAscii(632, 671), | |||
mcub_version: getAscii(672, 751), | |||
mcub_build: getAscii(752, 791), | |||
vn: getAscii(792, 871), | |||
hwinfo_build: getAscii(872, 959), | |||
error_code: 0, | |||
raw_data: hex | |||
}; | |||
document.getElementById('output').textContent = JSON.stringify(parsed, null, 2); | |||
} | |||
</script> | |||
</body> | </body> | ||
</html> | </html> | ||
Revision as of 04:53, 17 July 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 | ||||
| Time | 32 | UTC Timestamp | UTC time in seconds | |
| Time Zone | 8 | 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 | 20 Bytes, Character string | 8991000903297069053F | |
| VID | 32 | 4 Bytes, Character string | TRAN | |
| CELLULAR_MODULE_FV NAME | 40 | 5 Bytes, Character string | TSPJT | |
| CELLULAR_MODULE_FV VERSION | 80 | 10 Bytes, Character string | XX.YY.ZZZZ | |
| CELLULAR_MODULE_FV BUILD NO | 40 | 5 Bytes, Character string | YYDDD | |
| MCU_APP_MODULE_FV NAME | 40 | 5 Bytes, Character string | TSPJT | |
| MCU_APP_MODULE_FV VERSION | 80 | 10 Bytes, Character string | XX.YY.ZZZZ | |
| MCU_APP_MODULE_FV BUILD NO | 40 | 5 Bytes, Character string | YYDDD | |
| MCU_BTL_MODULE_FV NAME | 40 | 5 Bytes, Character string | TSPJT | |
| MCU_BTL_MODULE_FV VERSION | 80 | 10 Bytes, Character string | XX.YY.ZZZZ | |
| MCU_BTL_MODULE_FV BUILD NO | 40 | 5 Bytes, Character string | YYDDD | |
| VN | 80 | 10 Bytes, Character string | KL07CP8490 | |
| HWINFO | 88 | 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 : "2406e0e21aeb7abfd58068778b681638393931393530393132393633373932393833355452414e545344344720332e20302e202020342020202030545344345220332e20302e202020332020202030545344524220332e20302e202020312020202030585858585858585858585043422d303236312d41412ab9"
{"imei": 862942074896044,
"packet_type": 0, "no_packets": 1, "dateTime": 1752664936, "timezone": 22, "dateTime_tz": "2025-07-16 16:52:16", "iccid": "89919509129637929835", "vid": "TRAN", "cmfv_name": "TSD4G", "cmfv_version": " 3. 0. 4", "cmfv_build": " 0", "mcua_name": "TSD4R", "mcua_version": " 3. 0. 3", "mcua_build": " 0", "mcub_name": "TSDRB", "mcub_version": " 3. 0. 1", "mcub_build": " 0", "vn": "XXXXXXXXXX", "hwinfo_build": "PCB-0261-AA", "error_code": 0, "raw_data": }
Device Info Packet Parser
Parsed Output:
| Field | Value |
|---|
Device Info Packet Parser