UNPKG

@iotile/iotile-device

Version:

A typescript library for interfacing with IOTile BLE devices

159 lines 5.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const errors_1 = require("./errors"); let RSSI = -50; let VOLTAGE = 3.8; class MockBLEDevice { constructor(device, connected) { this.rssi = RSSI; this.device = device; this.subscriptions = {}; this.rpcs = {}; this.connected = connected; this.advertising = this.buildAdvertising(device.iotileID, VOLTAGE); this.id = device.iotileID; this.payload = new ArrayBuffer(0); } buildAdvertising(uuid, voltage) { var adv = new Uint8Array(62); adv[0] = 0x02; adv[1] = 0x01; adv[2] = 0x06; adv[3] = 0x11; adv[4] = 0x06; adv[5] = 0x63; adv[6] = 0x0F; adv[7] = 0xF6; adv[8] = 0x0F; adv[9] = 0x2C; adv[10] = 0x13; adv[11] = 0x11; adv[12] = 0xE6; adv[13] = 0xBA; adv[14] = 0x53; adv[15] = 0xF7; adv[16] = 0x3F; adv[17] = 0x00; adv[18] = 0x20; adv[19] = 0x00; adv[20] = 0x00; adv[21] = 0x09; adv[22] = 0xFF; adv[23] = 0xC0; adv[24] = 0x03; adv[25] = (uuid >> 0) & 0xFF; adv[26] = (uuid >> 8) & 0xFF; adv[27] = (uuid >> 16) & 0xFF; adv[28] = (uuid >> 24) & 0xFF; adv[29] = 0; adv[30] = 0; if (this.connected) { adv[29] |= (1 << 2); } adv[31] = 0x1E; adv[32] = 0xFF; adv[33] = 0xC0; adv[34] = 0x03; adv[35] = Math.floor((voltage - Math.floor(voltage)) * 256); adv[36] = Math.floor(voltage); return adv.buffer; } unsubscribe(serviceID, charID, success, failure) { if (!(serviceID in this.subscriptions)) { failure("Unknown service ID: " + serviceID); } if (!(charID in this.subscriptions[serviceID])) { failure("Unknown characteristic ID: " + charID); } if (charID === '2005') { if (this.device.controller) { this.device.controller.disableStreaming(); } } delete this.subscriptions[serviceID][charID]; success(); } subscribe(serviceID, charID, success, failure) { if (!(serviceID in this.subscriptions)) { this.subscriptions[serviceID] = {}; } if (!(charID in this.subscriptions[serviceID])) { this.subscriptions[serviceID][charID] = []; } this.subscriptions[serviceID][charID].push({ 'success': success, 'failure': failure }); if (charID === '2005') { if (this.device.controller) { this.device.controller.enableStreaming(success); } } } disconnect(success) { if (this.device.controller) { this.device.controller.disableStreaming(); } this.subscriptions = {}; setTimeout(success, 0); } notify(packet, charID) { if ('00002000-3FF7-53BA-E611-132C0FF60F63' in this.subscriptions) { var serv = this.subscriptions['00002000-3FF7-53BA-E611-132C0FF60F63']; if (charID in serv) { setTimeout(function () { for (var i = 0; i < serv[charID].length; ++i) { serv[charID][i].success(packet); } }, 0); } } } write(serviceID, charID, value, success, failure) { if ((serviceID !== '00002000-3FF7-53BA-E611-132C0FF60F63')) { failure('Unknown service in ble write' + serviceID); return; } success(); if (charID === '2004') { this.payload = value; } else if (charID === '2003') { this.rpc(value, this.payload); } } async rpc(headerData, payloadData) { var header = new DataView(headerData); var parsedHeader = { address: header.getUint8(4), length: header.getUint8(0), sender: header.getUint8(1), command: header.getUint16(2, true) }; var payload = payloadData.slice(0, parsedHeader.length); var status = 0xFF; let respPayload = new ArrayBuffer(0); try { respPayload = await this.device.rpc(parsedHeader.address, parsedHeader.command, payloadData); status = (1 << 6); if (respPayload.byteLength > 0) { status |= (1 << 7); } } catch (err) { if (err instanceof errors_1.RPCNotFound) { status = 1; } else { throw err; } } var respHeaderData = new ArrayBuffer(4); var respHeader = new DataView(respHeaderData); respHeader.setUint8(0, status); respHeader.setUint8(3, respPayload.byteLength); this.notify(respHeaderData, '2001'); if (respPayload.byteLength > 0) { this.notify(respPayload, '2002'); } } } exports.MockBLEDevice = MockBLEDevice; //# sourceMappingURL=mock-ble-device.js.map