react-native-ble-manager 8.8.0 → 9.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +131 -44
- package/android/.gradle/7.4/checksums/checksums.lock +0 -0
- package/android/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock +0 -0
- package/android/.gradle/7.4/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/7.4/executionHistory/executionHistory.bin +0 -0
- package/android/.gradle/7.4/executionHistory/executionHistory.lock +0 -0
- package/android/.gradle/7.4/fileChanges/last-build.bin +0 -0
- package/android/.gradle/7.4/fileHashes/fileHashes.bin +0 -0
- package/android/.gradle/7.4/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/7.4/fileHashes/resourceHashesCache.bin +0 -0
- package/android/.gradle/7.4/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
- package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
- package/android/.gradle/file-system.probe +0 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/.idea/.name +1 -0
- package/android/.idea/compiler.xml +6 -0
- package/android/.idea/gradle.xml +18 -0
- package/android/.idea/jarRepositories.xml +40 -0
- package/android/.idea/misc.xml +10 -0
- package/android/.idea/vcs.xml +6 -0
- package/android/build.gradle +17 -17
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +5 -0
- package/android/gradle.properties +3 -1
- package/android/gradlew +234 -0
- package/android/gradlew.bat +89 -0
- package/android/local.properties +8 -0
- package/android/src/main/java/it/innove/BleManager.java +38 -17
- package/android/src/main/java/it/innove/LegacyScanManager.java +33 -28
- package/android/src/main/java/it/innove/LollipopPeripheral.java +66 -65
- package/android/src/main/java/it/innove/LollipopScanManager.java +52 -25
- package/android/src/main/java/it/innove/Peripheral.java +973 -838
- package/android/src/main/java/it/innove/ScanManager.java +24 -23
- package/dist/cjs/index.d.ts +156 -0
- package/dist/cjs/index.js +507 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types.d.ts +311 -0
- package/dist/cjs/types.js +110 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/index.d.ts +156 -0
- package/dist/esm/index.js +491 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types.d.ts +311 -0
- package/dist/esm/types.js +107 -0
- package/dist/esm/types.js.map +1 -0
- package/ios/BleManager.h +1 -0
- package/ios/BleManager.m +213 -115
- package/ios/BleManager.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/ios/BleManager.xcodeproj/project.xcworkspace/xcuserdata/marco.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/BleManager.xcodeproj/xcuserdata/marco.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/ios/CBPeripheral+Extensions.m +1 -1
- package/package.json +31 -4
- package/src/index.ts +595 -0
- package/src/types.ts +336 -0
- package/.github/FUNDING.yml +0 -3
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
- package/BleManager.js +0 -427
- package/index.d.ts +0 -294
package/ios/BleManager.m
CHANGED
|
@@ -28,6 +28,7 @@ bool hasListeners;
|
|
|
28
28
|
retrieveServicesLatches = [NSMutableDictionary new];
|
|
29
29
|
readCallbacks = [NSMutableDictionary new];
|
|
30
30
|
readRSSICallbacks = [NSMutableDictionary new];
|
|
31
|
+
readDescriptorCallbacks = [NSMutableDictionary new];
|
|
31
32
|
retrieveServicesCallbacks = [NSMutableDictionary new];
|
|
32
33
|
writeCallbacks = [NSMutableDictionary new];
|
|
33
34
|
writeQueue = [NSMutableArray array];
|
|
@@ -82,21 +83,17 @@ bool hasListeners;
|
|
|
82
83
|
|
|
83
84
|
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
|
|
84
85
|
NSString *key = [self keyForPeripheral: peripheral andCharacteristic:characteristic];
|
|
85
|
-
RCTResponseSenderBlock readCallback = [readCallbacks objectForKey:key];
|
|
86
86
|
|
|
87
87
|
if (error) {
|
|
88
88
|
NSLog(@"Error %@ :%@", characteristic.UUID, error);
|
|
89
|
-
|
|
90
|
-
readCallback(@[error, [NSNull null]]);
|
|
91
|
-
[readCallbacks removeObjectForKey:key];
|
|
92
|
-
}
|
|
89
|
+
[self invokeAndClearDictionary:readCallbacks withKey:key usingParameters:@[error, [NSNull null]]];
|
|
93
90
|
return;
|
|
94
91
|
}
|
|
95
92
|
NSLog(@"Read value [%@]: (%lu) %@", characteristic.UUID, [characteristic.value length], characteristic.value);
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
[readCallbacks
|
|
93
|
+
|
|
94
|
+
NSMutableArray* peripheralReadCallbacks = [readCallbacks objectForKey:key];
|
|
95
|
+
if (peripheralReadCallbacks != NULL) {
|
|
96
|
+
[self invokeAndClearDictionary:readCallbacks withKey:key usingParameters:@[[NSNull null], ([characteristic.value length] > 0) ? [characteristic.value toArray] : [NSNull null]]];
|
|
100
97
|
} else {
|
|
101
98
|
if (hasListeners) {
|
|
102
99
|
[self sendEventWithName:@"BleManagerDidUpdateValueForCharacteristic" body:@{@"peripheral": peripheral.uuidAsString, @"characteristic":characteristic.UUID.UUIDString, @"service":characteristic.service.UUID.UUIDString, @"value": ([characteristic.value length] > 0) ? [characteristic.value toArray] : [NSNull null]}];
|
|
@@ -104,6 +101,47 @@ bool hasListeners;
|
|
|
104
101
|
}
|
|
105
102
|
}
|
|
106
103
|
|
|
104
|
+
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForDescriptor:(nonnull CBDescriptor *)descriptor error:(nullable NSError *)error {
|
|
105
|
+
NSString *key = [self keyForPeripheral: peripheral andCharacteristic:descriptor.characteristic andDescriptor:descriptor];
|
|
106
|
+
|
|
107
|
+
if (error) {
|
|
108
|
+
NSLog(@"Error reading descriptor value for %@ on characteristic %@ :%@",
|
|
109
|
+
descriptor.UUID,
|
|
110
|
+
descriptor.characteristic.UUID,
|
|
111
|
+
error);
|
|
112
|
+
[self invokeAndClearDictionary:readDescriptorCallbacks withKey:key usingParameters:@[error, [NSNull null]]];
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
NSLog(@"Read value [descriptor: %@, characteristic: %@]: (%lu) %@",
|
|
116
|
+
descriptor.UUID,
|
|
117
|
+
descriptor.characteristic.UUID,
|
|
118
|
+
[descriptor.value length],
|
|
119
|
+
descriptor.value);
|
|
120
|
+
|
|
121
|
+
NSMutableArray* peripheralReadDescriptorCallbacks = [readDescriptorCallbacks objectForKey:key];
|
|
122
|
+
if (peripheralReadDescriptorCallbacks != NULL) {
|
|
123
|
+
// The most future proof way of doing this that I could find, other option would be running strcmp on CBUUID strings
|
|
124
|
+
// https://developer.apple.com/documentation/corebluetooth/cbuuid/characteristic_descriptors
|
|
125
|
+
if ([descriptor.value isKindOfClass:[NSData class]]) {
|
|
126
|
+
[self invokeAndClearDictionary:readDescriptorCallbacks withKey:key usingParameters:@[[NSNull null], ([descriptor.value length] > 0) ? [descriptor.value toArray] : [NSNull null]]];
|
|
127
|
+
} else if ([descriptor.value isKindOfClass:[NSNumber class]]) {
|
|
128
|
+
NSMutableData *byteData = [NSMutableData new];
|
|
129
|
+
if (descriptor.value != nil) {
|
|
130
|
+
NSNumber *number = descriptor.value;
|
|
131
|
+
unsigned long long value = number.unsignedLongLongValue;
|
|
132
|
+
[byteData appendBytes:&value length:sizeof(value)];
|
|
133
|
+
}
|
|
134
|
+
[self invokeAndClearDictionary:readDescriptorCallbacks withKey:key usingParameters:@[[NSNull null], ([byteData length] > 0) ? [byteData toArray] : [NSNull null]]];
|
|
135
|
+
} else if ([descriptor.value isKindOfClass:[NSString class]]) {
|
|
136
|
+
NSData *byteData = [descriptor.value dataUsingEncoding:NSUTF8StringEncoding];
|
|
137
|
+
[self invokeAndClearDictionary:readDescriptorCallbacks withKey:key usingParameters:@[[NSNull null], ([byteData length] > 0) ? [byteData toArray] : [NSNull null]]];
|
|
138
|
+
} else {
|
|
139
|
+
NSLog(@"Unrecognized type of descriptor: (UUID: %@, value type: %@, value: %@)", descriptor.UUID, [descriptor.value class], descriptor.value);
|
|
140
|
+
[self invokeAndClearDictionary:readDescriptorCallbacks withKey:key usingParameters:@[[NSNull null], ([descriptor.value length] > 0) ? [descriptor.value toArray] : [NSNull null]]];
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
107
145
|
- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
|
|
108
146
|
if (error) {
|
|
109
147
|
NSLog(@"Error in didUpdateNotificationStateForCharacteristic: %@", error);
|
|
@@ -118,27 +156,25 @@ bool hasListeners;
|
|
|
118
156
|
NSString *key = [self keyForPeripheral: peripheral andCharacteristic:characteristic];
|
|
119
157
|
|
|
120
158
|
if (characteristic.isNotifying) {
|
|
121
|
-
|
|
122
|
-
if (
|
|
159
|
+
NSMutableArray* peripheralNotificationCallbacks = [notificationCallbacks objectForKey:key];
|
|
160
|
+
if (peripheralNotificationCallbacks != nil) {
|
|
123
161
|
if (error) {
|
|
124
|
-
|
|
162
|
+
[self invokeAndClearDictionary:notificationCallbacks withKey:key usingParameters:@[error]];
|
|
125
163
|
} else {
|
|
126
164
|
NSLog(@"Notification began on %@", characteristic.UUID);
|
|
127
|
-
|
|
165
|
+
[self invokeAndClearDictionary:notificationCallbacks withKey:key usingParameters:@[]];
|
|
128
166
|
}
|
|
129
|
-
[notificationCallbacks removeObjectForKey:key];
|
|
130
167
|
}
|
|
131
168
|
} else {
|
|
132
169
|
// Notification has stopped
|
|
133
|
-
|
|
134
|
-
if (
|
|
170
|
+
NSMutableArray* peripheralStopNotificationCallbacks = [stopNotificationCallbacks objectForKey:key];
|
|
171
|
+
if (peripheralStopNotificationCallbacks != nil) {
|
|
135
172
|
if (error) {
|
|
136
|
-
|
|
173
|
+
[self invokeAndClearDictionary:stopNotificationCallbacks withKey:key usingParameters:@[error]];
|
|
137
174
|
} else {
|
|
138
175
|
NSLog(@"Notification ended on %@", characteristic.UUID);
|
|
139
|
-
|
|
176
|
+
[self invokeAndClearDictionary:stopNotificationCallbacks withKey:key usingParameters:@[]];
|
|
140
177
|
}
|
|
141
|
-
[stopNotificationCallbacks removeObjectForKey:key];
|
|
142
178
|
}
|
|
143
179
|
}
|
|
144
180
|
if (hasListeners) {
|
|
@@ -152,17 +188,17 @@ bool hasListeners;
|
|
|
152
188
|
- (NSString *) centralManagerStateToString: (int)state
|
|
153
189
|
{
|
|
154
190
|
switch (state) {
|
|
155
|
-
case
|
|
191
|
+
case CBManagerStateUnknown:
|
|
156
192
|
return @"unknown";
|
|
157
|
-
case
|
|
193
|
+
case CBManagerStateResetting:
|
|
158
194
|
return @"resetting";
|
|
159
|
-
case
|
|
195
|
+
case CBManagerStateUnsupported:
|
|
160
196
|
return @"unsupported";
|
|
161
|
-
case
|
|
197
|
+
case CBManagerStateUnauthorized:
|
|
162
198
|
return @"unauthorized";
|
|
163
|
-
case
|
|
199
|
+
case CBManagerStatePoweredOff:
|
|
164
200
|
return @"off";
|
|
165
|
-
case
|
|
201
|
+
case CBManagerStatePoweredOn:
|
|
166
202
|
return @"on";
|
|
167
203
|
default:
|
|
168
204
|
return @"unknown";
|
|
@@ -192,12 +228,18 @@ bool hasListeners;
|
|
|
192
228
|
- (NSString *) periphalManagerStateToString: (int)state
|
|
193
229
|
{
|
|
194
230
|
switch (state) {
|
|
195
|
-
case
|
|
196
|
-
return @"
|
|
197
|
-
case
|
|
198
|
-
return @"
|
|
199
|
-
case
|
|
200
|
-
return @"
|
|
231
|
+
case CBManagerStateUnknown:
|
|
232
|
+
return @"unknown";
|
|
233
|
+
case CBManagerStateResetting:
|
|
234
|
+
return @"resetting";
|
|
235
|
+
case CBManagerStateUnsupported:
|
|
236
|
+
return @"unsupported";
|
|
237
|
+
case CBManagerStateUnauthorized:
|
|
238
|
+
return @"unauthorized";
|
|
239
|
+
case CBManagerStatePoweredOff:
|
|
240
|
+
return @"off";
|
|
241
|
+
case CBManagerStatePoweredOn:
|
|
242
|
+
return @"on";
|
|
201
243
|
default:
|
|
202
244
|
return @"unknown";
|
|
203
245
|
}
|
|
@@ -435,8 +477,8 @@ RCT_EXPORT_METHOD(connect:(NSString *)peripheralUUID callback:(nonnull RCTRespon
|
|
|
435
477
|
}
|
|
436
478
|
if (peripheral) {
|
|
437
479
|
NSLog(@"Connecting to peripheral with UUID : %@", peripheralUUID);
|
|
438
|
-
|
|
439
|
-
[
|
|
480
|
+
|
|
481
|
+
[self insertCallback:callback intoDictionary:connectCallbacks withKey:[peripheral uuidAsString]];
|
|
440
482
|
[manager connectPeripheral:peripheral options:nil];
|
|
441
483
|
|
|
442
484
|
} else {
|
|
@@ -475,10 +517,13 @@ RCT_EXPORT_METHOD(disconnect:(NSString *)peripheralUUID force:(BOOL)force callba
|
|
|
475
517
|
}
|
|
476
518
|
}
|
|
477
519
|
|
|
478
|
-
RCT_EXPORT_METHOD(checkState)
|
|
520
|
+
RCT_EXPORT_METHOD(checkState:(nonnull RCTResponseSenderBlock)callback)
|
|
479
521
|
{
|
|
480
522
|
if (manager != nil){
|
|
481
523
|
[self centralManagerDidUpdateState:self.manager];
|
|
524
|
+
|
|
525
|
+
NSString *stateName = [self centralManagerStateToString:self.manager.state];
|
|
526
|
+
callback(@[stateName]);
|
|
482
527
|
}
|
|
483
528
|
}
|
|
484
529
|
|
|
@@ -486,12 +531,8 @@ RCT_EXPORT_METHOD(checkState)
|
|
|
486
531
|
{
|
|
487
532
|
NSString *errorStr = [NSString stringWithFormat:@"Peripheral connection failure: %@. (%@)", peripheral, [error localizedDescription]];
|
|
488
533
|
NSLog(@"%@", errorStr);
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
if (connectCallback) {
|
|
492
|
-
connectCallback(@[errorStr]);
|
|
493
|
-
[connectCallbacks removeObjectForKey:[peripheral uuidAsString]];
|
|
494
|
-
}
|
|
534
|
+
|
|
535
|
+
[self invokeAndClearDictionary:connectCallbacks withKey:[peripheral uuidAsString] usingParameters:@[errorStr]];
|
|
495
536
|
}
|
|
496
537
|
|
|
497
538
|
RCT_EXPORT_METHOD(write:(NSString *)deviceUUID serviceUUID:(NSString*)serviceUUID characteristicUUID:(NSString*)characteristicUUID message:(NSArray*)message maxByteSize:(NSInteger)maxByteSize callback:(nonnull RCTResponseSenderBlock)callback)
|
|
@@ -518,8 +559,8 @@ RCT_EXPORT_METHOD(write:(NSString *)deviceUUID serviceUUID:(NSString*)serviceUUI
|
|
|
518
559
|
CBCharacteristic *characteristic = [context characteristic];
|
|
519
560
|
|
|
520
561
|
NSString *key = [self keyForPeripheral: peripheral andCharacteristic:characteristic];
|
|
521
|
-
[
|
|
522
|
-
|
|
562
|
+
[self insertCallback:callback intoDictionary:writeCallbacks withKey:key];
|
|
563
|
+
|
|
523
564
|
RCTLogInfo(@"Message to write(%lu): %@ ", (unsigned long)[dataMessage length], [dataMessage hexadecimalString]);
|
|
524
565
|
if ([dataMessage length] > maxByteSize){
|
|
525
566
|
int dataLength = (int)dataMessage.length;
|
|
@@ -606,7 +647,7 @@ RCT_EXPORT_METHOD(read:(NSString *)deviceUUID serviceUUID:(NSString*)serviceUUID
|
|
|
606
647
|
CBCharacteristic *characteristic = [context characteristic];
|
|
607
648
|
|
|
608
649
|
NSString *key = [self keyForPeripheral: peripheral andCharacteristic:characteristic];
|
|
609
|
-
[
|
|
650
|
+
[self insertCallback:callback intoDictionary:readCallbacks withKey:key];
|
|
610
651
|
|
|
611
652
|
[peripheral readValueForCharacteristic:characteristic]; // callback sends value
|
|
612
653
|
}
|
|
@@ -620,7 +661,7 @@ RCT_EXPORT_METHOD(readRSSI:(NSString *)deviceUUID callback:(nonnull RCTResponseS
|
|
|
620
661
|
CBPeripheral *peripheral = [self findPeripheralByUUID:deviceUUID];
|
|
621
662
|
|
|
622
663
|
if (peripheral && peripheral.state == CBPeripheralStateConnected) {
|
|
623
|
-
[
|
|
664
|
+
[self insertCallback:callback intoDictionary:readRSSICallbacks withKey:[peripheral uuidAsString]];
|
|
624
665
|
[peripheral readRSSI];
|
|
625
666
|
} else {
|
|
626
667
|
callback(@[@"Peripheral not found or not connected"]);
|
|
@@ -628,6 +669,36 @@ RCT_EXPORT_METHOD(readRSSI:(NSString *)deviceUUID callback:(nonnull RCTResponseS
|
|
|
628
669
|
|
|
629
670
|
}
|
|
630
671
|
|
|
672
|
+
RCT_EXPORT_METHOD(readDescriptor:(NSString *)deviceUUID serviceUUID:(NSString*)serviceUUID characteristicUUID:(NSString*)characteristicUUID descriptorUUID:(NSString*)descriptorUUID callback:(nonnull RCTResponseSenderBlock)callback)
|
|
673
|
+
{
|
|
674
|
+
NSLog(@"readDescriptor");
|
|
675
|
+
|
|
676
|
+
BLECommandContext *context = [self getData:deviceUUID serviceUUIDString:serviceUUID characteristicUUIDString:characteristicUUID prop:CBCharacteristicPropertyRead callback:callback];
|
|
677
|
+
if (context) {
|
|
678
|
+
|
|
679
|
+
CBPeripheral *peripheral = [context peripheral];
|
|
680
|
+
CBCharacteristic *characteristic = [context characteristic];
|
|
681
|
+
CBDescriptor *descriptor = [self findDescriptorFromUUID:[CBUUID UUIDWithString:descriptorUUID] characteristic:characteristic];
|
|
682
|
+
if (!descriptor) {
|
|
683
|
+
NSString* err = [NSString stringWithFormat:@"Could not find descriptor with UUID %@ on characteristic with UUID %@ on peripheral with UUID %@",
|
|
684
|
+
descriptorUUID,
|
|
685
|
+
characteristic.UUID,
|
|
686
|
+
peripheral.identifier.UUIDString];
|
|
687
|
+
NSLog(@"Could not find descriptor with UUID %@ on characteristic with UUID %@ on peripheral with UUID %@",
|
|
688
|
+
descriptorUUID,
|
|
689
|
+
characteristic.UUID,
|
|
690
|
+
peripheral.identifier.UUIDString);
|
|
691
|
+
callback(@[err]);
|
|
692
|
+
} else {
|
|
693
|
+
NSString *key = [self keyForPeripheral: peripheral andCharacteristic:characteristic andDescriptor:descriptor];
|
|
694
|
+
[self insertCallback:callback intoDictionary:readDescriptorCallbacks withKey:key];
|
|
695
|
+
|
|
696
|
+
[peripheral readValueForDescriptor:descriptor]; // callback sends value
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
}
|
|
701
|
+
|
|
631
702
|
RCT_EXPORT_METHOD(retrieveServices:(NSString *)deviceUUID services:(NSArray<NSString *> *)services callback:(nonnull RCTResponseSenderBlock)callback)
|
|
632
703
|
{
|
|
633
704
|
NSLog(@"retrieveServices %@", services);
|
|
@@ -635,7 +706,7 @@ RCT_EXPORT_METHOD(retrieveServices:(NSString *)deviceUUID services:(NSArray<NSSt
|
|
|
635
706
|
CBPeripheral *peripheral = [self findPeripheralByUUID:deviceUUID];
|
|
636
707
|
|
|
637
708
|
if (peripheral && peripheral.state == CBPeripheralStateConnected) {
|
|
638
|
-
[
|
|
709
|
+
[self insertCallback:callback intoDictionary:retrieveServicesCallbacks withKey:[peripheral uuidAsString]];
|
|
639
710
|
|
|
640
711
|
NSMutableArray<CBUUID *> *uuids = [NSMutableArray new];
|
|
641
712
|
for ( NSString *string in services ) {
|
|
@@ -665,7 +736,7 @@ RCT_EXPORT_METHOD(startNotification:(NSString *)deviceUUID serviceUUID:(NSString
|
|
|
665
736
|
CBCharacteristic *characteristic = [context characteristic];
|
|
666
737
|
|
|
667
738
|
NSString *key = [self keyForPeripheral: peripheral andCharacteristic:characteristic];
|
|
668
|
-
[
|
|
739
|
+
[self insertCallback:callback intoDictionary:notificationCallbacks withKey:key];
|
|
669
740
|
|
|
670
741
|
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
|
|
671
742
|
}
|
|
@@ -684,7 +755,7 @@ RCT_EXPORT_METHOD(stopNotification:(NSString *)deviceUUID serviceUUID:(NSString*
|
|
|
684
755
|
|
|
685
756
|
if ([characteristic isNotifying]){
|
|
686
757
|
NSString *key = [self keyForPeripheral: peripheral andCharacteristic:characteristic];
|
|
687
|
-
[
|
|
758
|
+
[self insertCallback:callback intoDictionary:stopNotificationCallbacks withKey:key];
|
|
688
759
|
[peripheral setNotifyValue:NO forCharacteristic:characteristic];
|
|
689
760
|
NSLog(@"Characteristic stopped notifying");
|
|
690
761
|
} else {
|
|
@@ -730,17 +801,15 @@ RCT_EXPORT_METHOD(requestMTU:(NSString *)deviceUUID mtu:(NSInteger)mtu callback:
|
|
|
730
801
|
NSLog(@"didWrite");
|
|
731
802
|
|
|
732
803
|
NSString *key = [self keyForPeripheral: peripheral andCharacteristic:characteristic];
|
|
733
|
-
|
|
804
|
+
NSMutableArray* peripheralWriteCallbacks = [writeCallbacks objectForKey:key];
|
|
734
805
|
|
|
735
|
-
if (
|
|
806
|
+
if (peripheralWriteCallbacks) {
|
|
736
807
|
if (error) {
|
|
737
808
|
NSLog(@"%@", error);
|
|
738
|
-
[writeCallbacks
|
|
739
|
-
writeCallback(@[error.localizedDescription]);
|
|
809
|
+
[self invokeAndClearDictionary:writeCallbacks withKey:key usingParameters:@[error.localizedDescription]];
|
|
740
810
|
} else {
|
|
741
811
|
if ([writeQueue count] == 0) {
|
|
742
|
-
[writeCallbacks
|
|
743
|
-
writeCallback(@[]);
|
|
812
|
+
[self invokeAndClearDictionary:writeCallbacks withKey:key usingParameters:@[]];
|
|
744
813
|
}else{
|
|
745
814
|
// Remove and write the queud message
|
|
746
815
|
NSData *message = [writeQueue objectAtIndex:0];
|
|
@@ -750,18 +819,14 @@ RCT_EXPORT_METHOD(requestMTU:(NSString *)deviceUUID mtu:(NSInteger)mtu callback:
|
|
|
750
819
|
|
|
751
820
|
}
|
|
752
821
|
}
|
|
753
|
-
|
|
822
|
+
|
|
754
823
|
}
|
|
755
824
|
|
|
756
825
|
|
|
757
826
|
- (void)peripheral:(CBPeripheral*)peripheral didReadRSSI:(NSNumber*)rssi error:(NSError*)error {
|
|
758
827
|
NSLog(@"didReadRSSI %@", rssi);
|
|
759
828
|
NSString *key = [peripheral uuidAsString];
|
|
760
|
-
|
|
761
|
-
if (readRSSICallback) {
|
|
762
|
-
readRSSICallback(@[[NSNull null], [NSNumber numberWithInteger:[rssi integerValue]]]);
|
|
763
|
-
[readRSSICallbacks removeObjectForKey:key];
|
|
764
|
-
}
|
|
829
|
+
[self invokeAndClearDictionary:readRSSICallbacks withKey:key usingParameters:@[[NSNull null], [NSNumber numberWithInteger:[rssi integerValue]]]];
|
|
765
830
|
}
|
|
766
831
|
|
|
767
832
|
|
|
@@ -776,14 +841,9 @@ RCT_EXPORT_METHOD(requestMTU:(NSString *)deviceUUID mtu:(NSInteger)mtu callback:
|
|
|
776
841
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.002 * NSEC_PER_SEC),
|
|
777
842
|
dispatch_get_main_queue(), ^(void){
|
|
778
843
|
// didFailToConnectPeripheral should have been called already if not connected by now
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
if (connectCallback) {
|
|
783
|
-
connectCallback(@[[NSNull null], [peripheral asDictionary]]);
|
|
784
|
-
[connectCallbacks removeObjectForKey:[peripheral uuidAsString]];
|
|
785
|
-
}
|
|
786
|
-
|
|
844
|
+
|
|
845
|
+
[self invokeAndClearDictionary:self->connectCallbacks withKey:[peripheral uuidAsString] usingParameters:@[[NSNull null], [peripheral asDictionary]]];
|
|
846
|
+
|
|
787
847
|
if (hasListeners) {
|
|
788
848
|
[self sendEventWithName:@"BleManagerConnectPeripheral" body:@{@"peripheral": [peripheral uuidAsString]}];
|
|
789
849
|
}
|
|
@@ -802,66 +862,43 @@ RCT_EXPORT_METHOD(requestMTU:(NSString *)deviceUUID mtu:(NSInteger)mtu callback:
|
|
|
802
862
|
NSString *peripheralUUIDString = [peripheral uuidAsString];
|
|
803
863
|
|
|
804
864
|
NSString *errorStr = [NSString stringWithFormat:@"Peripheral did disconnect: %@", peripheralUUIDString];
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
[connectCallbacks removeObjectForKey:peripheralUUIDString];
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
RCTResponseSenderBlock readRSSICallback = [readRSSICallbacks valueForKey:peripheralUUIDString];
|
|
813
|
-
if (readRSSICallback) {
|
|
814
|
-
readRSSICallback(@[errorStr]);
|
|
815
|
-
[readRSSICallbacks removeObjectForKey:peripheralUUIDString];
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
RCTResponseSenderBlock retrieveServicesCallback = [retrieveServicesCallbacks valueForKey:peripheralUUIDString];
|
|
819
|
-
if (retrieveServicesCallback) {
|
|
820
|
-
retrieveServicesCallback(@[errorStr]);
|
|
821
|
-
[retrieveServicesCallbacks removeObjectForKey:peripheralUUIDString];
|
|
822
|
-
}
|
|
865
|
+
|
|
866
|
+
[self invokeAndClearDictionary:connectCallbacks withKey:peripheralUUIDString usingParameters:@[errorStr]];
|
|
867
|
+
[self invokeAndClearDictionary:readRSSICallbacks withKey:peripheralUUIDString usingParameters:@[errorStr]];
|
|
868
|
+
[self invokeAndClearDictionary:retrieveServicesCallbacks withKey:peripheralUUIDString usingParameters:@[errorStr]];
|
|
823
869
|
|
|
824
870
|
NSArray* ourReadCallbacks = readCallbacks.allKeys;
|
|
825
871
|
for (id key in ourReadCallbacks) {
|
|
826
872
|
if ([key hasPrefix:peripheralUUIDString]) {
|
|
827
|
-
|
|
828
|
-
if (callback) {
|
|
829
|
-
callback(@[errorStr]);
|
|
830
|
-
[readCallbacks removeObjectForKey:key];
|
|
831
|
-
}
|
|
873
|
+
[self invokeAndClearDictionary:readCallbacks withKey:key usingParameters:@[errorStr]];
|
|
832
874
|
}
|
|
833
875
|
}
|
|
834
876
|
|
|
835
877
|
NSArray* ourWriteCallbacks = writeCallbacks.allKeys;
|
|
836
878
|
for (id key in ourWriteCallbacks) {
|
|
837
879
|
if ([key hasPrefix:peripheralUUIDString]) {
|
|
838
|
-
|
|
839
|
-
if (callback) {
|
|
840
|
-
callback(@[errorStr]);
|
|
841
|
-
[writeCallbacks removeObjectForKey:key];
|
|
842
|
-
}
|
|
880
|
+
[self invokeAndClearDictionary:writeCallbacks withKey:key usingParameters:@[errorStr]];
|
|
843
881
|
}
|
|
844
882
|
}
|
|
845
883
|
|
|
846
884
|
NSArray* ourNotificationCallbacks = notificationCallbacks.allKeys;
|
|
847
885
|
for (id key in ourNotificationCallbacks) {
|
|
848
886
|
if ([key hasPrefix:peripheralUUIDString]) {
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
887
|
+
[self invokeAndClearDictionary:notificationCallbacks withKey:key usingParameters:@[errorStr]];
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
NSArray* ourReadDescriptorCallbacks = readDescriptorCallbacks.allKeys;
|
|
892
|
+
for (id key in ourReadDescriptorCallbacks) {
|
|
893
|
+
if ([key hasPrefix:peripheralUUIDString]) {
|
|
894
|
+
[self invokeAndClearDictionary:readDescriptorCallbacks withKey:key usingParameters:@[errorStr]];
|
|
854
895
|
}
|
|
855
896
|
}
|
|
856
897
|
|
|
857
898
|
NSArray* ourStopNotificationsCallbacks = stopNotificationCallbacks.allKeys;
|
|
858
899
|
for (id key in ourStopNotificationsCallbacks) {
|
|
859
900
|
if ([key hasPrefix:peripheralUUIDString]) {
|
|
860
|
-
|
|
861
|
-
if (callback) {
|
|
862
|
-
callback(@[errorStr]);
|
|
863
|
-
[stopNotificationCallbacks removeObjectForKey:key];
|
|
864
|
-
}
|
|
901
|
+
[self invokeAndClearDictionary:stopNotificationCallbacks withKey:key usingParameters:@[errorStr]];
|
|
865
902
|
}
|
|
866
903
|
}
|
|
867
904
|
|
|
@@ -903,17 +940,37 @@ RCT_EXPORT_METHOD(requestMTU:(NSString *)deviceUUID mtu:(NSInteger)mtu callback:
|
|
|
903
940
|
NSLog(@"Characteristics For Service Discover");
|
|
904
941
|
|
|
905
942
|
NSString *peripheralUUIDString = [peripheral uuidAsString];
|
|
906
|
-
NSMutableSet *
|
|
907
|
-
[
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
943
|
+
NSMutableSet *characteristicsForService = [NSMutableSet new];
|
|
944
|
+
[characteristicsForService addObjectsFromArray:service.characteristics];
|
|
945
|
+
[retrieveServicesLatches setObject:characteristicsForService forKey:service.UUID.UUIDString];
|
|
946
|
+
|
|
947
|
+
for (CBCharacteristic *characteristic in service.characteristics) {
|
|
948
|
+
[peripheral discoverDescriptorsForCharacteristic:characteristic];
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverDescriptorsForCharacteristic:(nonnull CBCharacteristic *)characteristic error:(nullable NSError *)error {
|
|
953
|
+
if (error) {
|
|
954
|
+
NSLog(@"Error: %@", error);
|
|
955
|
+
return;
|
|
956
|
+
}
|
|
957
|
+
NSLog(@"Descriptor For Characteristic Discover");
|
|
958
|
+
|
|
959
|
+
NSString *peripheralUUIDString = [peripheral uuidAsString];
|
|
960
|
+
NSString *serviceUUIDString = characteristic.service.UUID.UUIDString;
|
|
961
|
+
NSMutableSet *peripheralLatch = [retrieveServicesLatches valueForKey:peripheralUUIDString];
|
|
962
|
+
NSMutableSet *serviceLatch = [retrieveServicesLatches valueForKey:serviceUUIDString];
|
|
963
|
+
[serviceLatch removeObject:characteristic];
|
|
964
|
+
|
|
965
|
+
if ([serviceLatch count] == 0) {
|
|
966
|
+
// All characteristics for this service have been checked
|
|
967
|
+
[peripheralLatch removeObject:characteristic.service];
|
|
968
|
+
|
|
969
|
+
if ([peripheralLatch count] == 0) {
|
|
970
|
+
// Call success callback for connect
|
|
971
|
+
[self invokeAndClearDictionary:retrieveServicesCallbacks withKey:peripheralUUIDString usingParameters:@[[NSNull null], [peripheral asDictionary]]];
|
|
972
|
+
[retrieveServicesLatches removeObjectForKey:peripheralUUIDString];
|
|
915
973
|
}
|
|
916
|
-
[retrieveServicesLatches removeObjectForKey:peripheralUUIDString];
|
|
917
974
|
}
|
|
918
975
|
}
|
|
919
976
|
|
|
@@ -947,6 +1004,20 @@ RCT_EXPORT_METHOD(requestMTU:(NSString *)deviceUUID mtu:(NSInteger)mtu callback:
|
|
|
947
1004
|
return nil; //Characteristic not found on this service
|
|
948
1005
|
}
|
|
949
1006
|
|
|
1007
|
+
-(CBDescriptor *) findDescriptorFromUUID:(CBUUID *)UUID characteristic:(CBCharacteristic*)characteristic
|
|
1008
|
+
{
|
|
1009
|
+
NSLog(@"Looking for descriptor %@ on characteristic %@", UUID, characteristic.UUID);
|
|
1010
|
+
for (int i=0; i < characteristic.descriptors.count; i++)
|
|
1011
|
+
{
|
|
1012
|
+
CBDescriptor *d = [characteristic.descriptors objectAtIndex:i];
|
|
1013
|
+
if ([d.UUID.UUIDString isEqualToString: UUID.UUIDString]) {
|
|
1014
|
+
NSLog(@"Found descriptor %@", UUID);
|
|
1015
|
+
return d;
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
return nil; // Descriptor not found on this characteristic
|
|
1019
|
+
}
|
|
1020
|
+
|
|
950
1021
|
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
|
|
951
1022
|
{
|
|
952
1023
|
NSString *stateName = [self centralManagerStateToString:central.state];
|
|
@@ -1020,6 +1091,10 @@ RCT_EXPORT_METHOD(requestMTU:(NSString *)deviceUUID mtu:(NSInteger)mtu callback:
|
|
|
1020
1091
|
return [NSString stringWithFormat:@"%@|%@", [peripheral uuidAsString], [characteristic UUID]];
|
|
1021
1092
|
}
|
|
1022
1093
|
|
|
1094
|
+
-(NSString *) keyForPeripheral: (CBPeripheral *)peripheral andCharacteristic:(CBCharacteristic *)characteristic andDescriptor:(CBDescriptor *)descriptor {
|
|
1095
|
+
return [NSString stringWithFormat:@"%@|%@|%@", [peripheral uuidAsString], [characteristic UUID], [descriptor UUID]];
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1023
1098
|
-(void)centralManager:(CBCentralManager *)central willRestoreState:(NSDictionary<NSString *,id> *)dict
|
|
1024
1099
|
{
|
|
1025
1100
|
NSArray<CBPeripheral *> *restoredPeripherals = dict[CBCentralManagerRestoredStatePeripheralsKey];
|
|
@@ -1048,4 +1123,27 @@ RCT_EXPORT_METHOD(requestMTU:(NSString *)deviceUUID mtu:(NSInteger)mtu callback:
|
|
|
1048
1123
|
return _instance;
|
|
1049
1124
|
}
|
|
1050
1125
|
|
|
1126
|
+
-(void) insertCallback:(nonnull RCTResponseSenderBlock)callback intoDictionary:(NSMutableDictionary *)dictionary withKey:(NSString *)key
|
|
1127
|
+
{
|
|
1128
|
+
NSMutableArray* peripheralCallbacks = [dictionary objectForKey:key];
|
|
1129
|
+
if (!peripheralCallbacks) {
|
|
1130
|
+
peripheralCallbacks = [NSMutableArray array];
|
|
1131
|
+
[dictionary setObject:peripheralCallbacks forKey:key];
|
|
1132
|
+
}
|
|
1133
|
+
|
|
1134
|
+
[peripheralCallbacks addObject:callback];
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
-(void) invokeAndClearDictionary:(NSMutableDictionary *)dictionary withKey:(NSString *)key usingParameters:(NSArray *)parameters
|
|
1138
|
+
{
|
|
1139
|
+
NSMutableArray* peripheralCallbacks = [dictionary objectForKey:key];
|
|
1140
|
+
if (peripheralCallbacks) {
|
|
1141
|
+
for (RCTResponseSenderBlock callback in peripheralCallbacks) {
|
|
1142
|
+
callback(parameters);
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
[dictionary removeObjectForKey:key];
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
|
|
1051
1149
|
@end
|
|
Binary file
|
package/ios/BleManager.xcodeproj/xcuserdata/marco.xcuserdatad/xcschemes/xcschememanagement.plist
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
+
<plist version="1.0">
|
|
4
|
+
<dict>
|
|
5
|
+
<key>SchemeUserState</key>
|
|
6
|
+
<dict>
|
|
7
|
+
<key>BleManager.xcscheme_^#shared#^_</key>
|
|
8
|
+
<dict>
|
|
9
|
+
<key>orderHint</key>
|
|
10
|
+
<integer>0</integer>
|
|
11
|
+
</dict>
|
|
12
|
+
</dict>
|
|
13
|
+
</dict>
|
|
14
|
+
</plist>
|
|
@@ -209,7 +209,7 @@ static char ADVERTISEMENT_RSSI_IDENTIFER;
|
|
|
209
209
|
NSMutableArray *descriptorList = [NSMutableArray new];
|
|
210
210
|
for (CBDescriptor *descriptor in characteristic.descriptors) {
|
|
211
211
|
NSMutableDictionary *descriptorDictionary = [NSMutableDictionary new];
|
|
212
|
-
[descriptorDictionary setObject:[[descriptor UUID] UUIDString] forKey:@"
|
|
212
|
+
[descriptorDictionary setObject:[[descriptor UUID] UUIDString] forKey:@"uuid"];
|
|
213
213
|
if ([descriptor value]) { // should always have a value?
|
|
214
214
|
[descriptorDictionary setObject:[descriptor value] forKey:@"value"];
|
|
215
215
|
}
|
package/package.json
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-ble-manager",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "9.1.0",
|
|
4
4
|
"description": "A BLE module for react native.",
|
|
5
|
-
"main": "BleManager",
|
|
6
|
-
"types": "./index.d.ts",
|
|
7
5
|
"repository": {
|
|
8
6
|
"type": "git",
|
|
9
7
|
"url": "https://github.com/innoveit/react-native-ble-manager.git"
|
|
@@ -24,8 +22,37 @@
|
|
|
24
22
|
"name": "Innove",
|
|
25
23
|
"url": "https://github.com/innoveit"
|
|
26
24
|
},
|
|
25
|
+
"main": "dist/cjs/index.js",
|
|
26
|
+
"types": "dist/esm/index.d.ts",
|
|
27
|
+
"module": "dist/esm/index.js",
|
|
28
|
+
"react-native": "src/index.ts",
|
|
29
|
+
"files": [
|
|
30
|
+
"/dist",
|
|
31
|
+
"/src",
|
|
32
|
+
"/android",
|
|
33
|
+
"!/android/build",
|
|
34
|
+
"/ios",
|
|
35
|
+
"/*.podspec"
|
|
36
|
+
],
|
|
27
37
|
"scripts": {
|
|
28
38
|
"version": "git add -A",
|
|
29
|
-
"
|
|
39
|
+
"clean": "rimraf dist",
|
|
40
|
+
"type:check": "tsc -p tsconfig.json --noEmit",
|
|
41
|
+
"prebuild": "npm run clean",
|
|
42
|
+
"build:cjs": "tsc --module commonjs --outDir dist/cjs",
|
|
43
|
+
"build:esm": "tsc --outDir dist/esm",
|
|
44
|
+
"build": "npm run build:esm && npm run build:cjs",
|
|
45
|
+
"watch": "npm run build --watch",
|
|
46
|
+
"prepare": "npm run build",
|
|
47
|
+
"preversion": "npm run build",
|
|
48
|
+
"postversion": "git push --follow-tags"
|
|
49
|
+
},
|
|
50
|
+
"peerDependencies": {
|
|
51
|
+
"react-native": ">=0.60.0"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"react-native": "0.71.0",
|
|
55
|
+
"rimraf": "4.1.2",
|
|
56
|
+
"typescript": "4.9.5"
|
|
30
57
|
}
|
|
31
58
|
}
|