113 lines
2.7 KiB
JavaScript
113 lines
2.7 KiB
JavaScript
/**
|
|
*
|
|
* 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;
|
|
|
|
};
|
|
|
|
|
|
};
|