@iotize/tap
Version:
IoTize Device client for Javascript
179 lines • 13.1 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtYmxlLXByb3RvY29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvdG9jb2wvYmxlL2NvbW1vbi9zcmMvbGliL2Fic3RyYWN0LWJsZS1wcm90b2NvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBZSx1QkFBdUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVoRTs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQWdCLG1CQUFvQixTQUFRLGdCQUFnQjtJQXdCaEUsWUFDUyxhQUE4QjtRQUNuQyxHQUFHLEVBQUUsU0FBUyxDQUFDLDRCQUE0QixHQUFHLENBQUM7S0FDaEQ7UUFFRCxLQUFLLEVBQUUsQ0FBQztRQUpELGVBQVUsR0FBVixVQUFVLENBRWhCO0lBR0gsQ0FBQztJQUVELGlCQUFpQixDQUFDLElBQWdCO1FBQ2hDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixLQUFLLENBQUMscUJBQXFCLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pCO2FBQU07WUFDTCxPQUFPLENBQUMsSUFBSSxDQUNW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