Jump to content

Device Info Packet: Difference between revisions

From Transight Wiki
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

Device Info Packet Parser


Parsed Output:

FieldValue

Device Info Packet Parser

Device Info Packet Parser