UNPKG

@iotize/tap

Version:

IoTize Device client for Javascript

179 lines 13.1 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import { bufferToHexString } from '@iotize/common/byte-converter'; import { promiseSerial } from '@iotize/common/promise'; import { QueueComProtocol } from '@iotize/tap/protocol/core'; import { BleConfig } from './ble-config'; import { BLEPacketBuilder } from './ble-packet-builder'; import { BLEPacketSplitter } from './ble-packet-splitter'; import { debug } from './debug'; import { InvalidBleFrameChecksum } from './errors'; /** * @deprecated use UniversalBleProtocolAdpater * Abstract class for BLE communication * * With ble communication, data is split into sub packets. * This class handles creation of packet chunks. * * - You must only implement the function to send one packet chunk writeLwm2mPacketChunk() * - */ export class AbstractBleProtocol extends QueueComProtocol { constructor(bleOptions = { mtu: BleConfig.maxPacketLengthWithoutOffset + 1, }) { super(); this.bleOptions = bleOptions; } onNewLwm2mMessage(data) { if (this._readResolve) { debug('onNewLwm2mMessage()', bufferToHexString(data)); this._readResolve(data); } else { console.warn(`No listener for new message... 0x${bufferToHexString(data)}`); this._pendingRead = data; } } onNewLwm2mMessageError(err) { console.error('Error lwm2m response...', err); } onLwm2mDataChunkError(error) { if (this._readReject) { this._readReject(error); } else { console.warn('No listener for read message error...', error); } } getLwm2mResponsePromise() { debug('getLwm2mResponsePromise'); if (this._pendingRead) { let data = this._pendingRead; this._pendingRead = undefined; return Promise.resolve(data); } if (!this._readPromise) { this.createLwm2mResponsePromise(); } return this._readPromise; } createLwm2mResponsePromise() { debug('createLwm2mResponsePromise'); this._readPromise = new Promise((resolve, reject) => { this._readResolve = resolve; this._readReject = reject; }); return this._readPromise; } // send(data: Uint8Array): Observable<Uint8Array> { // debug("BLEProtocol:send() " + bufferToHexString(data)); // return from( // this // .write(data) // .then(() => this.waitForLwm2mResponse()) // .catch((err) => { // console.error("ERROR SEND " + err); // throw err; // }) // ); // } read() { debug('read()...'); if (this.packetBuilder) { if (this.packetBuilder.hasAllChunks()) { let data = this.packetBuilder.getData(); this.packetBuilder = undefined; return Promise.resolve(data); } // TODO manage error console.warn('AbstractBleProtocol::read() There is already a read operation in progress but a new call to ::read has been made.'); } return this.getLwm2mResponsePromise() .then((response) => { this.packetBuilder = undefined; return response; }) .catch((err) => { this.packetBuilder = undefined; throw err; }); } write(data) { return __awaiter(this, void 0, void 0, function* () { if (this.packetSplitter != null) { console.warn('BLEProtocol', 'write', 'There are already data being sent but a new call to ::write has been made'); } this.packetSplitter = BLEPacketSplitter.wrapWithChecksum(data, this.bleOptions.mtu - 1); let packets = this.packetSplitter.getPackets(); let promise; this._pendingRead = undefined; this.packetBuilder = new BLEPacketBuilder(AbstractBleProtocol.RECEIVED_BUFFER_LENGTH); if (packets.length > 0) { // this.createLwm2mResponsePromise() // .catch((err) => { // this.onNewLwm2mMessageError(err); // }) promise = promiseSerial(packets, (packet, index) => { return this.writeLwm2mPacketChunk(packet).then((value) => { debug(`Done sending packet ${index + 1}/${packets.length}`); return value; }); }); // packets.forEach((value: Uint8Array, index: number) => { // if (!promise){ // promise = this.writeLwm2mPacketChunk(packets[index]); // } // else{ // promise = promise.then(() => this.writeLwm2mPacketChunk(packets[index])) // } // // promise.then(() => { // // debug("BLEProtocol", "write", `Done sending packet ${index+1}/${packets.length}`); // // }); // }); } else { console.warn('BLEProtocol', 'write', `Nothing to write...`); promise = Promise.resolve(); } return promise .then(() => { this.packetSplitter = undefined; }) .catch((err) => { this.packetSplitter = undefined; throw err; }); }); } /** * * @param data data chunk */ onNewLwm2mPacket(data) { if (!this.packetBuilder) { debug(`Ignoring lwm2m packet 0x${bufferToHexString(data)} as not request has been made yet`); return; } this.packetBuilder.append(data); if (this.packetBuilder.hasAllChunks()) { if (this.packetBuilder.isChecksumValid()) { this.onNewLwm2mMessage(this.packetBuilder.getData()); } else { let error = InvalidBleFrameChecksum.create(this.packetBuilder); this.onLwm2mDataChunkError(error); } } } } // TODO set an option instead ? AbstractBleProtocol.RECEIVED_BUFFER_LENGTH = 255; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtYmxlLXByb3RvY29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvdG9jb2wvYmxlL2NvbW1vbi9zcmMvbGliL2Fic3RyYWN0LWJsZS1wcm90b2NvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBZSx1QkFBdUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVoRTs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQWdCLG1CQUFvQixTQUFRLGdCQUFnQjtJQXdCaEUsWUFDUyxhQUE4QjtRQUNuQyxHQUFHLEVBQUUsU0FBUyxDQUFDLDRCQUE0QixHQUFHLENBQUM7S0FDaEQ7UUFFRCxLQUFLLEVBQUUsQ0FBQztRQUpELGVBQVUsR0FBVixVQUFVLENBRWhCO0lBR0gsQ0FBQztJQUVELGlCQUFpQixDQUFDLElBQWdCO1FBQ2hDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixLQUFLLENBQUMscUJBQXFCLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pCO2FBQU07WUFDTCxPQUFPLENBQUMsSUFBSSxDQUNWLG9DQUFvQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUM5RCxDQUFDO1lBQ0YsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRUQsc0JBQXNCLENBQUMsR0FBVTtRQUMvQixPQUFPLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFrQjtRQUN0QyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN6QjthQUFNO1lBQ0wsT0FBTyxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM5RDtJQUNILENBQUM7SUFFRCx1QkFBdUI7UUFDckIsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7WUFDOUIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7U0FDbkM7UUFDRCxPQUFPLElBQUksQ0FBQyxZQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELDBCQUEwQjtRQUN4QixLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksT0FBTyxDQUFhLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzlELElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDO1lBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxtREFBbUQ7SUFDbkQsOERBQThEO0lBQzlELG1CQUFtQjtJQUNuQixlQUFlO0lBQ2YsMkJBQTJCO0lBQzNCLHVEQUF1RDtJQUN2RCxnQ0FBZ0M7SUFDaEMsc0RBQXNEO0lBQ3RELDZCQUE2QjtJQUM3QixpQkFBaUI7SUFDakIsU0FBUztJQUNULElBQUk7SUFFSixJQUFJO1FBQ0YsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25CLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO2dCQUMvQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDOUI7WUFDRCxvQkFBb0I7WUFDcEIsT0FBTyxDQUFDLElBQUksQ0FDVixtSEFBbUgsQ0FDcEgsQ0FBQztTQUNIO1FBQ0QsT0FBTyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7YUFDbEMsSUFBSSxDQUFDLENBQUMsUUFBb0IsRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1lBQy9CLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2IsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7WUFDL0IsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFSyxLQUFLLENBQUMsSUFBZ0I7O1lBQzFCLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLEVBQUU7Z0JBQy9CLE9BQU8sQ0FBQyxJQUFJLENBQ1YsYUFBYSxFQUNiLE9BQU8sRUFDUCwyRUFBMkUsQ0FDNUUsQ0FBQzthQUNIO1lBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FDdEQsSUFBSSxFQUNKLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FDeEIsQ0FBQztZQUNGLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFL0MsSUFBSSxPQUFxQixDQUFDO1lBRTFCLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO1lBQzlCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxnQkFBZ0IsQ0FDdkMsbUJBQW1CLENBQUMsc0JBQXNCLENBQzNDLENBQUM7WUFDRixJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN0QixvQ0FBb0M7Z0JBQ3BDLHdCQUF3QjtnQkFDeEIsNENBQTRDO2dCQUM1QyxTQUFTO2dCQUNULE9BQU8sR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBa0IsRUFBRSxLQUFhLEVBQUUsRUFBRTtvQkFDckUsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7d0JBQ3ZELEtBQUssQ0FBQyx1QkFBdUIsS0FBSyxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQzt3QkFDNUQsT0FBTyxLQUFLLENBQUM7b0JBQ2YsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsMERBQTBEO2dCQUMxRCxxQkFBcUI7Z0JBQ3JCLGdFQUFnRTtnQkFDaEUsUUFBUTtnQkFDUixZQUFZO2dCQUNaLG1GQUFtRjtnQkFDbkYsUUFBUTtnQkFDUiw4QkFBOEI7Z0JBQzlCLGdHQUFnRztnQkFDaEcsYUFBYTtnQkFDYixNQUFNO2FBQ1A7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixDQUFDLENBQUM7Z0JBQzVELE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDN0I7WUFFRCxPQUFPLE9BQU87aUJBQ1gsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDVCxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztZQUNsQyxDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7Z0JBQ2hDLE1BQU0sR0FBRyxDQUFDO1lBQ1osQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0tBQUE7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0IsQ0FBQyxJQUFnQjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN2QixLQUFLLENBQ0gsMkJBQTJCLGlCQUFpQixDQUMxQyxJQUFJLENBQ0wsbUNBQW1DLENBQ3JDLENBQUM7WUFDRixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVoQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDckMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsRUFBRSxFQUFFO2dCQUN4QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2FBQ3REO2lCQUFNO2dCQUNMLElBQUksS0FBSyxHQUFHLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQy9ELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNuQztTQUNGO0lBQ0gsQ0FBQzs7QUFsTUQsK0JBQStCO0FBQ2pCLDBDQUFzQixHQUFHLEdBQUcsQ0FBQyJ9