/** * * User: Martin Donnelly * Date: 2016-05-24 * Time: 14:21 * */ /* global */ /* jshint browser: true , devel: true*/ /** * * @constructor */ var MANUFACTUREDECODER = function() { 'use strict'; this.getManID = function(data) { return ('0000' + ((data[1] << 8) | data[0]).toString(16)).slice(-4).toUpperCase(); }; this.decodeIbeacon = function(data) { // https://support.kontakt.io/hc/en-gb/articles/201492492-iBeacon-advertising-packet-structure var bin = data; var obj = { msg: '(iBeacon)'}; // Obj.manID = ('0000' + ((bin[1] << 8) | bin[0]).toString(16)).slice(-4); obj.manID = this.getManID(bin); var uuid = []; if (bin[2] === 2) { uuid.push(bin[4].toString(16) + bin[5].toString(16) + bin[6].toString(16) + bin[7].toString(16)) ; uuid.push(bin[8].toString(16) + bin[9].toString(16)) ; uuid.push(bin[10].toString(16) + bin[11].toString(16)) ; uuid.push(bin[12].toString(16) + bin[13].toString(16)) ; var p4 = bin[14].toString(16); p4 = p4 + bin[15].toString(16); p4 = p4 + bin[16].toString(16); p4 = p4 + bin[17].toString(16); p4 = p4 + bin[18].toString(16); p4 = p4 + bin[19].toString(16); uuid.push(p4); obj.uuid = uuid.join('-'); } if (bin[2] === 9) { // This looks like an ip address? var ipaddy = []; ipaddy.push(bin[6]); ipaddy.push(bin[7]); ipaddy.push(bin[8]); ipaddy.push(bin[9]); obj.ipaddress = ipaddy.join('.'); obj.msg = obj.msg + ' IP:' + obj.ipaddress; } if (bin[2] === 12) { var output = bin.map(function(i) { return ('0000' + i.toString(16)).slice(-2) + ''; }); obj.secureUUID = output.join(''); } var signedByte = new Int8Array(1); signedByte[0] = bin[24]; obj.txpower = signedByte[0]; return obj; }; this.decodeSiliconLabsSensorPuck = function(data) { var bin = data; var obj = {data: {}}; obj.manID = this.getManID(bin); obj.a = (bin[3] << 8) | bin[2]; obj.b = (bin[5] << 8) | bin[4]; obj.data.humidity = (bin[7] << 8) | bin[6]; obj.data.temp = (bin[9] << 8) | bin[8]; obj.c = (bin[11] << 8) | bin[10]; obj.d = (bin[13] << 8) | bin[12]; obj.msg = 'Humidity: ' + (obj.data.humidity / 10) + ', temp: ' + (obj.data.temp / 10); return obj; }; this.decodeSansible = function(data) { var bin = data; var obj = {data: {}}; obj.manID = this.getManID(bin); obj.data.p1 = ((bin[2] << 16) | bin[3] << 8 | bin[4]); obj.data.p2 = ((bin[5] << 16) | bin[6] << 8 | bin[7]); obj.msg = 'Left: ' + (obj.data.p1 / 100) + ' hPa, Right: ' + (obj.data.p2 / 100) + ' hPa'; return obj; }; };