UNPKG

obniz

Version:

obniz sdk for javascript

251 lines (229 loc) 7.32 kB
const BlePeripheral = require('./blePeripheral'); const BleService = require('./bleService'); const BleCharacteristic = require('./bleCharacteristic'); const BleDescriptor = require('./bleDescriptor'); const BleRemotePeripheral = require('./bleRemotePeripheral'); const BleAdvertisement = require('./bleAdvertisement'); const BleScan = require('./bleScan'); const BleSecurity = require('./bleSecurity'); class ObnizBLE { constructor(Obniz) { this.Obniz = Obniz; this.remotePeripherals = []; this.service = BleService; this.characteristic = BleCharacteristic; this.descriptor = BleDescriptor; this.peripheral = new BlePeripheral(Obniz); this.scanTarget = null; this.advertisement = new BleAdvertisement(Obniz); this.scan = new BleScan(Obniz); this.security = new BleSecurity(Obniz); this._reset(); } _reset() {} findPeripheral(address) { for (let key in this.remotePeripherals) { if (this.remotePeripherals[key].address === address) { return this.remotePeripherals[key]; } } return null; } notified(obj) { if (obj.scan_result) { let val = this.findPeripheral(obj.scan_result.address); if (!val) { val = new BleRemotePeripheral(this.Obniz, obj.scan_result.address); this.remotePeripherals.push(val); } val.discoverdOnRemote = true; val.setParams(obj.scan_result); this.scan.notifyFromServer('onfind', val); } if (obj.scan_result_finish) { this.scan.notifyFromServer('onfinish'); } let remotePeripheralCallbackFunc = function(val, func, type) { let obj = null; if (val === undefined) return; let p = this.findPeripheral(val.address); if (!p) { return; } if (type === 'peripheral') { obj = p; } else if (type === 'service') { obj = p.findService(val); } else if (type === 'characteristic') { obj = p.findCharacteristic(val); } else if (type === 'descriptor') { obj = p.findDescriptor(val); } if (!obj) { return; } func(val, obj); }.bind(this); const paramList = { status_update: { name: 'statusupdate', obj: 'peripheral' }, get_service_result: { name: 'discover', obj: 'peripheral' }, get_service_result_finish: { name: 'discoverfinished', obj: 'peripheral', }, get_characteristic_result: { name: 'discover', obj: 'service' }, get_characteristic_result_finish: { name: 'discoverfinished', obj: 'service', }, write_characteristic_result: { name: 'onwrite', obj: 'characteristic' }, read_characteristic_result: { name: 'onread', obj: 'characteristic' }, register_notify_characteristic_result: { name: 'onregisternotify', obj: 'characteristic', }, unregister_notify_characteristic_result: { name: 'onunregisternotify', obj: 'characteristic', }, nofity_characteristic: { name: 'onnotify', obj: 'characteristic' }, get_descriptor_result: { name: 'discover', obj: 'characteristic' }, get_descriptor_result_finish: { name: 'discoverfinished', obj: 'characteristic', }, write_descriptor_result: { name: 'onwrite', obj: 'descriptor' }, read_descriptor_result: { name: 'onread', obj: 'descriptor' }, }; for (let key in paramList) { remotePeripheralCallbackFunc( obj[key], function(val, bleobj) { bleobj.notifyFromServer(paramList[key].name, val); }.bind(this), paramList[key].obj ); } let callbackFunc = function(val, func, type) { let obj = null; if (val === undefined) return; if (type === 'peripheral') { obj = this.peripheral; } else if (type === 'service') { obj = this.peripheral.getService(val); } else if (type === 'characteristic') { obj = this.peripheral.findCharacteristic(val); } else if (type === 'descriptor') { obj = this.peripheral.findDescriptor(val); } if (!obj) { return; } func(val, obj); }.bind(this); if (obj.peripheral) { callbackFunc( obj.peripheral.connection_status, function(val) { this.peripheral.onconnectionupdates(val); }.bind(this), 'peripheral' ); const paramList = { read_characteristic_result: { name: 'onread', obj: 'characteristic' }, write_characteristic_result: { name: 'onwrite', obj: 'characteristic' }, notify_read_characteristic: { name: 'onreadfromremote', obj: 'characteristic', }, notify_write_characteristic: { name: 'onwritefromremote', obj: 'characteristic', }, read_descriptor_result: { name: 'onread', obj: 'descriptor' }, write_descriptor_result: { name: 'onwrite', obj: 'descriptor' }, notify_read_descriptor: { name: 'onreadfromremote', obj: 'descriptor' }, notify_write_descriptor: { name: 'onwritefromremote', obj: 'descriptor', }, }; for (let key in paramList) { callbackFunc( obj.peripheral[key], function(val, bleobj) { bleobj.notifyFromServer(paramList[key].name, val); }.bind(this), paramList[key].obj ); } } if (obj.error) { let params = obj.error; let handled = false; let peripheral, target; if (!params.address) { peripheral = this.peripheral; } else { peripheral = this.findPeripheral(params.address); } if (peripheral) { if ( params.service_uuid && params.characteristic_uuid && params.descriptor_uuid ) { target = peripheral.findDescriptor(params); } else if (params.service_uuid && params.characteristic_uuid) { target = peripheral.findCharacteristic(params); } else if (params.service_uuid) { target = peripheral.findService(params); } if (target) { target.notifyFromServer('onerror', params); handled = true; } else { peripheral.onerror(params); handled = true; } } if ([35, 36, 37, 38, 39].includes(params.function_code)) { this.security.onerror(params); handled = true; } if (!handled) { this.Obniz.error( `ble ${params.message} service=${ params.service_uuid } characteristic_uuid=${params.characteristic_uuid} descriptor_uuid=${ params.descriptor_uuid }` ); } } } static _dataArray2uuidHex(data, reverse) { let uuid = []; for (let i = 0; i < data.length; i++) { uuid.push(('00' + data[i].toString(16).toLowerCase()).slice(-2)); } if (reverse) { uuid = uuid.reverse(); } let str = uuid.join(''); if (uuid.length >= 16) { str = str.slice(0, 8) + '-' + str.slice(8, 12) + '-' + str.slice(12, 16) + '-' + str.slice(16, 20) + '-' + str.slice(20); } return str; } } module.exports = ObnizBLE;