From 7b5e0f5b4cc0e4c1d31e478491d50ba0000006aa Mon Sep 17 00:00:00 2001 From: Albert Date: Thu, 23 Jan 2025 18:00:05 +0100 Subject: [PATCH] feat: add subscriptionType param to monitor characteristic methods --- .../main/java/com/bleplx/BlePlxModule.java | 9 ++++-- .../java/com/bleplx/adapter/BleAdapter.java | 3 ++ .../java/com/bleplx/adapter/BleModule.java | 26 ++++++++++------- src/BleManager.js | 28 +++++++++++++++---- src/BleModule.js | 16 +++++++++-- src/Characteristic.js | 16 +++++++++-- src/Device.js | 17 +++++++++-- src/Service.js | 22 +++++++++++++-- src/TypeDefinition.js | 5 ++++ src/index.d.ts | 21 +++++++++++--- 10 files changed, 128 insertions(+), 35 deletions(-) diff --git a/android/src/main/java/com/bleplx/BlePlxModule.java b/android/src/main/java/com/bleplx/BlePlxModule.java index 1c176ced..c7316405 100644 --- a/android/src/main/java/com/bleplx/BlePlxModule.java +++ b/android/src/main/java/com/bleplx/BlePlxModule.java @@ -768,13 +768,14 @@ public void monitorCharacteristicForDevice(final String deviceId, final String serviceUUID, final String characteristicUUID, final String transactionId, + final String subscriptionType, final Promise promise) { if (!this.isRequestPossibleHandler("monitorCharacteristicForDevice", promise)) { return; } final SafePromise safePromise = new SafePromise(promise); bleAdapter.monitorCharacteristicForDevice( - deviceId, serviceUUID, characteristicUUID, transactionId, + deviceId, serviceUUID, characteristicUUID, transactionId, subscriptionType, new OnEventCallback() { @Override public void onEvent(Characteristic data) { @@ -797,13 +798,14 @@ public void onError(BleError error) { public void monitorCharacteristicForService(final int serviceIdentifier, final String characteristicUUID, final String transactionId, + final String subscriptionType, final Promise promise) { if (!this.isRequestPossibleHandler("monitorCharacteristicForService", promise)) { return; } final SafePromise safePromise = new SafePromise(promise); bleAdapter.monitorCharacteristicForService( - serviceIdentifier, characteristicUUID, transactionId, + serviceIdentifier, characteristicUUID, transactionId, subscriptionType, new OnEventCallback() { @Override public void onEvent(Characteristic data) { @@ -825,6 +827,7 @@ public void onError(BleError error) { @ReactMethod public void monitorCharacteristic(final int characteristicIdentifier, final String transactionId, + final String subscriptionType, final Promise promise) { if (!this.isRequestPossibleHandler("monitorCharacteristic", promise)) { return; @@ -832,7 +835,7 @@ public void monitorCharacteristic(final int characteristicIdentifier, final SafePromise safePromise = new SafePromise(promise); //TODO resolve safePromise with null when monitoring has been completed bleAdapter.monitorCharacteristic( - characteristicIdentifier, transactionId, + characteristicIdentifier, transactionId, subscriptionType, new OnEventCallback() { @Override public void onEvent(Characteristic data) { diff --git a/android/src/main/java/com/bleplx/adapter/BleAdapter.java b/android/src/main/java/com/bleplx/adapter/BleAdapter.java index 6c26d45c..07f0995d 100644 --- a/android/src/main/java/com/bleplx/adapter/BleAdapter.java +++ b/android/src/main/java/com/bleplx/adapter/BleAdapter.java @@ -163,6 +163,7 @@ void monitorCharacteristicForDevice( String serviceUUID, String characteristicUUID, String transactionId, + String subscriptionType, OnEventCallback onEventCallback, OnErrorCallback onErrorCallback); @@ -170,12 +171,14 @@ void monitorCharacteristicForService( int serviceIdentifier, String characteristicUUID, String transactionId, + String subscriptionType, OnEventCallback onEventCallback, OnErrorCallback onErrorCallback); void monitorCharacteristic( int characteristicIdentifier, String transactionId, + String subscriptionType, OnEventCallback onEventCallback, OnErrorCallback onErrorCallback); diff --git a/android/src/main/java/com/bleplx/adapter/BleModule.java b/android/src/main/java/com/bleplx/adapter/BleModule.java index 2bae763e..837075fd 100755 --- a/android/src/main/java/com/bleplx/adapter/BleModule.java +++ b/android/src/main/java/com/bleplx/adapter/BleModule.java @@ -689,6 +689,7 @@ public void monitorCharacteristicForDevice(String deviceIdentifier, String serviceUUID, String characteristicUUID, String transactionId, + String subscriptionType, OnEventCallback onEventCallback, OnErrorCallback onErrorCallback) { final Characteristic characteristic = getCharacteristicOrEmitError( @@ -697,13 +698,14 @@ public void monitorCharacteristicForDevice(String deviceIdentifier, return; } - safeMonitorCharacteristicForDevice(characteristic, transactionId, onEventCallback, onErrorCallback); + safeMonitorCharacteristicForDevice(characteristic, transactionId, subscriptionType, onEventCallback, onErrorCallback); } @Override public void monitorCharacteristicForService(int serviceIdentifier, String characteristicUUID, String transactionId, + String subscriptionType, OnEventCallback onEventCallback, OnErrorCallback onErrorCallback) { final Characteristic characteristic = getCharacteristicOrEmitError( @@ -712,11 +714,11 @@ public void monitorCharacteristicForService(int serviceIdentifier, return; } - safeMonitorCharacteristicForDevice(characteristic, transactionId, onEventCallback, onErrorCallback); + safeMonitorCharacteristicForDevice(characteristic, transactionId, subscriptionType, onEventCallback, onErrorCallback); } @Override - public void monitorCharacteristic(int characteristicIdentifier, String transactionId, + public void monitorCharacteristic(int characteristicIdentifier, String transactionId, String subscriptionType, OnEventCallback onEventCallback, OnErrorCallback onErrorCallback) { final Characteristic characteristic = getCharacteristicOrEmitError(characteristicIdentifier, onErrorCallback); @@ -724,7 +726,7 @@ public void monitorCharacteristic(int characteristicIdentifier, String transacti return; } - safeMonitorCharacteristicForDevice(characteristic, transactionId, onEventCallback, onErrorCallback); + safeMonitorCharacteristicForDevice(characteristic, transactionId, subscriptionType, onEventCallback, onErrorCallback); } @Override @@ -1439,6 +1441,7 @@ private void safeWriteCharacteristicForDevice(final Characteristic characteristi private void safeMonitorCharacteristicForDevice(final Characteristic characteristic, final String transactionId, + final String subscriptionType, final OnEventCallback onEventCallback, final OnErrorCallback onErrorCallback) { final RxBleConnection connection = getConnectionOrEmitError(characteristic.getDeviceId(), onErrorCallback); @@ -1453,12 +1456,15 @@ private void safeMonitorCharacteristicForDevice(final Characteristic characteris NotificationSetupMode setupMode = cccDescriptor != null ? NotificationSetupMode.QUICK_SETUP : NotificationSetupMode.COMPAT; - if (characteristic.isNotifiable()) { - return connection.setupNotification(characteristic.gattCharacteristic, setupMode); - } - - if (characteristic.isIndicatable()) { - return connection.setupIndication(characteristic.gattCharacteristic, setupMode); + + if ("notification".equals(subscriptionType) && characteristic.isNotifiable()) { + return connection.setupNotification(characteristic.gattCharacteristic, setupMode); + } else if ("indication".equals(subscriptionType) && characteristic.isIndicatable()) { + return connection.setupIndication(characteristic.gattCharacteristic, setupMode); + } else if (characteristic.isNotifiable()) { + return connection.setupNotification(characteristic.gattCharacteristic, setupMode); + } else if (characteristic.isIndicatable()) { + return connection.setupIndication(characteristic.gattCharacteristic, setupMode); } return Observable.error(new CannotMonitorCharacteristicException(characteristic)); diff --git a/src/BleManager.js b/src/BleManager.js index 0d01571f..5e03db2f 100644 --- a/src/BleManager.js +++ b/src/BleManager.js @@ -24,6 +24,7 @@ import type { Identifier, UUID, TransactionId, + CharacteristicSubscriptionType, Base64, ScanOptions, ConnectionOptions, @@ -958,11 +959,18 @@ export class BleManager { serviceUUID: UUID, characteristicUUID: UUID, listener: (error: ?BleError, characteristic: ?Characteristic) => void, - transactionId: ?TransactionId + transactionId: ?TransactionId, + subscriptionType: ?CharacteristicSubscriptionType ): Subscription { const filledTransactionId = transactionId || this._nextUniqueID() return this._handleMonitorCharacteristic( - BleModule.monitorCharacteristicForDevice(deviceIdentifier, serviceUUID, characteristicUUID, filledTransactionId), + BleModule.monitorCharacteristicForDevice( + deviceIdentifier, + serviceUUID, + characteristicUUID, + filledTransactionId, + subscriptionType + ), filledTransactionId, listener ) @@ -985,11 +993,17 @@ export class BleManager { serviceIdentifier: Identifier, characteristicUUID: UUID, listener: (error: ?BleError, characteristic: ?Characteristic) => void, - transactionId: ?TransactionId + transactionId: ?TransactionId, + subscriptionType: ?CharacteristicSubscriptionType ): Subscription { const filledTransactionId = transactionId || this._nextUniqueID() return this._handleMonitorCharacteristic( - BleModule.monitorCharacteristicForService(serviceIdentifier, characteristicUUID, filledTransactionId), + BleModule.monitorCharacteristicForService( + serviceIdentifier, + characteristicUUID, + filledTransactionId, + subscriptionType + ), filledTransactionId, listener ) @@ -1003,6 +1017,7 @@ export class BleManager { * @param {function(error: ?BleError, characteristic: ?Characteristic)} listener - callback which emits * {@link Characteristic} objects with modified value for each notification. * @param {?TransactionId} transactionId optional `transactionId` which can be used in + * @param {?CharacteristicSubscriptionType} subscriptionType [android only] subscription type of the characteristic * {@link #blemanagercanceltransaction|cancelTransaction()} function. * @returns {Subscription} Subscription on which `remove()` function can be called to unsubscribe. * @private @@ -1010,11 +1025,12 @@ export class BleManager { _monitorCharacteristic( characteristicIdentifier: Identifier, listener: (error: ?BleError, characteristic: ?Characteristic) => void, - transactionId: ?TransactionId + transactionId: ?TransactionId, + subscriptionType: ?CharacteristicSubscriptionType ): Subscription { const filledTransactionId = transactionId || this._nextUniqueID() return this._handleMonitorCharacteristic( - BleModule.monitorCharacteristic(characteristicIdentifier, filledTransactionId), + BleModule.monitorCharacteristic(characteristicIdentifier, filledTransactionId, subscriptionType), filledTransactionId, listener ) diff --git a/src/BleModule.js b/src/BleModule.js index b783885a..c9c5ea03 100644 --- a/src/BleModule.js +++ b/src/BleModule.js @@ -8,6 +8,7 @@ import type { Identifier, UUID, TransactionId, + CharacteristicSubscriptionType, Base64, ScanOptions, ConnectionOptions @@ -607,6 +608,7 @@ export interface BleModuleInterface { * @param {UUID} serviceUUID Service UUID * @param {UUID} characteristicUUID Characteristic UUID * @param {TransactionId} transactionId Transaction handle used to cancel operation + * @param {?CharacteristicSubscriptionType} subscriptionType [android only] subscription type of the characteristic * @returns {Promise} Value which is returned when monitoring was cancelled or resulted in error * @private */ @@ -614,7 +616,8 @@ export interface BleModuleInterface { deviceIdentifier: DeviceId, serviceUUID: UUID, characteristicUUID: UUID, - transactionId: TransactionId + transactionId: TransactionId, + subscriptionType: ?CharacteristicSubscriptionType ): Promise; /** @@ -623,13 +626,15 @@ export interface BleModuleInterface { * @param {Identifier} serviceIdentifier Service ID * @param {UUID} characteristicUUID Characteristic UUID * @param {TransactionId} transactionId Transaction handle used to cancel operation + * @param {?CharacteristicSubscriptionType} subscriptionType [android only] subscription type of the characteristic * @returns {Promise} Value which is returned when monitoring was cancelled or resulted in error * @private */ monitorCharacteristicForService( serviceIdentifier: Identifier, characteristicUUID: UUID, - transactionId: TransactionId + transactionId: TransactionId, + subscriptionType: ?CharacteristicSubscriptionType ): Promise; /** @@ -637,10 +642,15 @@ export interface BleModuleInterface { * * @param {Identifier} characteristicIdentifier Characteristic ID * @param {TransactionId} transactionId Transaction handle used to cancel operation + * @param {?CharacteristicSubscriptionType} subscriptionType [android only] subscription type of the characteristic * @returns {Promise} Value which is returned when monitoring was cancelled or resulted in error * @private */ - monitorCharacteristic(characteristicIdentifier: Identifier, transactionId: TransactionId): Promise; + monitorCharacteristic( + characteristicIdentifier: Identifier, + transactionId: TransactionId, + subscriptionType: ?CharacteristicSubscriptionType + ): Promise; // Descriptor operations diff --git a/src/Characteristic.js b/src/Characteristic.js index 7af37b0c..289718a0 100644 --- a/src/Characteristic.js +++ b/src/Characteristic.js @@ -5,7 +5,15 @@ import type { BleManager } from './BleManager' import type { BleError } from './BleError' import { Descriptor } from './Descriptor' import type { NativeCharacteristic } from './BleModule' -import type { DeviceId, Identifier, UUID, TransactionId, Base64, Subscription } from './TypeDefinition' +import type { + DeviceId, + Identifier, + UUID, + TransactionId, + CharacteristicSubscriptionType, + Base64, + Subscription +} from './TypeDefinition' /** * Characteristic object. @@ -130,14 +138,16 @@ export class Characteristic implements NativeCharacteristic { * @param {function(error: ?BleError, characteristic: ?Characteristic)} listener callback which emits * this {@link Characteristic} with modified value for each notification. * @param {?TransactionId} transactionId optional `transactionId` which can be used in + * @param {?CharacteristicSubscriptionType} subscriptionType [android only] subscription type of the characteristic * {@link #blemanagercanceltransaction|bleManager.cancelTransaction()} function. * @returns {Subscription} Subscription on which `remove()` function can be called to unsubscribe. */ monitor( listener: (error: ?BleError, characteristic: ?Characteristic) => void, - transactionId: ?TransactionId + transactionId: ?TransactionId, + subscriptionType: ?CharacteristicSubscriptionType ): Subscription { - return this._manager._monitorCharacteristic(this.id, listener, transactionId) + return this._manager._monitorCharacteristic(this.id, listener, transactionId, subscriptionType) } /** diff --git a/src/Device.js b/src/Device.js index 3340a89c..a2cef060 100644 --- a/src/Device.js +++ b/src/Device.js @@ -8,7 +8,15 @@ import type { Service } from './Service' import type { Descriptor } from './Descriptor' import { ConnectionPriority } from './TypeDefinition' import type { NativeDevice } from './BleModule' -import type { DeviceId, Base64, UUID, Subscription, TransactionId, ConnectionOptions } from './TypeDefinition' +import type { + DeviceId, + Base64, + UUID, + Subscription, + TransactionId, + CharacteristicSubscriptionType, + ConnectionOptions +} from './TypeDefinition' /** * Device instance which can be retrieved only by calling @@ -298,6 +306,7 @@ export class Device implements NativeDevice { * @param {function(error: ?BleError, characteristic: ?Characteristic)} listener - callback which emits * {@link Characteristic} objects with modified value for each notification. * @param {?TransactionId} transactionId optional `transactionId` which can be used in + * @param {?CharacteristicSubscriptionType} subscriptionType [android only] subscription type of the characteristic * {@link #blemanagercanceltransaction|bleManager.cancelTransaction()} function. * @returns {Subscription} Subscription on which `remove()` function can be called to unsubscribe. */ @@ -305,14 +314,16 @@ export class Device implements NativeDevice { serviceUUID: UUID, characteristicUUID: UUID, listener: (error: ?BleError, characteristic: ?Characteristic) => void, - transactionId: ?TransactionId + transactionId: ?TransactionId, + subscriptionType?: CharacteristicSubscriptionType ): Subscription { return this._manager.monitorCharacteristicForDevice( this.id, serviceUUID, characteristicUUID, listener, - transactionId + transactionId, + subscriptionType ) } diff --git a/src/Service.js b/src/Service.js index 172e95be..a50bfa44 100644 --- a/src/Service.js +++ b/src/Service.js @@ -6,7 +6,15 @@ import type { BleError } from './BleError' import type { Characteristic } from './Characteristic' import type { Descriptor } from './Descriptor' import type { NativeService } from './BleModule' -import type { DeviceId, Identifier, Base64, UUID, Subscription, TransactionId } from './TypeDefinition' +import type { + DeviceId, + Identifier, + Base64, + UUID, + Subscription, + TransactionId, + CharacteristicSubscriptionType +} from './TypeDefinition' /** * Service object. @@ -134,15 +142,23 @@ export class Service implements NativeService { * @param {function(error: ?BleError, characteristic: ?Characteristic)} listener callback which emits * {@link Characteristic} objects with modified value for each notification. * @param {?TransactionId} transactionId optional `transactionId` which can be used in + * @param {?CharacteristicSubscriptionType} subscriptionType [android only] subscription type of the characteristic * {@link #blemanagercanceltransaction|bleManager.cancelTransaction()} function. * @returns {Subscription} Subscription on which `remove()` function can be called to unsubscribe. */ monitorCharacteristic( characteristicUUID: UUID, listener: (error: ?BleError, characteristic: ?Characteristic) => void, - transactionId: ?TransactionId + transactionId: ?TransactionId, + subscriptionType: ?CharacteristicSubscriptionType ): Subscription { - return this._manager._monitorCharacteristicForService(this.id, characteristicUUID, listener, transactionId) + return this._manager._monitorCharacteristicForService( + this.id, + characteristicUUID, + listener, + transactionId, + subscriptionType + ) } /** diff --git a/src/TypeDefinition.js b/src/TypeDefinition.js index 615e7ea9..fb954bd0 100644 --- a/src/TypeDefinition.js +++ b/src/TypeDefinition.js @@ -29,6 +29,11 @@ export type Base64 = string */ export type TransactionId = string +/** + * Characteritic subscription type. + */ +export type CharacteristicSubscriptionType = 'notification' | 'indication' + /** * [Android only] ConnectionOptions parameter to describe when to call BluetoothGatt.refresh() */ diff --git a/src/index.d.ts b/src/index.d.ts index ee46d55b..d1ef75c9 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -26,6 +26,11 @@ declare module 'react-native-ble-plx' { */ export type TransactionId = string + /** + * Characteritic subscription type. + */ + export type CharacteristicSubscriptionType = 'notification' | 'indication' + /** * Subscription * @interface @@ -1355,6 +1360,7 @@ declare module 'react-native-ble-plx' { * @param {function(error?: BleError, characteristic?: Characteristic)} listener - callback which emits * {@link Characteristic} objects with modified value for each notification. * @param {?TransactionId} transactionId optional `transactionId` which can be used in + * @param {?CharacteristicSubscriptionType} subscriptionType [android only] subscription type of the characteristic * {@link #blemanagercanceltransaction|cancelTransaction()} function. * @returns {Subscription} Subscription on which `remove()` function can be called to unsubscribe. */ @@ -1363,7 +1369,8 @@ declare module 'react-native-ble-plx' { serviceUUID: UUID, characteristicUUID: UUID, listener: (error: BleError | null, characteristic: Characteristic | null) => void, - transactionId?: TransactionId + transactionId?: TransactionId, + subscriptionType?: CharacteristicSubscriptionType ): Subscription // Mark: Descriptors operations ---------------------------------------------------------------------------------- @@ -1647,6 +1654,7 @@ declare module 'react-native-ble-plx' { * @param {function(error: ?BleError, characteristic: ?Characteristic)} listener - callback which emits * {@link Characteristic} objects with modified value for each notification. * @param {?TransactionId} transactionId optional `transactionId` which can be used in + * @param {?CharacteristicSubscriptionType} subscriptionType [android only] subscription type of the characteristic * {@link #blemanagercanceltransaction|bleManager.cancelTransaction()} function. * @returns {Subscription} Subscription on which `remove()` function can be called to unsubscribe. */ @@ -1654,7 +1662,8 @@ declare module 'react-native-ble-plx' { serviceUUID: UUID, characteristicUUID: UUID, listener: (error: BleError | null, characteristic: Characteristic | null) => void, - transactionId?: TransactionId + transactionId?: TransactionId, + subscriptionType?: CharacteristicSubscriptionType ): Subscription /** @@ -1797,13 +1806,15 @@ declare module 'react-native-ble-plx' { * @param {function(error?: BleError, characteristic?: Characteristic)} listener callback which emits * {@link Characteristic} objects with modified value for each notification. * @param {?TransactionId} transactionId optional `transactionId` which can be used in + * @param {?CharacteristicSubscriptionType} subscriptionType [android only] subscription type of the characteristic * {@link #blemanagercanceltransaction|bleManager.cancelTransaction()} function. * @returns {Subscription} Subscription on which `remove()` function can be called to unsubscribe. */ monitorCharacteristic( characteristicUUID: UUID, listener: (error: BleError | null, characteristic: Characteristic | null) => void, - transactionId?: string + transactionId?: string, + subscriptionType?: CharacteristicSubscriptionType ): Subscription /** @@ -1959,12 +1970,14 @@ declare module 'react-native-ble-plx' { * @param {function(error?: BleError, characteristic?: Characteristic)} listener callback which emits * this {@link Characteristic} with modified value for each notification. * @param {?TransactionId} transactionId optional `transactionId` which can be used in + * @param {?CharacteristicSubscriptionType} subscriptionType [android only] subscription type of the characteristic * {@link #blemanagercanceltransaction|bleManager.cancelTransaction()} function. * @returns {Subscription} Subscription on which `remove()` function can be called to unsubscribe. */ monitor( listener: (error: BleError | null, characteristic: Characteristic | null) => void, - transactionId?: string + transactionId?: string, + subscriptionType?: CharacteristicSubscriptionType ): Subscription /**