UNPKG

@iotize/tap

Version:

IoTize Device client for Javascript

90 lines 6.27 kB
import { Checksum } from '@iotize/tap/client/impl'; /** * Created by IoTize on 19/04/2018. * * Split data into chunks with a size of maxPacketSize + 1 * @param {Array} data * @param {number} maxPacketSize * @class */ export class BLEPacketSplitter { /** * * @param data * @param maxPacketSize */ constructor(data, maxPacketSize) { this.lastPacketSize = 0; this.maxPacketSize = 0; this.currentPacketIndex = 0; if (maxPacketSize < 1) { throw new Error('Packet size must be greater than 0'); } this.data = data; this.maxPacketSize = maxPacketSize; this.currentPacketIndex = this.getTotalNumberOfPacket() - 1; this.lastPacketSize = this.getLastPacketSize(); } /** * Create a BLEPacketSplitter instance from data and add the checksum at the end * @param {Array} data body data * @param {number} maxPacketSize packet size * @return {BLEPacketSplitter} the new instance */ static wrapWithChecksum(data, maxPacketSize) { var checkSum = BLEPacketSplitter.computeChecksum(data); var wrappedData = new Uint8Array(data.length + 1); wrappedData.set(data); wrappedData.set([checkSum & 0xff], data.length); return new BLEPacketSplitter(wrappedData, maxPacketSize); } getTotalNumberOfPacket() { return (((this.data.length / this.maxPacketSize) | 0) + (this.data.length % this.maxPacketSize === 0 ? 0 : 1)); } getLastPacketSize() { let result = this.data.length % this.maxPacketSize; if (result === 0) { result = this.maxPacketSize; } return result; } getPackets() { let packets = []; while (this.hasNextPacket()) { packets.push(this.getNextPacket()); } return packets; } getNextPacket() { let packetSize; let offset; if (this.currentPacketIndex > 0) { offset = this.lastPacketSize + (this.currentPacketIndex - 1) * this.maxPacketSize; packetSize = this.maxPacketSize; } else { offset = 0; packetSize = this.lastPacketSize; } let packet = new Uint8Array(packetSize + 1); packet[0] = offset | 0; for (let i = 0; i < packetSize; i++) { packet[i + 1] = this.data[offset + i]; } this.currentPacketIndex--; return packet; } hasNextPacket() { return this.currentPacketIndex >= 0; } static computeChecksum(data) { return Checksum.compute(data) & 0xff; } getTotalSize() { return this.data.length; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxlLXBhY2tldC1zcGxpdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb3RvY29sL2JsZS9jb21tb24vc3JjL2xpYi9ibGUtcGFja2V0LXNwbGl0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQVM1Qjs7OztPQUlHO0lBQ0gsWUFBbUIsSUFBZ0IsRUFBRSxhQUFxQjtRQUN4RCxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLElBQUksYUFBYSxHQUFHLENBQUMsRUFBRTtZQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDdkQ7UUFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLGdCQUFnQixDQUM1QixJQUFnQixFQUNoQixhQUFxQjtRQUVyQixJQUFJLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkQsSUFBSSxXQUFXLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsRCxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVNLHNCQUFzQjtRQUMzQixPQUFPLENBQ0wsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0MsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDdEQsQ0FBQztJQUNKLENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsSUFBSSxNQUFNLEdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUMzRCxJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDaEIsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7U0FDN0I7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU0sVUFBVTtRQUNmLElBQUksT0FBTyxHQUFpQixFQUFFLENBQUM7UUFDL0IsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztTQUNwQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxhQUFhO1FBQ2xCLElBQUksVUFBa0IsQ0FBQztRQUN2QixJQUFJLE1BQWMsQ0FBQztRQUNuQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLEVBQUU7WUFDL0IsTUFBTTtnQkFDSixJQUFJLENBQUMsY0FBYztvQkFDbkIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUNyRCxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztTQUNqQzthQUFNO1lBQ0wsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNYLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBWSxNQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDM0MsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN2QztRQUNELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFnQjtRQUNyQyxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDMUIsQ0FBQztDQVNGIn0=