/
pvvx
/
TLB2Z
Обзор
Документация
Войти
/
pvvx
/
TLB2Z
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/zigpy_ota/scripts/ota.js
61 строка
2 KB
Victor
global updates
17 фев 2026, 16:51
17 фев 2026, 16:51
f947a7a
Код
Авторство
О чём код?
const assert = require('assert'); const upgradeFileIdentifier = Buffer.from([0x1E, 0xF1, 0xEE, 0x0B]); function parseSubElement(buffer, position) { const tagID = buffer.readUInt16LE(position); const length = buffer.readUInt32LE(position + 2); const data = buffer.slice(position + 6, position + 6 + length); return {tagID, length, data}; } function parseImage(rawBuffer) { const start = rawBuffer.indexOf(upgradeFileIdentifier); const buffer = rawBuffer.slice(start); const header = { otaUpgradeFileIdentifier: buffer.subarray(0, 4), otaHeaderVersion: buffer.readUInt16LE(4), otaHeaderLength: buffer.readUInt16LE(6), otaHeaderFieldControl: buffer.readUInt16LE(8), manufacturerCode: buffer.readUInt16LE(10), imageType: buffer.readUInt16LE(12), fileVersion: buffer.readUInt32LE(14), zigbeeStackVersion: buffer.readUInt16LE(18), otaHeaderString: buffer.toString('utf8', 20, 52).split('\u0000')[0], totalImageSize: buffer.readUInt32LE(52), }; let headerPos = 56; if (header.otaHeaderFieldControl & 1) { header.securityCredentialVersion = buffer.readUInt8(headerPos); headerPos += 1; } if (header.otaHeaderFieldControl & 2) { header.upgradeFileDestination = buffer.subarray(headerPos, headerPos + 8); headerPos += 8; } if (header.otaHeaderFieldControl & 4) { header.minimumHardwareVersion = buffer.readUInt16LE(headerPos); headerPos += 2; header.maximumHardwareVersion = buffer.readUInt16LE(headerPos); headerPos += 2; } const raw = buffer.slice(0, header.totalImageSize); assert(Buffer.compare(header.otaUpgradeFileIdentifier, upgradeFileIdentifier) === 0, 'Not an OTA file'); let position = header.otaHeaderLength; const elements = []; while (position < header.totalImageSize) { const element = parseSubElement(buffer, position); elements.push(element); position += element.data.length + 6; } assert(position === header.totalImageSize, 'Size mismatch'); return {header, elements, raw}; } module.exports = { parseImage };