UNPKG

@iotize/ionic

Version:

Iotize specific building blocks on top of @ionic/angular.

93 lines 13 kB
export function checkManufacturerDataMatch(parsedScanRecors, manufacturerDataFilters) { const companyIdentifierRecords = parsedScanRecors.filter((record) => { return record.type === 0xff && record.data.length >= 2; }); if (companyIdentifierRecords.length === 0) { return false; } else if (companyIdentifierRecords.length > 1) { console.warn(`Multiple company identifier record found. Only using the first one`); } const manufacturerDataRecord = companyIdentifierRecords[0]; const recordCompanyIdentifierId = _toUint16(manufacturerDataRecord.data); return !!manufacturerDataFilters.find((manufacturerDataFilter) => { const filterManufacturerId = _toUint16(manufacturerDataFilter.companyIdentifier); if (filterManufacturerId !== recordCompanyIdentifierId) { return false; } if (manufacturerDataFilter.dataPrefix) { return checkManufacturerDataPrefix(manufacturerDataRecord.data.subarray(2), manufacturerDataFilter.dataPrefix, manufacturerDataFilter.mask); } return true; }); } export function parseScanRecords(scanRecord) { const records = []; if (!scanRecord?.length) { return records; } let index = 0; const arrayScanRecord = Uint8Array.from(scanRecord); while (index < arrayScanRecord.length) { const length = arrayScanRecord[index++]; //Done once we run out of records if (length == 0) break; const type = arrayScanRecord[index++]; //Done if our record isn't a valid type if (type == 0) break; const dataLength = length - 1; const data = Uint8Array.from(arrayScanRecord.slice(index, index + dataLength)); index += dataLength; records.push({ data, length, type, }); } return records; } function checkManufacturerDataPrefix(data, dataPrefix, mask) { const subData = Uint8Array.from(data).subarray(0, dataPrefix.length); if (mask) { for (let bytePosition = 0; bytePosition < dataPrefix.length; bytePosition++) { const dataByte = data[bytePosition]; const dataPrefixByte = dataPrefix[bytePosition]; const maskByte = mask[bytePosition]; if (maskByte) { for (let bitPosition = 0; bitPosition < 8; bitPosition++) { const mask = 1 << (7 - bitPosition); if ((maskByte & mask) === 0) { // If mask bit is not set, we don't need to check this bit continue; } if ((dataByte & mask) !== (dataPrefixByte & mask)) { return false; } } } } return true; } else { return arrayEquals(subData, dataPrefix); } } function arrayEquals(arg0, dataPrefix) { return (arg0.length === dataPrefix.length && arg0.every((v, index) => v === dataPrefix[index])); } function _toUint16(data) { if (!data) { return 0; } else if (typeof data === 'number') { return data; } else { const uint8Array = Uint8Array.from(data); return (uint8Array[0] << 8) + uint8Array[1]; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFudWZhY3R1cmVyLWRhdGEtZmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW90aXplLWlvbmljL3NyYy9saWIvdGFwLXNjYW5uZXIvdGFwLXNjYW5uZXItYmxlL21hbnVmYWN0dXJlci1kYXRhLWZpbHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFZQSxNQUFNLFVBQVUsMEJBQTBCLENBQ3hDLGdCQUE4QixFQUM5Qix1QkFBNkQ7SUFFN0QsTUFBTSx3QkFBd0IsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNsRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDLENBQUMsQ0FBQztJQUNILElBQUksd0JBQXdCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztTQUFNLElBQUksd0JBQXdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQy9DLE9BQU8sQ0FBQyxJQUFJLENBQ1Ysb0VBQW9FLENBQ3JFLENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxzQkFBc0IsR0FBRyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRCxNQUFNLHlCQUF5QixHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6RSxPQUFPLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxzQkFBc0IsRUFBRSxFQUFFO1FBQy9ELE1BQU0sb0JBQW9CLEdBQUcsU0FBUyxDQUNwQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FDekMsQ0FBQztRQUNGLElBQUksb0JBQW9CLEtBQUsseUJBQXlCLEVBQUUsQ0FBQztZQUN2RCxPQUFPLEtBQUssQ0FB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Q0FBQztJQUNkLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxXQUFXLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQ2xCLElBQTJCLEVBQzNCLFVBQWlDO0lBRWpDLE9BQU8sQ0FDTCxJQUFJLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxNQUFNO1FBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ2xELENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsSUFBZ0Q7SUFDakUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO1NBQU0sSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNwQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgU2NhblJlY29yZCB7XG4gIGxlbmd0aDogbnVtYmVyO1xuICB0eXBlOiBudW1iZXI7XG4gIGRhdGE6IFVpbnQ4QXJyYXk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViQmx1ZXRvb3RoTWFudWZhY3R1cmVyRGF0YUZpbHRlciB7XG4gIGNvbXBhbnlJZGVudGlmaWVyPzogbnVtYmVyIHwgVWludDhBcnJheSB8IG51bWJlcltdO1xuICBkYXRhUHJlZml4PzogVWludDhBcnJheSB8IG51bWJlcltdO1xuICBtYXNrPzogVWludDhBcnJheSB8IG51bWJlcltdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tNYW51ZmFjdHVyZXJEYXRhTWF0Y2goXG4gIHBhcnNlZFNjYW5SZWNvcnM6IFNjYW5SZWNvcmRbXSxcbiAgbWFudWZhY3R1cmVyRGF0YUZpbHRlcnM6IFdlYkJsdWV0b290aE1hbnVmYWN0dXJlckRhdGFGaWx0ZXJbXVxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbXBhbnlJZGVudGlmaWVyUmVjb3JkcyA9IHBhcnNlZFNjYW5SZWNvcnMuZmlsdGVyKChyZWNvcmQpID0+IHtcbiAgICByZXR1cm4gcmVjb3JkLnR5cGUgPT09IDB4ZmYgJiYgcmVjb3JkLmRhdGEubGVuZ3RoID49IDI7XG4gIH0pO1xuICBpZiAoY29tcGFueUlkZW50aWZpZXJSZWNvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChjb21wYW55SWRlbnRpZmllclJlY29yZHMubGVuZ3RoID4gMSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBNdWx0aXBsZSBjb21wYW55IGlkZW50aWZpZXIgcmVjb3JkIGZvdW5kLiBPbmx5IHVzaW5nIHRoZSBmaXJzdCBvbmVgXG4gICAgKTtcbiAgfVxuICBjb25zdCBtYW51ZmFjdHVyZXJEYXRhUmVjb3JkID0gY29tcGFueUlkZW50aWZpZXJSZWNvcmRzWzBdO1xuICBjb25zdCByZWNvcmRDb21wYW55SWRlbnRpZmllcklkID0gX3RvVWludDE2KG1hbnVmYWN0dXJlckRhdGFSZWNvcmQuZGF0YSk7XG4gIHJldHVybiAhIW1hbnVmYWN0dXJlckRhdGFGaWx0ZXJzLmZpbmQoKG1hbnVmYWN0dXJlckRhdGFGaWx0ZXIpID0+IHtcbiAgICBjb25zdCBmaWx0ZXJNYW51ZmFjdHVyZXJJZCA9IF90b1VpbnQxNihcbiAgICAgIG1hbnVmYWN0dXJlckRhdGFGaWx0ZXIuY29tcGFueUlkZW50aWZpZXJcbiAgICApO1xuICAgIGlmIChmaWx0ZXJNYW51ZmFjdHVyZXJJZCAhPT0gcmVjb3JkQ29tcGFueUlkZW50aWZpZXJJZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobWFudWZhY3R1cmVyRGF0YUZpbHRlci5kYXRhUHJlZml4KSB7XG4gICAgICByZXR1cm4gY2hlY2tNYW51ZmFjdHVyZXJEYXRhUHJlZml4KFxuICAgICAgICBtYW51ZmFjdHVyZXJEYXRhUmVjb3JkLmRhdGEuc3ViYXJyYXkoMiksXG4gICAgICAgIG1hbnVmYWN0dXJlckRhdGFGaWx0ZXIuZGF0YVByZWZpeCxcbiAgICAgICAgbWFudWZhY3R1cmVyRGF0YUZpbHRlci5tYXNrXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNjYW5SZWNvcmRzKFxuICBzY2FuUmVjb3JkOiBudW1iZXJbXSB8IEJ1ZmZlciB8IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWRcbik6IFNjYW5SZWNvcmRbXSB7XG4gIGNvbnN0IHJlY29yZHM6IFNjYW5SZWNvcmRbXSA9IFtdO1xuICBpZiAoIXNjYW5SZWNvcmQ/Lmxlbmd0aCkge1xuICAgIHJldHVybiByZWNvcmRzO1xuICB9XG4gIGxldCBpbmRleCA9IDA7XG4gIGNvbnN0IGFycmF5U2NhblJlY29yZCA9IFVpbnQ4QXJyYXkuZnJvbShzY2FuUmVjb3JkKTtcbiAgd2hpbGUgKGluZGV4IDwgYXJyYXlTY2FuUmVjb3JkLmxlbmd0aCkge1xuICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5U2NhblJlY29yZFtpbmRleCsrXTtcbiAgICAvL0RvbmUgb25jZSB3ZSBydW4gb3V0IG9mIHJlY29yZHNcbiAgICBpZiAobGVuZ3RoID09IDApIGJyZWFrO1xuXG4gICAgY29uc3QgdHlwZSA9IGFycmF5U2NhblJlY29yZFtpbmRleCsrXTtcbiAgICAvL0RvbmUgaWYgb3VyIHJlY29yZCBpc24ndCBhIHZhbGlkIHR5cGVcbiAgICBpZiAodHlwZSA9PSAwKSBicmVhaztcblxuICAgIGNvbnN0IGRhdGFMZW5ndGggPSBsZW5ndGggLSAxO1xuICAgIGNvbnN0IGRhdGEgPSBVaW50OEFycmF5LmZyb20oXG4gICAgICBhcnJheVNjYW5SZWNvcmQuc2xpY2UoaW5kZXgsIGluZGV4ICsgZGF0YUxlbmd0aClcbiAgICApO1xuICAgIGluZGV4ICs9IGRhdGFMZW5ndGg7XG5cbiAgICByZWNvcmRzLnB1c2goe1xuICAgICAgZGF0YSxcbiAgICAgIGxlbmd0aCxcbiAgICAgIHR5cGUsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVjb3Jkcztcbn1cblxuZnVuY3Rpb24gY2hlY2tNYW51ZmFjdHVyZXJEYXRhUHJlZml4KFxuICBkYXRhOiBVaW50OEFycmF5IHwgbnVtYmVyW10sXG4gIGRhdGFQcmVmaXg6IFVpbnQ4QXJyYXkgfCBudW1iZXJbXSxcbiAgbWFzazogVWludDhBcnJheSB8IG51bWJlcltdIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgY29uc3Qgc3ViRGF0YSA9IFVpbnQ4QXJyYXkuZnJvbShkYXRhKS5zdWJhcnJheSgwLCBkYXRhUHJlZml4Lmxlbmd0aCk7XG4gIGlmIChtYXNrKSB7XG4gICAgZm9yIChcbiAgICAgIGxldCBieXRlUG9zaXRpb24gPSAwO1xuICAgICAgYnl0ZVBvc2l0aW9uIDwgZGF0YVByZWZpeC5sZW5ndGg7XG4gICAgICBieXRlUG9zaXRpb24rK1xuICAgICkge1xuICAgICAgY29uc3QgZGF0YUJ5dGUgPSBkYXRhW2J5dGVQb3NpdGlvbl07XG4gICAgICBjb25zdCBkYXRhUHJlZml4Qnl0ZSA9IGRhdGFQcmVmaXhbYnl0ZVBvc2l0aW9uXTtcbiAgICAgIGNvbnN0IG1hc2tCeXRlID0gbWFza1tieXRlUG9zaXRpb25dO1xuICAgICAgaWYgKG1hc2tCeXRlKSB7XG4gICAgICAgIGZvciAobGV0IGJpdFBvc2l0aW9uID0gMDsgYml0UG9zaXRpb24gPCA4OyBiaXRQb3NpdGlvbisrKSB7XG4gICAgICAgICAgY29uc3QgbWFzayA9IDEgPDwgKDcgLSBiaXRQb3NpdGlvbik7XG4gICAgICAgICAgaWYgKChtYXNrQnl0ZSAmIG1hc2spID09PSAwKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXNrIGJpdCBpcyBub3Qgc2V0LCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoaXMgYml0XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKChkYXRhQnl0ZSAmIG1hc2spICE9PSAoZGF0YVByZWZpeEJ5dGUgJiBtYXNrKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXJyYXlFcXVhbHMoc3ViRGF0YSwgZGF0YVByZWZpeCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXJyYXlFcXVhbHMoXG4gIGFyZzA6IFVpbnQ4QXJyYXkgfCBudW1iZXJbXSxcbiAgZGF0YVByZWZpeDogVWludDhBcnJheSB8IG51bWJlcltdXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBhcmcwLmxlbmd0aCA9PT0gZGF0YVByZWZpeC5sZW5ndGggJiZcbiAgICBhcmcwLmV2ZXJ5KCh2LCBpbmRleCkgPT4gdiA9PT0gZGF0YVByZWZpeFtpbmRleF0pXG4gICk7XG59XG5cbmZ1bmN0aW9uIF90b1VpbnQxNihkYXRhOiBVaW50OEFycmF5IHwgbnVtYmVyW10gfCBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgaWYgKCFkYXRhKSB7XG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdWludDhBcnJheSA9IFVpbnQ4QXJyYXkuZnJvbShkYXRhKTtcbiAgICByZXR1cm4gKHVpbnQ4QXJyYXlbMF0gPDwgOCkgKyB1aW50OEFycmF5WzFdO1xuICB9XG59XG4iXX0=