UNPKG

@iotile/iotile-device

Version:

A typescript library for interfacing with IOTile BLE devices

150 lines 5.92 kB
"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