From d2feb7da934cc0f80e253e7e87442a005892db09 Mon Sep 17 00:00:00 2001 From: "luisfelrib@gmail.com" Date: Wed, 7 Dec 2016 13:40:38 -0200 Subject: [PATCH 1/3] allow multiple manufacturer specific data --- lib/ble/common/manufacturers/apple/ibeacon.js | 6 +++--- lib/ble/common/manufacturers/apple/index.js | 6 +++--- lib/ble/common/manufacturers/estimote/index.js | 6 +++--- lib/ble/common/manufacturers/estimote/nearable.js | 8 ++++---- lib/ble/common/manufacturers/sticknfind/index.js | 10 +++++----- .../common/manufacturers/sticknfind/snfsingle.js | 8 ++++---- .../common/manufacturers/sticknfind/snsmotion.js | 8 ++++---- lib/ble/data/gap/manufacturerspecificdata.js | 13 ++++++++----- 8 files changed, 34 insertions(+), 31 deletions(-) diff --git a/lib/ble/common/manufacturers/apple/ibeacon.js b/lib/ble/common/manufacturers/apple/ibeacon.js index 8da5cb4..af1538c 100644 --- a/lib/ble/common/manufacturers/apple/ibeacon.js +++ b/lib/ble/common/manufacturers/apple/ibeacon.js @@ -31,9 +31,9 @@ var licenseeNames = { * Parse Apple iBeacon manufacturer specific data. * @param {Object} advertiserData The object containing all parsed data. */ -function process(advertiserData) { +function process(manufacturerSpecificData) { var iBeacon = {}; - var data = advertiserData.manufacturerSpecificData.data; + var data = manufacturerSpecificData.data; iBeacon.uuid = data.substr(4,32); iBeacon.major = data.substr(36,4); @@ -46,7 +46,7 @@ function process(advertiserData) { } iBeacon.licenseeName = licenseeName; - advertiserData.manufacturerSpecificData.iBeacon = iBeacon; + manufacturerSpecificData.iBeacon = iBeacon; } diff --git a/lib/ble/common/manufacturers/apple/index.js b/lib/ble/common/manufacturers/apple/index.js index b115437..1b9ca8a 100644 --- a/lib/ble/common/manufacturers/apple/index.js +++ b/lib/ble/common/manufacturers/apple/index.js @@ -10,13 +10,13 @@ var ibeacon = require('./ibeacon.js'); * Parse BLE advertiser manufacturer specific data for Apple. * @param {Object} advertiserData The object containing all parsed data. */ -function process(advertiserData) { - var data = advertiserData.manufacturerSpecificData.data; +function process(manufacturerSpecificData) { + var data = manufacturerSpecificData.data; var appleType = data.substr(0,2); switch(appleType) { case '02': - ibeacon.process(advertiserData); + ibeacon.process(manufacturerSpecificData); break; case '09': // TODO: processAppleTV and/or whatever else uses this diff --git a/lib/ble/common/manufacturers/estimote/index.js b/lib/ble/common/manufacturers/estimote/index.js index 03d3ea3..ee5fd6c 100644 --- a/lib/ble/common/manufacturers/estimote/index.js +++ b/lib/ble/common/manufacturers/estimote/index.js @@ -10,14 +10,14 @@ var nearable = require('./nearable.js'); * Parse BLE advertiser manufacturer specific data for Estimote. * @param {Object} advertiserData The object containing all parsed data. */ -function process(advertiserData) { - var data = advertiserData.manufacturerSpecificData.data; +function process(manufacturerSpecificData) { + var data = manufacturerSpecificData.data; var packetType = data.substr(0,2); switch(packetType) { // Update when we have manufacturer documentation case '01': default: - nearable.process(advertiserData); + nearable.process(manufacturerSpecificData); } } diff --git a/lib/ble/common/manufacturers/estimote/nearable.js b/lib/ble/common/manufacturers/estimote/nearable.js index 9e86974..7af6675 100644 --- a/lib/ble/common/manufacturers/estimote/nearable.js +++ b/lib/ble/common/manufacturers/estimote/nearable.js @@ -6,11 +6,11 @@ /** * Parse Estimote Nearable manufacturer specific data. - * @param {Object} advertiserData The object containing all parsed data. + * @param {Object} manufacturerSpecificData The object containing all parsed data. */ -function process(advertiserData) { +function process(manufacturerSpecificData) { var nearable = {}; - var data = advertiserData.manufacturerSpecificData.data; + var data = manufacturerSpecificData.data; nearable.id = data.substr(2,16); nearable.temperature = toTemperature(data.substr(24,2), data.substr(22,2)); @@ -29,7 +29,7 @@ function process(advertiserData) { data.substr(20,2), data.substr(24,2), data.substr(26,2), data.substr(38,2) ]; - advertiserData.manufacturerSpecificData.nearable = nearable; + manufacturerSpecificData.nearable = nearable; } diff --git a/lib/ble/common/manufacturers/sticknfind/index.js b/lib/ble/common/manufacturers/sticknfind/index.js index d83e79a..3fde874 100644 --- a/lib/ble/common/manufacturers/sticknfind/index.js +++ b/lib/ble/common/manufacturers/sticknfind/index.js @@ -9,18 +9,18 @@ var snsmotion = require('./snsmotion.js'); /** * Parse BLE advertiser manufacturer specific data for StickNFind. - * @param {Object} advertiserData The object containing all parsed data. + * @param {Object} manufacturerSpecificData The object containing all parsed data. */ -function process(advertiserData) { - var data = advertiserData.manufacturerSpecificData.data; +function process(manufacturerSpecificData) { + var data = manufacturerSpecificData.data; var packetType = data.substr(0,2); switch(packetType) { case '01': - snfsingle.process(advertiserData); + snfsingle.process(manufacturerSpecificData); break; case '42': - snsmotion.process(advertiserData); + snsmotion.process(manufacturerSpecificData); break; default: } diff --git a/lib/ble/common/manufacturers/sticknfind/snfsingle.js b/lib/ble/common/manufacturers/sticknfind/snfsingle.js index 7c1ae78..610c5fe 100644 --- a/lib/ble/common/manufacturers/sticknfind/snfsingle.js +++ b/lib/ble/common/manufacturers/sticknfind/snfsingle.js @@ -9,11 +9,11 @@ var pdu = require('../../util/pdu.js'); /** * Parse StickNFind 'single payload' manufacturer specific data. - * @param {Object} advertiserData The object containing all parsed data. + * @param {Object} manufacturerSpecificData The object containing all parsed data. */ -function process(advertiserData) { +function process(manufacturerSpecificData) { var snfBeacon = {}; - var data = advertiserData.manufacturerSpecificData.data; + var data = manufacturerSpecificData.data; snfBeacon.type = 'V2 Single Payload'; snfBeacon.id = pdu.reverseBytes(data.substr(2,16)); @@ -28,7 +28,7 @@ function process(advertiserData) { snfBeacon.calibration = data.substr(32,2); snfBeacon.checksum = data.substr(34,6); - advertiserData.manufacturerSpecificData.snfBeacon = snfBeacon; + manufacturerSpecificData.snfBeacon = snfBeacon; } diff --git a/lib/ble/common/manufacturers/sticknfind/snsmotion.js b/lib/ble/common/manufacturers/sticknfind/snsmotion.js index 90314a4..2cabfd8 100644 --- a/lib/ble/common/manufacturers/sticknfind/snsmotion.js +++ b/lib/ble/common/manufacturers/sticknfind/snsmotion.js @@ -9,11 +9,11 @@ var pdu = require('../../util/pdu.js'); /** * Parse StickNSense 'motion' manufacturer specific data. - * @param {Object} advertiserData The object containing all parsed data. + * @param {Object} manufacturerSpecificData The object containing all parsed data. */ -function process(advertiserData) { +function process(manufacturerSpecificData) { var snfBeacon = {}; - var data = advertiserData.manufacturerSpecificData.data; + var data = manufacturerSpecificData.data; snfBeacon.type = 'SnS Motion'; snfBeacon.timestamp = parseInt(pdu.reverseBytes(data.substr(2,8)),16); @@ -42,7 +42,7 @@ function process(advertiserData) { snfBeacon.accelerationZ = parseInt((data.substr(36,2) + data.substr(40,1)), 16); - advertiserData.manufacturerSpecificData.snfBeacon = snfBeacon; + manufacturerSpecificData.snfBeacon = snfBeacon; } diff --git a/lib/ble/data/gap/manufacturerspecificdata.js b/lib/ble/data/gap/manufacturerspecificdata.js index 51764b9..83866e2 100644 --- a/lib/ble/data/gap/manufacturerspecificdata.js +++ b/lib/ble/data/gap/manufacturerspecificdata.js @@ -28,22 +28,25 @@ function process(payload, cursor, advertiserData) { var data = payload.substr(cursor+8, pdu.getTagDataLength(payload, cursor)-4); - advertiserData.manufacturerSpecificData = { + if (!advertiserData.manufacturerSpecificData) + advertiserData.manufacturerSpecificData = []; + + advertiserData.manufacturerSpecificData.push({ companyName : companyName, companyIdentifierCode: companyIdentifierCode, - data: data }; + data: data }); // Interpret the manufacturer specific data, if possible // Kindly respect ascending order of company identifier codes switch(companyIdentifierCode) { case '004c': - apple.process(advertiserData); + apple.process(advertiserData.manufacturerSpecificData[advertiserData.manufacturerSpecificData.length-1]); break; case '00f9': - sticknfind.process(advertiserData); + sticknfind.process(advertiserData.manufacturerSpecificData[advertiserData.manufacturerSpecificData.length-1]); break; case '015d': - estimote.process(advertiserData); + estimote.process(advertiserData.manufacturerSpecificData[advertiserData.manufacturerSpecificData.length-1]); break; default: } From 9976dfbdc22ef34871140d6cc26ec208aaa365f6 Mon Sep 17 00:00:00 2001 From: "luisfelrib@gmail.com" Date: Thu, 8 Dec 2016 15:41:26 -0200 Subject: [PATCH 2/3] add support for altbeacon --- .../common/manufacturers/altbeacon/index.js | 25 ++++++++++ lib/ble/common/manufacturers/index.js | 2 + lib/ble/data/gap/manufacturerspecificdata.js | 49 ++++++++++++++----- 3 files changed, 65 insertions(+), 11 deletions(-) create mode 100644 lib/ble/common/manufacturers/altbeacon/index.js diff --git a/lib/ble/common/manufacturers/altbeacon/index.js b/lib/ble/common/manufacturers/altbeacon/index.js new file mode 100644 index 0000000..bb901fc --- /dev/null +++ b/lib/ble/common/manufacturers/altbeacon/index.js @@ -0,0 +1,25 @@ +/** + * Copyright reelyActive 2015-2016 + * We believe in an open Internet of Things + */ + +//var ibeacon = require('./ibeacon.js'); + + +/** + * Parse BLE advertiser manufacturer specific data for Apple. + * @param {Object} advertiserData The object containing all parsed data. + */ +function process(manufacturerSpecificData) { + +var data = manufacturerSpecificData.data; + + var beaconId = data.substr(4,40); + var rssi = data.substr(44, 2); + var reserved = data.substr(46, 2); + + manufacturerSpecificData.altbeacon = {beaconId: beaconId, refRSSI: rssi, reserved: reserved}; +} + + +module.exports.process = process; diff --git a/lib/ble/common/manufacturers/index.js b/lib/ble/common/manufacturers/index.js index a56fd86..8f16b00 100644 --- a/lib/ble/common/manufacturers/index.js +++ b/lib/ble/common/manufacturers/index.js @@ -4,9 +4,11 @@ */ var apple = require('./apple/index.js'); +var altbeacon = require('./altbeacon/index.js'); var sticknfind = require('./sticknfind/index.js'); var estimote = require('./estimote/index.js'); module.exports.apple = apple; +module.exports.altbeacon = altbeacon; module.exports.sticknfind = sticknfind; module.exports.estimote = estimote; diff --git a/lib/ble/data/gap/manufacturerspecificdata.js b/lib/ble/data/gap/manufacturerspecificdata.js index 83866e2..a7a3cca 100644 --- a/lib/ble/data/gap/manufacturerspecificdata.js +++ b/lib/ble/data/gap/manufacturerspecificdata.js @@ -7,6 +7,7 @@ var pdu = require('../../common/util/pdu.js'); var companyIdentifierCodes = require('../../common/assignednumbers/companyidentifiercodes.js'); var apple = require('../../common/manufacturers/apple/index.js'); +var altbeacon = require('../../common/manufacturers/altbeacon/index.js'); var sticknfind = require('../../common/manufacturers/sticknfind/index.js'); var estimote = require('../../common/manufacturers/estimote/index.js'); @@ -21,6 +22,24 @@ function process(payload, cursor, advertiserData) { var companyIdentifierCode = payload.substr(cursor+6, 2); companyIdentifierCode += payload.substr(cursor+4, 2); + var altBeacon = false; + + var adLength = payload.substr(cursor, 2); + + console.log("adLength: ", adLength); + + if (adLength == "1b") + { + var beaconCode = payload.substr(cursor+8, 4); + + console.log("beaconCode: ", beaconCode); + + if (beaconCode == "beac") + { + altBeacon = true; + } + } + var companyName = companyIdentifierCodes.companyNames[companyIdentifierCode]; if(typeof companyName === 'undefined') { companyName = 'Unknown'; @@ -38,17 +57,25 @@ function process(payload, cursor, advertiserData) { // Interpret the manufacturer specific data, if possible // Kindly respect ascending order of company identifier codes - switch(companyIdentifierCode) { - case '004c': - apple.process(advertiserData.manufacturerSpecificData[advertiserData.manufacturerSpecificData.length-1]); - break; - case '00f9': - sticknfind.process(advertiserData.manufacturerSpecificData[advertiserData.manufacturerSpecificData.length-1]); - break; - case '015d': - estimote.process(advertiserData.manufacturerSpecificData[advertiserData.manufacturerSpecificData.length-1]); - break; - default: + + if (altBeacon) + { + altbeacon.process(advertiserData.manufacturerSpecificData[advertiserData.manufacturerSpecificData.length-1]); + } + else + { + switch(companyIdentifierCode) { + case '004c': + apple.process(advertiserData.manufacturerSpecificData[advertiserData.manufacturerSpecificData.length-1]); + break; + case '00f9': + sticknfind.process(advertiserData.manufacturerSpecificData[advertiserData.manufacturerSpecificData.length-1]); + break; + case '015d': + estimote.process(advertiserData.manufacturerSpecificData[advertiserData.manufacturerSpecificData.length-1]); + break; + default: + } } } From c188dd5184080601ac46cba6e4786d4e0e4f1171 Mon Sep 17 00:00:00 2001 From: "luisfelrib@gmail.com" Date: Thu, 8 Dec 2016 16:29:21 -0200 Subject: [PATCH 3/3] add support for altbeacon --- lib/ble/data/gap/manufacturerspecificdata.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/ble/data/gap/manufacturerspecificdata.js b/lib/ble/data/gap/manufacturerspecificdata.js index a7a3cca..1a2ee41 100644 --- a/lib/ble/data/gap/manufacturerspecificdata.js +++ b/lib/ble/data/gap/manufacturerspecificdata.js @@ -26,14 +26,10 @@ function process(payload, cursor, advertiserData) { var adLength = payload.substr(cursor, 2); - console.log("adLength: ", adLength); - if (adLength == "1b") { var beaconCode = payload.substr(cursor+8, 4); - console.log("beaconCode: ", beaconCode); - if (beaconCode == "beac") { altBeacon = true;