Jump to content

Device Info Packet: Difference between revisions

From Transight Wiki
No edit summary
No edit summary
Line 336: Line 336:
</html>
</html>


<!DOCTYPE html
<html lang="en">
<html lang="en">
<head>
<head>
Line 363: Line 364:
   <textarea id="packetInput" placeholder="Paste your hex packet here..."></textarea><br>
   <textarea id="packetInput" placeholder="Paste your hex packet here..."></textarea><br>
   <button onclick="parsePacket()">Parse Packet</button>
   <button onclick="parsePacket()">Parse Packet</button>
   <pre id="output"></pre>
   <div id="output"></div>


   <script>
   <script>
     function parsePacket() {
     function parsePacket() {
       const hex = document.getElementById('packetInput').value.trim();
       const hex = document.getElementById('packetInput').value.trim();
      if (!hex) return;
       const bits = hex.match(/.{1,2}/g).map(h => parseInt(h, 16).toString(2).padStart(8, '0')).join('');
       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 getBits = (start, end) => bits.slice(start, end + 1);
       const getAscii = (start, end) => {
       const getAscii = (start, end) => getBits(start, end).match(/.{8}/g).map(b => String.fromCharCode(parseInt(b, 2))).join('').trim();
        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 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 getTimestamp = (start, end, tzBits) => {
         const ts = getInt(start, end);
         const ts = getInt(start, end);
         const tzRaw = parseInt(getBits(tzBits, tzBits + 7), 2);
         const tzRaw = parseInt(getBits(tzBits, tzBits + 7), 2);
         const timezone = tzRaw > 127 ? tzRaw - 256 : tzRaw;
         const timezone = tzRaw > 127 ? tzRaw - 256 : tzRaw;
         const date = new Date((ts + timezone * 900) * 1000); // 900s = 15 min
         const date = new Date((ts + timezone * 900) * 1000);
         return { ts, timezone, local: date.toISOString().replace('T', ' ').slice(0, 19) };
         return { ts, timezone, local: date.toISOString().replace('T', ' ').slice(0, 19) };
       };
       };


       const parsed = {
       const parsed = {
         imei: parseInt(getBits(24, 74), 2),
         "IMEI": parseInt(getBits(24, 74), 2),
         packet_type: getInt(75, 79),
         "Packet Type": getInt(75, 79),
         no_packets: getInt(19, 23),
         "No. of Packets": getInt(19, 23),
         ...(() => {
         ...(() => {
           const ts = getTimestamp(80, 111, 112);
           const ts = getTimestamp(80, 111, 112);
           return {
           return {
             dateTime: ts.ts,
             "DateTime (UTC seconds)": ts.ts,
             timezone: ts.timezone,
             "Timezone": ts.timezone,
             dateTime_tz: ts.local
             "DateTime (Local)": ts.local
           };
           };
         })(),
         })(),
         iccid: getAscii(120, 279),
         "ICCID": getAscii(120, 279),
         vid: getAscii(280, 311),
         "VID": getAscii(280, 311),
         cmfv_name: getAscii(312, 351),
         "CELLULAR_MODULE_FV NAME": getAscii(312, 351),
         cmfv_version: getAscii(352, 431),
         "CELLULAR_MODULE_FV VERSION": getAscii(352, 431),
         cmfv_build: getAscii(432, 471),
         "CELLULAR_MODULE_FV BUILD NO": getAscii(432, 471),
         mcua_name: getAscii(472, 511),
         "MCU_APP_MODULE_FV NAME": getAscii(472, 511),
         mcua_version: getAscii(512, 591),
         "MCU_APP_MODULE_FV VERSION": getAscii(512, 591),
         mcua_build: getAscii(592, 631),
         "MCU_APP_MODULE_FV BUILD NO": getAscii(592, 631),
         mcub_name: getAscii(632, 671),
         "MCU_BTL_MODULE_FV NAME": getAscii(632, 671),
         mcub_version: getAscii(672, 751),
         "MCU_BTL_MODULE_FV VERSION": getAscii(672, 751),
         mcub_build: getAscii(752, 791),
         "MCU_BTL_MODULE_FV BUILD NO": getAscii(752, 791),
         vn: getAscii(792, 871),
         "VN": getAscii(792, 871),
         hwinfo_build: getAscii(872, 959),
         "HWINFO": getAscii(872, 959),
         error_code: 0,
         "Error Code": 0,
         raw_data: hex
         "Raw Packet": hex
       };
       };


       document.getElementById('output').textContent = JSON.stringify(parsed, null, 2);
       const outputDiv = document.getElementById('output');
      outputDiv.innerHTML = `
        <table>
          <thead>
            <tr><th>Field</th><th>Value</th></tr>
          </thead>
          <tbody>
            ${Object.entries(parsed).map(([k, v]) =>
              `<tr><td>${k}</td><td>${v}</td></tr>`).join('')}
          </tbody>
        </table>
      `;
     }
     }
   </script>
   </script>
</body>
</body>
</html>
</html>

Revision as of 05:02, 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

<!DOCTYPE html Device Info Packet Parser

Device Info Packet Parser