knx-listener
Version:
A thin client that creates a tunnel to knx gateway to listen to telegrams within knx net
81 lines • 10 kB
JavaScript
;
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=