barnowl-csl
Version:
Collect ambient RAIN RFID data from CSL readers. We believe in an open Internet of Things.
113 lines (92 loc) • 3.16 kB
JavaScript
/**
* Copyright reelyActive 2023
* We believe in an open Internet of Things
*/
const Raddec = require('raddec');
/**
* CslDecoder Class
* Decodes data streams from one or more CSL readers and forwards the
* packets to the given BarnowlCsl instance.
*/
class CslDecoder {
/**
* CslDecoder constructor
* @param {Object} options The options as a JSON object.
* @constructor
*/
constructor(options) {
options = options || {};
this.barnowl = options.barnowl;
}
/**
* Handle data from a given device, specified by the origin
* @param {Buffer} data The data as a buffer.
* @param {String} origin The unique origin identifier of the device.
* @param {Number} time The time of the data capture.
* @param {Object} decodingOptions The packet decoding options.
*/
handleData(data, origin, time, decodingOptions) {
let self = this;
let raddecs = processTagData(data, origin, time, decodingOptions);
raddecs.forEach(raddec => {
self.barnowl.handleRaddec(raddec)
});
}
}
/**
* Process Tag data
* @param {Object} data The data in the default CSL format.
* @param {String} origin The unique origin identifier of the device.
* @param {Number} time The time of the data capture.
* @param {Object} decodingOptions The packet decoding options.
*/
function processTagData(data, origin, time, decodingOptions) {
let raddecs = [];
let receiverId = '';
let receiverIdType = Raddec.identifiers.TYPE_UNKNOWN;
if(data.hasOwnProperty('pcEthernetMACAddress') &&
data.pcEthernetMACAddress !== "") {
receiverId = data.pcEthernetMACAddress.toLowerCase();
receiverIdType = Raddec.identifiers.TYPE_EUI48;
}
else if(data.hasOwnProperty('pcWiFiMACAddress') &&
data.pcWiFiMACAddress !== "") {
receiverId = data.pcWiFiMACAddress.toLowerCase();
receiverIdType = Raddec.identifiers.TYPE_EUI48;
}
let timeOffset = 0;
if(data.timeZone) {
let timeZoneElements = data.timeZone.split(':');
let hoursOffset = Number.parseInt(timeZoneElements[0]);
let minutesOffset = Number.parseInt(timeZoneElements[1]);
if(hoursOffset < 0) {
minutesOffset = -minutesOffset;
}
timeOffset -= ((hoursOffset * 60) + minutesOffset) * 60000;
};
if(Array.isArray(data.tags)) {
data.tags.forEach(tag => {
let isValidTag = (tag.hasOwnProperty('epc') &&
tag.hasOwnProperty('antennaPort') &&
tag.hasOwnProperty('rssi') &&
tag.hasOwnProperty('timeOfRead'));
if(isValidTag) {
let timestamp = Date.parse(tag.timeOfRead + ' GMT') + timeOffset;
let raddec = new Raddec({
transmitterId: tag.epc.toLowerCase(),
transmitterIdType: Raddec.identifiers.TYPE_EPC96,
timestamp: timestamp
});
raddec.addDecoding({
receiverId: receiverId,
receiverIdType: receiverIdType,
receiverAntenna: Number.parseInt(tag.antennaPort),
rssi: Number.parseInt(tag.rssi)
});
raddecs.push(raddec);
}
});
}
return raddecs;
}
module.exports = CslDecoder;