@iotile/iotile-device
Version:
A typescript library for interfacing with IOTile BLE devices
85 lines • 3.51 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const iotile_common_1 = require("@iotile/iotile-common");
const advertisements_1 = require("./advertisements");
class IOTileAdvertisementService {
constructor() {
}
processAdvertisement(connectionID, rssi, rawAdvert) {
let advert;
if (rawAdvert instanceof ArrayBuffer) {
advert = advertisements_1.Advertisement.FromAndroid(rawAdvert);
}
else {
advert = advertisements_1.Advertisement.FromIOS(rawAdvert);
}
if (advert.containsService(advertisements_1.IOTileV1ServiceUUID)) {
let manuData = advert.getManufacturerData(advertisements_1.ArchManufacturerCode);
if (manuData == null)
return null;
if (manuData.byteLength < 6)
return null;
return this.processValidAdvertisementV1(connectionID, rssi, advert);
}
else if (advert.containsService(advertisements_1.IOTileV2ServiceUUID)) {
let serviceData = advert.getServiceData();
if (serviceData == null)
return null;
if (serviceData.byteLength < 9)
return null;
return this.processValidAdvertisementV2(connectionID, rssi, advert);
}
else {
return null;
}
}
processValidAdvertisementV1(connectionID, rssi, advert) {
let manuData = advert.getManufacturerData(advertisements_1.ArchManufacturerCode);
if (manuData == null)
throw new iotile_common_1.ArgumentError("Missing manufactururer data in processValidAdvertisementV1");
if (manuData.byteLength < 6)
throw new iotile_common_1.ArgumentError(`Manufacturer data too short, length=${manuData.byteLength}`);
let [uuid, rawFlags] = iotile_common_1.unpackArrayBuffer("LH", manuData.slice(0, 6));
let slug = iotile_common_1.deviceIDToSlug(uuid);
let flags = parseFlags(rawFlags);
return {
batteryVoltage: 0,
deviceID: uuid,
slug: slug,
connectionID: connectionID,
rssi: rssi,
flags: flags
};
}
processValidAdvertisementV2(connectionID, rssi, advert) {
let serviceData = advert.getServiceData();
if (serviceData == null)
throw new iotile_common_1.ArgumentError("Missing service data in processValidAdvertisementV2");
if (serviceData.byteLength < 9)
throw new iotile_common_1.ArgumentError(`Service data too short, length=${serviceData.byteLength}`);
let [uuid, rawFlags] = iotile_common_1.unpackArrayBuffer("L4xB", serviceData.slice(0, 9));
let slug = iotile_common_1.deviceIDToSlug(uuid);
let flags = parseFlags(rawFlags);
flags.robustReports = true;
flags.fastWrites = true;
return {
batteryVoltage: 0,
deviceID: uuid,
slug: slug,
connectionID: connectionID,
rssi: rssi,
flags: flags
};
}
}
exports.IOTileAdvertisementService = IOTileAdvertisementService;
function parseFlags(flags) {
return {
hasData: ((flags & (1 << 0)) !== 0),
lowVoltage: ((flags & (1 << 1)) !== 0),
otherConnected: ((flags & (1 << 2)) !== 0),
robustReports: ((flags & (1 << 3)) !== 0),
fastWrites: ((flags & (1 << 4)) !== 0)
};
}
//# sourceMappingURL=iotile-advert-serv.js.map