UNPKG

knx-listener

Version:

A thin client that creates a tunnel to knx gateway to listen to telegrams within knx net

81 lines 10 kB
"use strict"; const os_1 = require("os"); function ip2num(ipString) { const ipNumber = ipString.split('.'); return ((((((+ipNumber[0]) * 256) + (+ipNumber[1])) * 256) + (+ipNumber[2])) * 256) + (+ipNumber[3]); } exports.ip2num = ip2num; function num2ip(ipNumber) { let ipString = (ipNumber % 256).toString(); for (let i = 3; i > 0; i--) { ipNumber = Math.floor(ipNumber / 256); ipString = ipNumber % 256 + '.' + ipString; } return ipString; } exports.num2ip = num2ip; function num2mac(macNumber) { return String(1e12 + (macNumber) .toString(16)).slice(-12).match(/.{1,2}/g).join(':'); } exports.num2mac = num2mac; function mac2num(macString) { return parseInt(macString.split(':').join(''), 16); } exports.mac2num = mac2num; function getCurrentIp() { const ifaces = os_1.networkInterfaces(); for (const dev in ifaces) { for (const details of ifaces[dev]) { if (details.family === 'IPv4' && details.internal === false) { return details.address; } } } throw new Error('Failed to get current ip'); } exports.getCurrentIp = getCurrentIp; function sizeOf(value) { return Math.ceil(Math.log2(value + 1) / 4) || 1; } exports.sizeOf = sizeOf; function knxAddr2num(addrStr) { const m = addrStr.split(/[\.\/]/); if (m && m.length > 0) { return (((+m[0]) & 0x01f) << 11) + (((+m[1]) & 0x07) << 8) + ((+m[2]) & 0xff); } throw Error(`Could not encode ${addrStr} address`); } exports.knxAddr2num = knxAddr2num; function num2knxAddr(addrNum, isGroupAddr = true) { return [ (addrNum >> 11) & 0xf, isGroupAddr ? (addrNum >> 8) & 0x7 : (addrNum >> 8) & 0xf, (addrNum & 0xff) ].join(isGroupAddr ? '/' : '.'); } exports.num2knxAddr = num2knxAddr; function removeNonPrintable(str) { return str.replace(/[^\x20-\x7E]+/g, ''); } exports.removeNonPrintable = removeNonPrintable; function noop(..._) { } exports.noop = noop; function isIPv4(ipStr) { return /(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/ .test(ipStr); } exports.isIPv4 = isIPv4; function isKnxAddress(knxStrAddr, isGroupAddress = true) { if (isGroupAddress) { // group address 1/1/1 return /^(3[01]|([0-2]?[0-9]))\/(([0-7]\/(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(([01]?\d{1,3})|(20[0-4][0-7])))$/ .test(knxStrAddr); } else { // individual address 1.1.15 return /^([01]?\d)\.([01]?\d)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])?$/.test(knxStrAddr); } } exports.isKnxAddress = isKnxAddress; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDJCQUF1QztBQUV2QyxnQkFBdUIsUUFBZ0I7SUFDckMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkcsQ0FBQztBQUhELHdCQUdDO0FBRUQsZ0JBQXVCLFFBQWdCO0lBQ3JDLElBQUksUUFBUSxHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLFFBQVEsR0FBRyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUM7SUFDN0MsQ0FBQztJQUNELE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQVBELHdCQU9DO0FBRUQsaUJBQXdCLFNBQWlCO0lBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDO1NBQzdCLFFBQVEs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RCxzQkFBNkIsVUFBa0IsRUFBRSxjQUFjLEdBQUcsSUFBSTtJQUNwRSxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQ25CLHNCQUFzQjtRQUN0QixNQUFNLENBQUMsNEdBQTRHO2FBQ2hILElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBQUMsSUFBSSxDQUFDLENBQUM7UUFDTiw0QkFBNEI7UUFDNUIsTUFBTSxDQUFDLGlFQUFpRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1RixDQUFDO0FBQ0gsQ0FBQztBQVRELG9DQVNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbmV0d29ya0ludGVyZmFjZXMgfSBmcm9tICdvcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpcDJudW0oaXBTdHJpbmc6IHN0cmluZykge1xuICBjb25zdCBpcE51bWJlciA9IGlwU3RyaW5nLnNwbGl0KCcuJyk7XG4gIHJldHVybiAoKCgoKCgraXBOdW1iZXJbMF0pICogMjU2KSArICgraXBOdW1iZXJbMV0pKSAqIDI1NikgKyAoK2lwTnVtYmVyWzJdKSkgKiAyNTYpICsgKCtpcE51bWJlclszXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBudW0yaXAoaXBOdW1iZXI6IG51bWJlcikge1xuICBsZXQgaXBTdHJpbmcgPSAoaXBOdW1iZXIgJSAyNTYpLnRvU3RyaW5nKCk7XG4gIGZvciAobGV0IGkgPSAzOyBpID4gMDsgaS0tKSB7XG4gICAgaXBOdW1iZXIgPSBNYXRoLmZsb29yKGlwTnVtYmVyIC8gMjU2KTtcbiAgICBpcFN0cmluZyA9IGlwTnVtYmVyICUgMjU2ICsgJy4nICsgaXBTdHJpbmc7XG4gIH1cbiAgcmV0dXJuIGlwU3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbnVtMm1hYyhtYWNOdW1iZXI6IG51bWJlcikge1xuICByZXR1cm4gU3RyaW5nKDFlMTIgKyAobWFjTnVtYmVyKVxuICAgIC50b1N0cmluZygxNikpLnNsaWNlKC0xMikubWF0Y2goLy57MSwyfS9nKS5qb2luKCc6Jyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWMybnVtKG1hY1N0cmluZzogc3RyaW5nKSB7XG4gIHJldHVybiBwYXJzZUludChtYWNTdHJpbmcuc3BsaXQoJzonKS5qb2luKCcnKSwgMTYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudElwKCkge1xuICBjb25zdCBpZmFjZXMgPSBuZXR3b3JrSW50ZXJmYWNlcygpO1xuICBmb3IgKGNvbnN0IGRldiBpbiBpZmFjZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRldGFpbHMgb2YgaWZhY2VzW2Rldl0pIHtcbiAgICAgIGlmIChkZXRhaWxzLmZhbWlseSA9PT0gJ0lQdjQnICYmIGRldGFpbHMuaW50ZXJuYWwgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBkZXRhaWxzLmFkZHJlc3M7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCBjdXJyZW50IGlwJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaXplT2YodmFsdWU6IG51bWJlcikge1xuICByZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nMih2YWx1ZSArIDEpIC8gNCkgfHwgMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGtueEFkZHIybnVtKGFkZHJTdHI6IHN0cmluZykge1xuICBjb25zdCBtID0gYWRkclN0ci5zcGxpdCgvW1xcLlxcL10vKTtcbiAgaWYgKG0gJiYgbS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuICgoKCttWzBdKSAmIDB4MDFmKSA8PCAxMSkgKyAoKCgrbVsxXSkgJiAweDA3KSA8PCA4KSArICgoK21bMl0pICYgMHhmZik7XG4gIH1cbiAgdGhyb3cgRXJyb3IoYENvdWxkIG5vdCBlbmNvZGUgJHthZGRyU3RyfSBhZGRyZXNzYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBudW0ya254QWRkcihhZGRyTnVtOiBudW1iZXIsIGlzR3JvdXBBZGRyID0gdHJ1ZSkge1xuICByZXR1cm4gW1xuICAgIChhZGRyTnVtID4+IDExKSAmIDB4ZixcbiAgICBpc0dyb3VwQWRkciA/IChhZGRyTnVtID4+IDgpICYgMHg3IDogKGFkZHJOdW0gPj4gOCkgJiAweGYsXG4gICAgKGFkZHJOdW0gJiAweGZmKV0uam9pbihpc0dyb3VwQWRkciA/ICcvJyA6ICcuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOb25QcmludGFibGUoc3RyOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXlxceDIwLVxceDdFXSsvZywgJycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9vcCguLi5fOiBhbnlbXSk6IGFueSB7IH1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSVB2NChpcFN0cjogc3RyaW5nKSB7XG4gIHJldHVybiAvKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPykvXG4gICAgLnRlc3QoaXBTdHIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNLbnhBZGRyZXNzKGtueFN0ckFkZHI6IHN0cmluZywgaXNHcm91cEFkZHJlc3MgPSB0cnVlKSB7XG4gIGlmIChpc0dyb3VwQWRkcmVzcykge1xuICAgIC8vIGdyb3VwIGFkZHJlc3MgMS8xLzFcbiAgICByZXR1cm4gL14oM1swMV18KFswLTJdP1swLTldKSlcXC8oKFswLTddXFwvKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPykpfCgoWzAxXT9cXGR7MSwzfSl8KDIwWzAtNF1bMC03XSkpKSQvXG4gICAgICAudGVzdChrbnhTdHJBZGRyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpbmRpdmlkdWFsIGFkZHJlc3MgMS4xLjE1XG4gICAgcmV0dXJuIC9eKFswMV0/XFxkKVxcLihbMDFdP1xcZClcXC4oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldP1swLTldKT8kLy50ZXN0KGtueFN0ckFkZHIpO1xuICB9XG59XG4iXX0=