@iotile/iotile-device
Version:
A typescript library for interfacing with IOTile BLE devices
150 lines • 5.92 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const constants_1 = require("./constants");
const utilities_1 = require("./utilities");
const iotile_common_1 = require("@iotile/iotile-common");
class Advertisement {
constructor(elements) {
this.elements = elements;
}
containsService(service) {
if (this.elements.serviceList == null)
return false;
return this.elements.serviceList.indexOf(service.toUpperCase()) > -1;
}
hasManufacturerData(manu) {
if (this.elements.manufacturerData == null)
return false;
return manu in this.elements.manufacturerData;
}
getManufacturerData(manu) {
if (this.elements.manufacturerData == null)
return null;
if (this.elements.manufacturerData[manu] == null)
return null;
return this.elements.manufacturerData[manu];
}
getServiceData() {
if (this.elements.serviceData == null)
return null;
return this.elements.serviceData;
}
static FromAndroid(data) {
let i = 0;
let advert = {};
let view = new DataView(data);
while (i < data.byteLength) {
let length = view.getUint8(i);
if ((i + length + 1) >= data.byteLength)
break;
if (length === 0) {
}
else if (length === 1) {
}
else {
let type = view.getUint8(i + 1);
let dataLength = length - 1;
let elementData = data.slice(i + 2, i + 2 + dataLength);
switch (type) {
case constants_1.AdElementTypeCode.CompleteLocalName:
case constants_1.AdElementTypeCode.ShortenedLocalName:
try {
advert.localName = utilities_1.parseUTF8String(elementData);
}
catch (err) {
}
break;
case constants_1.AdElementTypeCode.Incomplete128BitUUIDList:
if (elementData.byteLength === 16) {
let uuids = Advertisement.ParseUUID128List(elementData);
if (uuids != null)
advert.serviceList = uuids;
}
break;
case constants_1.AdElementTypeCode.ManufacturerSpecificData:
let manuData = Advertisement.ParseManufacturerData(elementData);
if (manuData != null) {
if (advert.manufacturerData != null) {
Advertisement.MergeManufacturerData(advert.manufacturerData, manuData);
}
else {
advert.manufacturerData = manuData;
}
}
break;
case constants_1.AdElementTypeCode.ServiceData:
let uuid = Advertisement.ParseServiceUUIDFromData(elementData);
if (uuid != null)
advert.serviceList = [uuid];
let serviceData = Advertisement.ParseServiceData(elementData);
if (serviceData != null) {
advert.serviceData = serviceData;
}
break;
}
}
i += (length + 1);
}
return new Advertisement(advert);
}
static FromIOS(data) {
let advert = {};
if (data.kCBAdvDataLocalName != null)
advert.localName = data.kCBAdvDataLocalName;
if (data.kCBAdvDataManufacturerData != null) {
let manuData = Advertisement.ParseManufacturerData(data.kCBAdvDataManufacturerData);
if (manuData != null) {
advert.manufacturerData = manuData;
}
}
if (data.kCBAdvDataServiceUUIDs != null)
advert.serviceList = data.kCBAdvDataServiceUUIDs;
return new Advertisement(advert);
}
static ParseManufacturerData(data) {
if (data.byteLength < 2)
return null;
let view = new DataView(data);
let manuID = view.getUint16(0, true);
let manuData = data.slice(2);
let result = {};
result[manuID] = manuData;
return result;
}
static ParseServiceData(data) {
if (data.byteLength < 2)
return null;
let serviceData = data.slice(2);
return serviceData;
}
static MergeManufacturerData(orig, update) {
for (let key in update) {
if (key in orig) {
let newSize = orig[key].byteLength + update[key].byteLength;
let newBuffer = new ArrayBuffer(newSize);
iotile_common_1.copyArrayBuffer(newBuffer, orig[key], 0, 0, orig[key].byteLength);
iotile_common_1.copyArrayBuffer(newBuffer, update[key], 0, orig[key].byteLength, update[key].byteLength);
}
}
}
static ParseUUID128List(data) {
if (data.byteLength % 16 !== 0)
return null;
let uuids = [];
for (let i = 0; i < data.byteLength; i += 16) {
let binUUID = data.slice(i, i + 16);
let uuid = utilities_1.parseBinaryUUID(binUUID, true);
uuids.push(uuid);
}
return uuids;
}
static ParseServiceUUIDFromData(data) {
if (data.byteLength < 2)
return null;
let binUUID = data.slice(0, 16);
let uuid = utilities_1.parseBinaryUUID(binUUID, true).slice(32);
return uuid;
}
}
exports.Advertisement = Advertisement;
//# sourceMappingURL=advertisement.js.map