From fec80255bcd871f9bbf831a0e1330f46282979fb Mon Sep 17 00:00:00 2001 From: Sacha Froment Date: Tue, 18 Sep 2018 18:56:38 +0200 Subject: [PATCH 1/4] feat(ios): Refactor mobile ios bluetooth Signed-off-by: Sacha Froment --- .../mobile/ios/berty/BertyBluetoothModule.h | 23 +++++++ .../mobile/ios/berty/BertyBluetoothModule.m | 63 +++++++++++++++++++ .../mobile/ios/berty/BertyCentralManager.h | 36 +++++++++++ .../mobile/ios/berty/BertyCentralManager.m | 36 +++++++++++ .../mobile/ios/berty/BertyDevice.h | 25 ++++++++ .../mobile/ios/berty/BertyDevice.m | 30 +++++++++ 6 files changed, 213 insertions(+) create mode 100644 client/react-native/mobile/ios/berty/BertyBluetoothModule.h create mode 100644 client/react-native/mobile/ios/berty/BertyBluetoothModule.m create mode 100644 client/react-native/mobile/ios/berty/BertyCentralManager.h create mode 100644 client/react-native/mobile/ios/berty/BertyCentralManager.m create mode 100644 client/react-native/mobile/ios/berty/BertyDevice.h create mode 100644 client/react-native/mobile/ios/berty/BertyDevice.m diff --git a/client/react-native/mobile/ios/berty/BertyBluetoothModule.h b/client/react-native/mobile/ios/berty/BertyBluetoothModule.h new file mode 100644 index 0000000000..c03599c3c8 --- /dev/null +++ b/client/react-native/mobile/ios/berty/BertyBluetoothModule.h @@ -0,0 +1,23 @@ +// +// BertyBluetoothModule.h +// bluetooth +// +// Created by sacha on 04/09/2018. +// Copyright © 2018 Facebook. All rights reserved. +// + +#import +#import +#import + +#import "BertyCentralManager.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface BertyBluetoothModule : RCTEventEmitter + +@property(nonatomic, strong) BertyCentralManager* bcm; + +@end + +NS_ASSUME_NONNULL_END diff --git a/client/react-native/mobile/ios/berty/BertyBluetoothModule.m b/client/react-native/mobile/ios/berty/BertyBluetoothModule.m new file mode 100644 index 0000000000..29e1f8f3cc --- /dev/null +++ b/client/react-native/mobile/ios/berty/BertyBluetoothModule.m @@ -0,0 +1,63 @@ +// +// BertyBluetoothModule.m +// bluetooth +// +// Created by sacha on 04/09/2018. +// Copyright © 2018 Facebook. All rights reserved. +// + +#import "BertyBluetoothModule.h" + +@implementation BertyBluetoothModule + +RCT_EXPORT_MODULE(); + +- (instancetype)init { + self = [super init]; + if (self) { + self.bcm = [[BertyCentralManager alloc] initWithSender:self]; + } + return self; +} + +- (dispatch_queue_t)methodQueue +{ + return dispatch_get_main_queue(); +} + ++ (BOOL)requiresMainQueueSetup +{ + return YES; +} + +- (NSArray *)supportedEvents +{ + return @[@"NEW_DEVICE", @"NEW_MESSAGE"]; +} + +RCT_EXPORT_METHOD(updateValue) +{ + [self.bcm updateValue]; +} + +RCT_EXPORT_METHOD(startDiscover) +{ + [self.bcm discover]; +} + +RCT_EXPORT_METHOD(subscribe) +{ + [self.bcm subscribe]; +} + +RCT_EXPORT_METHOD(connect:(NSString *)addr) +{ + [self.bcm connect:addr]; +} + +RCT_EXPORT_METHOD(writeTo:(NSString *)addr msg:(NSString *)msg) +{ + [self.bcm writeTo:addr msg:msg]; +} + +@end diff --git a/client/react-native/mobile/ios/berty/BertyCentralManager.h b/client/react-native/mobile/ios/berty/BertyCentralManager.h new file mode 100644 index 0000000000..e121989b5b --- /dev/null +++ b/client/react-native/mobile/ios/berty/BertyCentralManager.h @@ -0,0 +1,36 @@ +// +// BertyCentralManager.h +// bluetooth +// +// Created by sacha on 05/09/2018. +// Copyright © 2018 Facebook. All rights reserved. +// + +#import +#import +#import +#import "BertyPeripheral.h" +#import "BertyDevice.h" + +@interface BertyCentralManager : NSObject + +@property (nonatomic, strong) NSMutableDictionary *connectedDevice; +@property (nonatomic, strong) NSMutableDictionary *discoveredDevice; +@property (nonatomic, strong) CBCentralManager *centralManager; +@property (nonatomic, strong) CBPeripheralManager *peripheralManager; +@property (nonatomic, strong) CBMutableService *bertyService; +@property (nonatomic, strong) CBMutableCharacteristic *bertyReaderCharacteristic; +@property (nonatomic, strong) CBMutableCharacteristic *bertyCounterReaderCharacteristic; +@property (nonatomic, strong) CBUUID *serviceUUID; +@property (nonatomic, strong) CBUUID *readerUUID; +@property (nonatomic, strong) CBUUID *readerCounterUUID; +@property (nonatomic, weak) id sender; + +- (instancetype)initWithSender:(id)sender; +- (void)discover; +- (void)connect:(NSString *)name; +- (void)writeTo:(NSString *)addr msg:(NSString *)msg; +- (void)subscribe; +- (void) updateValue ; +@end + diff --git a/client/react-native/mobile/ios/berty/BertyCentralManager.m b/client/react-native/mobile/ios/berty/BertyCentralManager.m new file mode 100644 index 0000000000..e121989b5b --- /dev/null +++ b/client/react-native/mobile/ios/berty/BertyCentralManager.m @@ -0,0 +1,36 @@ +// +// BertyCentralManager.h +// bluetooth +// +// Created by sacha on 05/09/2018. +// Copyright © 2018 Facebook. All rights reserved. +// + +#import +#import +#import +#import "BertyPeripheral.h" +#import "BertyDevice.h" + +@interface BertyCentralManager : NSObject + +@property (nonatomic, strong) NSMutableDictionary *connectedDevice; +@property (nonatomic, strong) NSMutableDictionary *discoveredDevice; +@property (nonatomic, strong) CBCentralManager *centralManager; +@property (nonatomic, strong) CBPeripheralManager *peripheralManager; +@property (nonatomic, strong) CBMutableService *bertyService; +@property (nonatomic, strong) CBMutableCharacteristic *bertyReaderCharacteristic; +@property (nonatomic, strong) CBMutableCharacteristic *bertyCounterReaderCharacteristic; +@property (nonatomic, strong) CBUUID *serviceUUID; +@property (nonatomic, strong) CBUUID *readerUUID; +@property (nonatomic, strong) CBUUID *readerCounterUUID; +@property (nonatomic, weak) id sender; + +- (instancetype)initWithSender:(id)sender; +- (void)discover; +- (void)connect:(NSString *)name; +- (void)writeTo:(NSString *)addr msg:(NSString *)msg; +- (void)subscribe; +- (void) updateValue ; +@end + diff --git a/client/react-native/mobile/ios/berty/BertyDevice.h b/client/react-native/mobile/ios/berty/BertyDevice.h new file mode 100644 index 0000000000..4555b3d258 --- /dev/null +++ b/client/react-native/mobile/ios/berty/BertyDevice.h @@ -0,0 +1,25 @@ +// +// BertyDevice.h +// bluetooth +// +// Created by sacha on 18/09/2018. +// Copyright © 2018 Facebook. All rights reserved. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface BertyDevice : NSObject + +@property (nonatomic, readwrite, strong) NSMutableData *data; +@property (atomic, readwrite, assign) int counter; +@property (nonatomic, readwrite, strong) CBPeripheral *peripheral; + +- (instancetype)initWithPeripheral:(CBPeripheral *)peripheral; +- (void)inc; + +@end + +NS_ASSUME_NONNULL_END diff --git a/client/react-native/mobile/ios/berty/BertyDevice.m b/client/react-native/mobile/ios/berty/BertyDevice.m new file mode 100644 index 0000000000..e5584c7279 --- /dev/null +++ b/client/react-native/mobile/ios/berty/BertyDevice.m @@ -0,0 +1,30 @@ +// +// BertyDevice.m +// bluetooth +// +// Created by sacha on 18/09/2018. +// Copyright © 2018 Facebook. All rights reserved. +// + +#import "BertyDevice.h" + +#import + +@implementation BertyDevice + +- (instancetype)initWithPeripheral:(CBPeripheral *)peripheral { + self = [super init]; + self.peripheral = peripheral; + self.data = [[NSMutableData alloc]init]; + self.counter = 0; + RCTLogInfo(@"testttttttttttttttttttttttt"); + return self; +} + +- (void)inc { + RCTLogInfo(@"ci 123 %d", self.counter); + self.counter++; + RCTLogInfo(@"ci 123 %d", self.counter); +} + +@end From dccddf49131539d101c23b4ff61f80631fa5c8f5 Mon Sep 17 00:00:00 2001 From: Sacha Froment Date: Tue, 18 Sep 2018 21:22:36 +0200 Subject: [PATCH 2/4] fix(ios): fix bad cp Signed-off-by: Sacha Froment --- .../mobile/ios/berty/BertyCentralManager.m | 355 ++++++++++++++++-- .../mobile/ios/berty/BertyDevice.h | 1 - .../mobile/ios/berty/BertyDevice.m | 7 - 3 files changed, 327 insertions(+), 36 deletions(-) diff --git a/client/react-native/mobile/ios/berty/BertyCentralManager.m b/client/react-native/mobile/ios/berty/BertyCentralManager.m index e121989b5b..3c55284f26 100644 --- a/client/react-native/mobile/ios/berty/BertyCentralManager.m +++ b/client/react-native/mobile/ios/berty/BertyCentralManager.m @@ -1,36 +1,335 @@ // -// BertyCentralManager.h +// BertyCentralManager.m // bluetooth // // Created by sacha on 05/09/2018. // Copyright © 2018 Facebook. All rights reserved. // -#import -#import -#import -#import "BertyPeripheral.h" -#import "BertyDevice.h" - -@interface BertyCentralManager : NSObject - -@property (nonatomic, strong) NSMutableDictionary *connectedDevice; -@property (nonatomic, strong) NSMutableDictionary *discoveredDevice; -@property (nonatomic, strong) CBCentralManager *centralManager; -@property (nonatomic, strong) CBPeripheralManager *peripheralManager; -@property (nonatomic, strong) CBMutableService *bertyService; -@property (nonatomic, strong) CBMutableCharacteristic *bertyReaderCharacteristic; -@property (nonatomic, strong) CBMutableCharacteristic *bertyCounterReaderCharacteristic; -@property (nonatomic, strong) CBUUID *serviceUUID; -@property (nonatomic, strong) CBUUID *readerUUID; -@property (nonatomic, strong) CBUUID *readerCounterUUID; -@property (nonatomic, weak) id sender; - -- (instancetype)initWithSender:(id)sender; -- (void)discover; -- (void)connect:(NSString *)name; -- (void)writeTo:(NSString *)addr msg:(NSString *)msg; -- (void)subscribe; -- (void) updateValue ; -@end +#import +#import "BertyCentralManager.h" + +@implementation BertyCentralManager + +NSString* const SERVICE_UUID = @"A06C6AB8-886F-4D56-82FC-2CF8610D6663"; + +NSString* const READER_UUID = @"000CBD77-8D30-4EFF-9ADD-AC5F10C2CC1C"; + +NSString* const READER_COUNTER_UUID = @"A88D3BEC-7A22-477A-97CC-2E0F784CB517"; + +- (instancetype)initWithSender:(id)sender { + self = [super init]; + if (self) { + self.connectedDevice = [[NSMutableDictionary alloc] init]; + self.discoveredDevice = [[NSMutableDictionary alloc] init]; + self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:@{CBCentralManagerOptionShowPowerAlertKey:[NSNumber numberWithBool:YES]}]; + self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil options:@{CBPeripheralManagerOptionShowPowerAlertKey:[NSNumber numberWithBool:YES]}]; + self.serviceUUID = [CBUUID UUIDWithString:SERVICE_UUID]; + self.readerUUID = [CBUUID UUIDWithString:READER_UUID]; + self.readerCounterUUID = [CBUUID UUIDWithString:READER_COUNTER_UUID]; + self.bertyService = [[CBMutableService alloc] initWithType:self.serviceUUID primary:YES]; + self.bertyReaderCharacteristic = [[CBMutableCharacteristic alloc] initWithType:self.readerUUID properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable]; + self.bertyCounterReaderCharacteristic = [[CBMutableCharacteristic alloc] initWithType:self.readerCounterUUID properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable];; + self.sender = sender; + + self.bertyService.characteristics = @[self.bertyReaderCharacteristic, self.bertyCounterReaderCharacteristic]; + + [self centralManagerDidUpdateState:self.centralManager]; + } + return self; + } + +- (void)discover { + RCTLogInfo(@"Start dicovering"); + [self.centralManager scanForPeripheralsWithServices: @[self.serviceUUID] options:nil]; +} + +- (void) connect { + +} + +- (CBCharacteristic *)characteristicWithUUID:(CBUUID *)characteristicUUID forServiceUUID:(CBUUID *)serviceUUID inPeripheral:(CBPeripheral *)peripheral { + for (CBService *service in peripheral.services) { + if ([service.UUID isEqual:serviceUUID]) { + for (CBCharacteristic *characteristic in service.characteristics) { + if ([characteristic.UUID isEqual:characteristicUUID]) { + return characteristic; + } + } + } + } + return nil; +} + +- (CBService *)serviceWithUUID:(CBUUID *)serviceUUID forPeripheral:(CBPeripheral *)peripheral { + for (CBService *service in peripheral.services) { + if ([service.UUID isEqual:serviceUUID]) { + return service; + } + } + return nil; +} + +- (void)centralManager:(CBCentralManager *)central + didConnectPeripheral:(CBPeripheral *)peripheral { + RCTLogInfo(@"didConnectPeriheral: %@", [peripheral.identifier UUIDString]); + [self.connectedDevice setValue:[[BertyDevice alloc] initWithPeripheral:peripheral] forKey:[peripheral.identifier UUIDString]]; + [peripheral setDelegate:self]; + [peripheral discoverServices:@[self.serviceUUID]]; +} + +- (void)centralManager:(CBCentralManager *)central +didDisconnectPeripheral:(CBPeripheral *)peripheral + error:(NSError *)error { + RCTLogInfo(@"didDisConnectPeriheral: %@", [peripheral.identifier UUIDString]); +} + +- (void)centralManager:(CBCentralManager *)central +didFailToConnectPeripheral:(CBPeripheral *)peripheral + error:(NSError *)error { + if (error) { + RCTLogWarn(@"error %@", [error localizedFailureReason]); + } + RCTLogWarn(@"error connecting to: %@", [peripheral.identifier UUIDString]); +} + +- (void)centralManager:(CBCentralManager *)central + didDiscoverPeripheral:(CBPeripheral *)peripheral + advertisementData:(NSDictionary *)advertisementData + RSSI:(NSNumber *)RSSI { + RCTLogInfo(@"didDiscoverPeripheral: %@", [peripheral.identifier UUIDString]); + if (![self.discoveredDevice objectForKey:peripheral.identifier]) { + [self.discoveredDevice setObject:peripheral forKey:peripheral.identifier]; + } + [peripheral setDelegate:self]; + [self.centralManager connectPeripheral:peripheral options:nil]; +} + +- (void)centralManagerDidUpdateState:(CBCentralManager *)central { + NSString *stateString = nil; + switch(self.centralManager.state) + { + case CBCentralManagerStateResetting: + break; + case CBCentralManagerStateUnsupported: + break; + case CBCentralManagerStateUnauthorized: + break; + case CBCentralManagerStatePoweredOff: + stateString = @"Bluetooth is currently powered off."; + break; + case CBCentralManagerStatePoweredOn: + stateString = @"Bluetooth is currently powered on and available to use."; + if (self.peripheralManager.state == CBPeripheralManagerStatePoweredOn) { + [self.peripheralManager addService:self.bertyService]; + } + break; + default: + stateString = @"State unknown, update imminent."; + break; + } + + RCTLogInfo(@"Bluetooth State %@",stateString); +} + +- (void)peripheral:(CBPeripheral *)peripheral +didDiscoverServices:(NSError *)error { + RCTLogInfo(@"didDiscoverServices %@", [peripheral.identifier UUIDString]); + for (CBService* service in peripheral.services) { + [peripheral discoverCharacteristics:@[READER_COUNTER_UUID] forService:service]; + } +} + +- (void)peripheral:(CBPeripheral *)peripheral +didDiscoverIncludedServicesForService:(CBService *)service + error:(NSError *)error { + RCTLogInfo(@"didDiscoverIncludedServicesForService"); +} + +- (void)peripheral:(CBPeripheral *)peripheral +didDiscoverCharacteristicsForService:(CBService *)service + error:(NSError *)error { + if (error == nil) { + for (CBCharacteristic *characteristic in service.characteristics) { + if ([characteristic.UUID isEqual:self.readerCounterUUID] && characteristic.isNotifying == false) { + [peripheral setNotifyValue:YES forCharacteristic:characteristic]; + [peripheral discoverCharacteristics:@[READER_UUID] forService:service]; + } else if ([characteristic.UUID isEqual:self.readerUUID] && characteristic.isNotifying == false) { + [peripheral setNotifyValue:YES forCharacteristic:characteristic]; + } + } + } + RCTLog(@"didDiscoverCharacteristicsForService %@ %@", [peripheral.identifier UUIDString], [service.UUID UUIDString]); +} + +- (void)peripheral:(CBPeripheral *)peripheral +didDiscoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic + error:(NSError *)error { + RCTLogInfo(@"didDiscoverDescriptorsForCharacteristic %@", [characteristic.UUID UUIDString]); + if (error) { + RCTLogWarn(@"error: %@", [error localizedFailureReason]); + } +} + +- (void)peripheral:(CBPeripheral *)peripheral +didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic + error:(NSError *)error { + if (error) { + RCTLogWarn(@"error: %@", [error localizedDescription]); + } + RCTLogInfo(@"didUpdateValueForCharacteristic %@", [characteristic.UUID UUIDString]); +} +- (void)peripheral:(CBPeripheral *)peripheral +didUpdateValueForDescriptor:(CBDescriptor *)descriptor + error:(NSError *)error { + if (error) { + RCTLogWarn(@"error: %@", [error localizedFailureReason]); + } + RCTLogInfo(@"didUpdateValueForDescriptor %@", [descriptor.UUID UUIDString]); +} + +- (void)peripheral:(CBPeripheral *)peripheral +didWriteValueForCharacteristic:(CBCharacteristic *)characteristic + error:(NSError *)error { + if (error) { + RCTLogWarn(@"error: %@", [error localizedFailureReason]); + } + RCTLogInfo(@"didWriteValueForCharacteristic %@", characteristic.UUID); +} + +- (void)peripheral:(CBPeripheral *)peripheral +didWriteValueForDescriptor:(CBDescriptor *)descriptor + error:(NSError *)error { + if (error) { + RCTLogWarn(@"error: %@", [error localizedFailureReason]); + } + RCTLogInfo(@"didWriteValueForDescriptor %@", descriptor.UUID); +} + +- (void)peripheral:(CBPeripheral *)peripheral +didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic + error:(NSError *)error { + if (error) { + RCTLogWarn(@"error: %@", [error localizedFailureReason]); + } + RCTLogInfo(@"didUpdateNotificationStateForCharacteristic %@", [characteristic.UUID UUIDString]); +} + +- (void)peripheral:(CBPeripheral *)peripheral + didReadRSSI:(NSNumber *)RSSI + error:(NSError *)error { + if (error) { + RCTLogWarn(@"error: %@", [error localizedDescription]); + } + RCTLogInfo(@"didReadRSSI"); +} + +- (void)peripheralDidUpdateName:(CBPeripheral *)peripheral { + RCTLogInfo(@"peripheralDidUpdateName: %@", [peripheral.identifier UUIDString]); +} + +- (void)peripheral:(CBPeripheral *)peripheral + didModifyServices:(NSArray *)invalidatedServices { + RCTLogInfo(@"didModifyServices"); +} + +- (void)peripheral:(CBPeripheral *)peripheral +didOpenL2CAPChannel:(CBL2CAPChannel *)channel + error:(NSError *)error { + RCTLogInfo(@"didOpenL2CAPChannel"); +} + +- (void)peripheralIsReadyToSendWriteWithoutResponse:(CBPeripheral *)peripheral { + RCTLogInfo(@"peripheralIsReadyToSendWriteWithoutResponse"); +} + +- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral { + NSString *stateString = nil; + switch(self.peripheralManager.state) + { + case CBManagerStateUnknown: + stateString = @"CBManagerStateUnknown"; + break; + case CBManagerStateResetting: + stateString = @"CBManagerStateResetting"; + break; + case CBManagerStateUnsupported: + stateString = @"CBManagerStateUnsupported"; + break; + case CBManagerStateUnauthorized: + stateString = @"CBManagerStateUnauthorized"; + break; + case CBManagerStatePoweredOff: + stateString = @"CBManagerStatePoweredOff"; + break; + case CBManagerStatePoweredOn: + stateString = @"CBManagerStatePoweredOn"; + if (self.centralManager.state == CBCentralManagerStatePoweredOn) { + [self.peripheralManager addService:self.bertyService]; + } + break; + default: + stateString = @"State unknown, update imminent."; + break; + } + + RCTLogInfo(@"State change peripheral manager: %@", stateString); +} + +- (void)peripheralManager:(CBPeripheralManager *)peripheral + willRestoreState:(NSDictionary *)dict { + RCTLogInfo(@"Will restore State invoked"); +} + +- (void)peripheralManager:(CBPeripheralManager *)peripheral + didAddService:(CBService *)service + error:(NSError *)error { + if (error) { + RCTLogWarn(@"fdp: %@", [error localizedFailureReason]); + } + RCTLogInfo(@"service added: %@", [service.UUID UUIDString]); + [self.peripheralManager startAdvertising:@{ + CBAdvertisementDataServiceUUIDsKey:@[self.serviceUUID] + }]; +} + +- (void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheral + error:(NSError *)error { + if (error) { + RCTLogWarn(@"error: %@", [error localizedFailureReason]); + } + RCTLogInfo(@"peripheral start advertising %d", [peripheral isAdvertising]); +} + +- (void)peripheralManager:(CBPeripheralManager *)peripheral + central:(CBCentral *)central +didSubscribeToCharacteristic:(CBCharacteristic *)characteristic { + RCTLogInfo(@"Subscription to characteristic: %@", characteristic.UUID); +} + +- (void)peripheralManager:(CBPeripheralManager *)peripheral + central:(CBCentral *)central +didUnsubscribeFromCharacteristic:(CBCharacteristic *)characteristic { + RCTLogInfo(@"Unsubscribed to characteristic: %@", characteristic.UUID); +} + +- (void)peripheralManagerIsReadyToUpdateSubscribers:(CBPeripheralManager *)peripheral { + RCTLogInfo(@"peripheralManagerIsReadyToUpdateSubscribers"); +} + +- (void)peripheralManager:(CBPeripheralManager *)peripheral + didReceiveReadRequest:(CBATTRequest *)request { + RCTLogInfo(@"request read %@", request); +} + +- (void)peripheralManager:(CBPeripheralManager *)peripheral + didReceiveWriteRequests:(NSArray *)requests { + RCTLogInfo(@"request write %@", requests); +} + +- (void)discoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic { + RCTLogInfo(@"disco for charact %@", characteristic.UUID); +} + +@end diff --git a/client/react-native/mobile/ios/berty/BertyDevice.h b/client/react-native/mobile/ios/berty/BertyDevice.h index 4555b3d258..8676b3766d 100644 --- a/client/react-native/mobile/ios/berty/BertyDevice.h +++ b/client/react-native/mobile/ios/berty/BertyDevice.h @@ -18,7 +18,6 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readwrite, strong) CBPeripheral *peripheral; - (instancetype)initWithPeripheral:(CBPeripheral *)peripheral; -- (void)inc; @end diff --git a/client/react-native/mobile/ios/berty/BertyDevice.m b/client/react-native/mobile/ios/berty/BertyDevice.m index e5584c7279..190d706dd1 100644 --- a/client/react-native/mobile/ios/berty/BertyDevice.m +++ b/client/react-native/mobile/ios/berty/BertyDevice.m @@ -17,14 +17,7 @@ - (instancetype)initWithPeripheral:(CBPeripheral *)peripheral { self.peripheral = peripheral; self.data = [[NSMutableData alloc]init]; self.counter = 0; - RCTLogInfo(@"testttttttttttttttttttttttt"); return self; } -- (void)inc { - RCTLogInfo(@"ci 123 %d", self.counter); - self.counter++; - RCTLogInfo(@"ci 123 %d", self.counter); -} - @end From 75a302a65a948488a05047d92cc0555949211fd7 Mon Sep 17 00:00:00 2001 From: Sacha Froment Date: Wed, 19 Sep 2018 11:40:09 +0200 Subject: [PATCH 3/4] feat(ios): add data chunck concat Signed-off-by: Sacha Froment --- .../mobile/ios/berty/BertyCentralManager.h | 1 + .../mobile/ios/berty/BertyCentralManager.m | 39 +++++++++++++++++-- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/client/react-native/mobile/ios/berty/BertyCentralManager.h b/client/react-native/mobile/ios/berty/BertyCentralManager.h index e121989b5b..7b5c657408 100644 --- a/client/react-native/mobile/ios/berty/BertyCentralManager.h +++ b/client/react-native/mobile/ios/berty/BertyCentralManager.h @@ -24,6 +24,7 @@ @property (nonatomic, strong) CBUUID *serviceUUID; @property (nonatomic, strong) CBUUID *readerUUID; @property (nonatomic, strong) CBUUID *readerCounterUUID; +@property (nonatomic, strong) NSMutableArray* toSend; @property (nonatomic, weak) id sender; - (instancetype)initWithSender:(id)sender; diff --git a/client/react-native/mobile/ios/berty/BertyCentralManager.m b/client/react-native/mobile/ios/berty/BertyCentralManager.m index 3c55284f26..6b4692d34f 100644 --- a/client/react-native/mobile/ios/berty/BertyCentralManager.m +++ b/client/react-native/mobile/ios/berty/BertyCentralManager.m @@ -48,6 +48,28 @@ - (void) connect { } +-(void)sendWhatsLeft { + NSMutableArray *toRemove = [[NSMutableArray alloc] initWithCapacity:[self.toSend count]]; + + for (NSData *str in self.toSend) { + if ([self.peripheralManager updateValue:str forCharacteristic:self.bertyReaderCharacteristic onSubscribedCentrals:nil] == YES) { + [toRemove addObject:str]; + } else { + break; + } + } + + for (NSData *str in toRemove) { + [self.toSend removeObject:str]; + } +} + +- (void) updateValue { + self.toSend = [NSMutableArray arrayWithArray:@[[@"part1" dataUsingEncoding:NSUTF8StringEncoding], [@"part2" dataUsingEncoding:NSUTF8StringEncoding], [@"" dataUsingEncoding:NSUTF8StringEncoding]]]; + + [self sendWhatsLeft]; +} + - (CBCharacteristic *)characteristicWithUUID:(CBUUID *)characteristicUUID forServiceUUID:(CBUUID *)serviceUUID inPeripheral:(CBPeripheral *)peripheral { for (CBService *service in peripheral.services) { if ([service.UUID isEqual:serviceUUID]) { @@ -136,7 +158,7 @@ - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error { RCTLogInfo(@"didDiscoverServices %@", [peripheral.identifier UUIDString]); for (CBService* service in peripheral.services) { - [peripheral discoverCharacteristics:@[READER_COUNTER_UUID] forService:service]; + [peripheral discoverCharacteristics:@[self.readerCounterUUID] forService:service]; } } @@ -149,17 +171,18 @@ - (void)peripheral:(CBPeripheral *)peripheral - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error { + RCTLog(@"didDiscoverCharacteristicsForService %@ %@", [peripheral.identifier UUIDString], [service.UUID UUIDString]); if (error == nil) { for (CBCharacteristic *characteristic in service.characteristics) { if ([characteristic.UUID isEqual:self.readerCounterUUID] && characteristic.isNotifying == false) { [peripheral setNotifyValue:YES forCharacteristic:characteristic]; - [peripheral discoverCharacteristics:@[READER_UUID] forService:service]; + [peripheral discoverCharacteristics:@[self.readerUUID] forService:service]; } else if ([characteristic.UUID isEqual:self.readerUUID] && characteristic.isNotifying == false) { [peripheral setNotifyValue:YES forCharacteristic:characteristic]; } } } - RCTLog(@"didDiscoverCharacteristicsForService %@ %@", [peripheral.identifier UUIDString], [service.UUID UUIDString]); + } - (void)peripheral:(CBPeripheral *)peripheral @@ -177,7 +200,14 @@ - (void)peripheral:(CBPeripheral *)peripheral if (error) { RCTLogWarn(@"error: %@", [error localizedDescription]); } - RCTLogInfo(@"didUpdateValueForCharacteristic %@", [characteristic.UUID UUIDString]); + if (characteristic.value != nil) { + BertyDevice *device = [self.connectedDevice objectForKey:[peripheral.identifier UUIDString]]; + if ([characteristic.value bytes] == nil || ((char*)[characteristic.value bytes])[0] == 0) { + RCTLogInfo(@"didUpdateValueForCharacteristic %@ %@", [characteristic.UUID UUIDString], [[NSString alloc] initWithData:device.data encoding:NSUTF8StringEncoding]); + } else if (device != nil) { + [device.data appendData:characteristic.value]; + } + } } - (void)peripheral:(CBPeripheral *)peripheral @@ -316,6 +346,7 @@ - (void)peripheralManager:(CBPeripheralManager *)peripheral - (void)peripheralManagerIsReadyToUpdateSubscribers:(CBPeripheralManager *)peripheral { RCTLogInfo(@"peripheralManagerIsReadyToUpdateSubscribers"); + [self sendWhatsLeft]; } - (void)peripheralManager:(CBPeripheralManager *)peripheral From abf8958941a0b6020bc30625197a29d7dcd1589d Mon Sep 17 00:00:00 2001 From: Sacha Froment Date: Thu, 20 Sep 2018 14:24:04 +0200 Subject: [PATCH 4/4] fix(ios): fix ci Signed-off-by: Sacha Froment --- .editorconfig | 3 + .../mobile/ios/berty/BertyCentralManager.m | 118 ++++++------- .../mobile/ios/berty/BertyDevice.h | 24 --- .../mobile/ios/berty/BertyDevice.m | 23 --- .../mobile/ios/berty/BertyPeripheral.h | 22 +++ .../mobile/ios/berty/BertyPeripheral.m | 159 ++++++++++++++++++ 6 files changed, 245 insertions(+), 104 deletions(-) delete mode 100644 client/react-native/mobile/ios/berty/BertyDevice.h delete mode 100644 client/react-native/mobile/ios/berty/BertyDevice.m create mode 100644 client/react-native/mobile/ios/berty/BertyPeripheral.h create mode 100644 client/react-native/mobile/ios/berty/BertyPeripheral.m diff --git a/.editorconfig b/.editorconfig index 0551f56eaf..16cc98d9bd 100644 --- a/.editorconfig +++ b/.editorconfig @@ -42,3 +42,6 @@ indent_size = 2 [*.diff] indent_size = 1 + +[*.m] +indent_size = 2 diff --git a/client/react-native/mobile/ios/berty/BertyCentralManager.m b/client/react-native/mobile/ios/berty/BertyCentralManager.m index 6b4692d34f..2fd560df0f 100644 --- a/client/react-native/mobile/ios/berty/BertyCentralManager.m +++ b/client/react-native/mobile/ios/berty/BertyCentralManager.m @@ -19,25 +19,23 @@ @implementation BertyCentralManager - (instancetype)initWithSender:(id)sender { self = [super init]; - if (self) { - self.connectedDevice = [[NSMutableDictionary alloc] init]; - self.discoveredDevice = [[NSMutableDictionary alloc] init]; - self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:@{CBCentralManagerOptionShowPowerAlertKey:[NSNumber numberWithBool:YES]}]; - self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil options:@{CBPeripheralManagerOptionShowPowerAlertKey:[NSNumber numberWithBool:YES]}]; - self.serviceUUID = [CBUUID UUIDWithString:SERVICE_UUID]; - self.readerUUID = [CBUUID UUIDWithString:READER_UUID]; - self.readerCounterUUID = [CBUUID UUIDWithString:READER_COUNTER_UUID]; - self.bertyService = [[CBMutableService alloc] initWithType:self.serviceUUID primary:YES]; - self.bertyReaderCharacteristic = [[CBMutableCharacteristic alloc] initWithType:self.readerUUID properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable]; - self.bertyCounterReaderCharacteristic = [[CBMutableCharacteristic alloc] initWithType:self.readerCounterUUID properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable];; - self.sender = sender; - - self.bertyService.characteristics = @[self.bertyReaderCharacteristic, self.bertyCounterReaderCharacteristic]; - - [self centralManagerDidUpdateState:self.centralManager]; - } - return self; + if (self) { + self.connectedDevice = [[NSMutableDictionary alloc] init]; + self.discoveredDevice = [[NSMutableDictionary alloc] init]; + self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:@{CBCentralManagerOptionShowPowerAlertKey:[NSNumber numberWithBool:YES]}]; + self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil options:@{CBPeripheralManagerOptionShowPowerAlertKey:[NSNumber numberWithBool:YES]}]; + self.serviceUUID = [CBUUID UUIDWithString:SERVICE_UUID]; + self.readerUUID = [CBUUID UUIDWithString:READER_UUID]; + self.readerCounterUUID = [CBUUID UUIDWithString:READER_COUNTER_UUID]; + self.bertyService = [[CBMutableService alloc] initWithType:self.serviceUUID primary:YES]; + self.bertyReaderCharacteristic = [[CBMutableCharacteristic alloc] initWithType:self.readerUUID properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable]; + self.bertyCounterReaderCharacteristic = [[CBMutableCharacteristic alloc] initWithType:self.readerCounterUUID properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable];; + self.sender = sender; + self.bertyService.characteristics = @[self.bertyReaderCharacteristic, self.bertyCounterReaderCharacteristic]; + [self centralManagerDidUpdateState:self.centralManager]; } + return self; +} - (void)discover { RCTLogInfo(@"Start dicovering"); @@ -45,12 +43,10 @@ - (void)discover { } - (void) connect { - } -(void)sendWhatsLeft { NSMutableArray *toRemove = [[NSMutableArray alloc] initWithCapacity:[self.toSend count]]; - for (NSData *str in self.toSend) { if ([self.peripheralManager updateValue:str forCharacteristic:self.bertyReaderCharacteristic onSubscribedCentrals:nil] == YES) { [toRemove addObject:str]; @@ -58,7 +54,7 @@ -(void)sendWhatsLeft { break; } } - + for (NSData *str in toRemove) { [self.toSend removeObject:str]; } @@ -86,9 +82,9 @@ - (CBCharacteristic *)characteristicWithUUID:(CBUUID *)characteristicUUID forSer - (CBService *)serviceWithUUID:(CBUUID *)serviceUUID forPeripheral:(CBPeripheral *)peripheral { for (CBService *service in peripheral.services) { if ([service.UUID isEqual:serviceUUID]) { - return service; - } - } + return service; + } + } return nil; } @@ -102,13 +98,13 @@ - (void)centralManager:(CBCentralManager *)central - (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral - error:(NSError *)error { + error:(NSError *)error { RCTLogInfo(@"didDisConnectPeriheral: %@", [peripheral.identifier UUIDString]); } - (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral - error:(NSError *)error { + error:(NSError *)error { if (error) { RCTLogWarn(@"error %@", [error localizedFailureReason]); } @@ -116,9 +112,9 @@ - (void)centralManager:(CBCentralManager *)central } - (void)centralManager:(CBCentralManager *)central - didDiscoverPeripheral:(CBPeripheral *)peripheral - advertisementData:(NSDictionary *)advertisementData - RSSI:(NSNumber *)RSSI { + didDiscoverPeripheral:(CBPeripheral *)peripheral + advertisementData:(NSDictionary *)advertisementData + RSSI:(NSNumber *)RSSI { RCTLogInfo(@"didDiscoverPeripheral: %@", [peripheral.identifier UUIDString]); if (![self.discoveredDevice objectForKey:peripheral.identifier]) { [self.discoveredDevice setObject:peripheral forKey:peripheral.identifier]; @@ -155,39 +151,46 @@ - (void)centralManagerDidUpdateState:(CBCentralManager *)central { } - (void)peripheral:(CBPeripheral *)peripheral -didDiscoverServices:(NSError *)error { + didDiscoverServices:(NSError *)error { RCTLogInfo(@"didDiscoverServices %@", [peripheral.identifier UUIDString]); for (CBService* service in peripheral.services) { - [peripheral discoverCharacteristics:@[self.readerCounterUUID] forService:service]; + [peripheral discoverCharacteristics:nil forService:service]; } } - (void)peripheral:(CBPeripheral *)peripheral didDiscoverIncludedServicesForService:(CBService *)service - error:(NSError *)error { + error:(NSError *)error { RCTLogInfo(@"didDiscoverIncludedServicesForService"); } - (void)peripheral:(CBPeripheral *)peripheral -didDiscoverCharacteristicsForService:(CBService *)service - error:(NSError *)error { + didDiscoverCharacteristicsForService:(CBService *)service + error:(NSError *)error { RCTLog(@"didDiscoverCharacteristicsForService %@ %@", [peripheral.identifier UUIDString], [service.UUID UUIDString]); if (error == nil) { + RCTLog(@"ICI123"); for (CBCharacteristic *characteristic in service.characteristics) { + RCTLog(@"ICI123 %@", [characteristic.UUID UUIDString]); if ([characteristic.UUID isEqual:self.readerCounterUUID] && characteristic.isNotifying == false) { - [peripheral setNotifyValue:YES forCharacteristic:characteristic]; + // [peripheral setNotifyValue:YES forCharacteristic:characteristic]; + RCTLog(@"ICI"); [peripheral discoverCharacteristics:@[self.readerUUID] forService:service]; + } else if ([characteristic.UUID isEqual:self.readerUUID] && characteristic.isNotifying == false) { + RCTLog(@"LA"); [peripheral setNotifyValue:YES forCharacteristic:characteristic]; } } + } else { + RCTLogWarn(@"error discovering %@ %@", [error localizedFailureReason], [error localizedDescription]); } - + } - (void)peripheral:(CBPeripheral *)peripheral -didDiscoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic - error:(NSError *)error { + didDiscoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic + error:(NSError *)error { RCTLogInfo(@"didDiscoverDescriptorsForCharacteristic %@", [characteristic.UUID UUIDString]); if (error) { RCTLogWarn(@"error: %@", [error localizedFailureReason]); @@ -195,8 +198,8 @@ - (void)peripheral:(CBPeripheral *)peripheral } - (void)peripheral:(CBPeripheral *)peripheral -didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic - error:(NSError *)error { + didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic + error:(NSError *)error { if (error) { RCTLogWarn(@"error: %@", [error localizedDescription]); } @@ -204,6 +207,7 @@ - (void)peripheral:(CBPeripheral *)peripheral BertyDevice *device = [self.connectedDevice objectForKey:[peripheral.identifier UUIDString]]; if ([characteristic.value bytes] == nil || ((char*)[characteristic.value bytes])[0] == 0) { RCTLogInfo(@"didUpdateValueForCharacteristic %@ %@", [characteristic.UUID UUIDString], [[NSString alloc] initWithData:device.data encoding:NSUTF8StringEncoding]); + [device.data setLength:0]; } else if (device != nil) { [device.data appendData:characteristic.value]; } @@ -211,8 +215,8 @@ - (void)peripheral:(CBPeripheral *)peripheral } - (void)peripheral:(CBPeripheral *)peripheral -didUpdateValueForDescriptor:(CBDescriptor *)descriptor - error:(NSError *)error { + didUpdateValueForDescriptor:(CBDescriptor *)descriptor + error:(NSError *)error { if (error) { RCTLogWarn(@"error: %@", [error localizedFailureReason]); } @@ -221,7 +225,7 @@ - (void)peripheral:(CBPeripheral *)peripheral - (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic - error:(NSError *)error { + error:(NSError *)error { if (error) { RCTLogWarn(@"error: %@", [error localizedFailureReason]); } @@ -230,7 +234,7 @@ - (void)peripheral:(CBPeripheral *)peripheral - (void)peripheral:(CBPeripheral *)peripheral didWriteValueForDescriptor:(CBDescriptor *)descriptor - error:(NSError *)error { + error:(NSError *)error { if (error) { RCTLogWarn(@"error: %@", [error localizedFailureReason]); } @@ -239,7 +243,7 @@ - (void)peripheral:(CBPeripheral *)peripheral - (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic - error:(NSError *)error { + error:(NSError *)error { if (error) { RCTLogWarn(@"error: %@", [error localizedFailureReason]); } @@ -247,8 +251,8 @@ - (void)peripheral:(CBPeripheral *)peripheral } - (void)peripheral:(CBPeripheral *)peripheral - didReadRSSI:(NSNumber *)RSSI - error:(NSError *)error { + didReadRSSI:(NSNumber *)RSSI + error:(NSError *)error { if (error) { RCTLogWarn(@"error: %@", [error localizedDescription]); } @@ -260,13 +264,13 @@ - (void)peripheralDidUpdateName:(CBPeripheral *)peripheral { } - (void)peripheral:(CBPeripheral *)peripheral - didModifyServices:(NSArray *)invalidatedServices { + didModifyServices:(NSArray *)invalidatedServices { RCTLogInfo(@"didModifyServices"); } - (void)peripheral:(CBPeripheral *)peripheral didOpenL2CAPChannel:(CBL2CAPChannel *)channel - error:(NSError *)error { + error:(NSError *)error { RCTLogInfo(@"didOpenL2CAPChannel"); } @@ -308,24 +312,24 @@ - (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral { } - (void)peripheralManager:(CBPeripheralManager *)peripheral - willRestoreState:(NSDictionary *)dict { + willRestoreState:(NSDictionary *)dict { RCTLogInfo(@"Will restore State invoked"); } - (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service - error:(NSError *)error { + error:(NSError *)error { if (error) { - RCTLogWarn(@"fdp: %@", [error localizedFailureReason]); + RCTLogWarn(@"error: %@", [error localizedFailureReason]); } RCTLogInfo(@"service added: %@", [service.UUID UUIDString]); [self.peripheralManager startAdvertising:@{ - CBAdvertisementDataServiceUUIDsKey:@[self.serviceUUID] - }]; + CBAdvertisementDataServiceUUIDsKey:@[self.serviceUUID] + }]; } - (void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheral - error:(NSError *)error { + error:(NSError *)error { if (error) { RCTLogWarn(@"error: %@", [error localizedFailureReason]); } @@ -333,13 +337,13 @@ - (void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheral } - (void)peripheralManager:(CBPeripheralManager *)peripheral - central:(CBCentral *)central + central:(CBCentral *)central didSubscribeToCharacteristic:(CBCharacteristic *)characteristic { RCTLogInfo(@"Subscription to characteristic: %@", characteristic.UUID); } - (void)peripheralManager:(CBPeripheralManager *)peripheral - central:(CBCentral *)central + central:(CBCentral *)central didUnsubscribeFromCharacteristic:(CBCharacteristic *)characteristic { RCTLogInfo(@"Unsubscribed to characteristic: %@", characteristic.UUID); } diff --git a/client/react-native/mobile/ios/berty/BertyDevice.h b/client/react-native/mobile/ios/berty/BertyDevice.h deleted file mode 100644 index 8676b3766d..0000000000 --- a/client/react-native/mobile/ios/berty/BertyDevice.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// BertyDevice.h -// bluetooth -// -// Created by sacha on 18/09/2018. -// Copyright © 2018 Facebook. All rights reserved. -// - -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface BertyDevice : NSObject - -@property (nonatomic, readwrite, strong) NSMutableData *data; -@property (atomic, readwrite, assign) int counter; -@property (nonatomic, readwrite, strong) CBPeripheral *peripheral; - -- (instancetype)initWithPeripheral:(CBPeripheral *)peripheral; - -@end - -NS_ASSUME_NONNULL_END diff --git a/client/react-native/mobile/ios/berty/BertyDevice.m b/client/react-native/mobile/ios/berty/BertyDevice.m deleted file mode 100644 index 190d706dd1..0000000000 --- a/client/react-native/mobile/ios/berty/BertyDevice.m +++ /dev/null @@ -1,23 +0,0 @@ -// -// BertyDevice.m -// bluetooth -// -// Created by sacha on 18/09/2018. -// Copyright © 2018 Facebook. All rights reserved. -// - -#import "BertyDevice.h" - -#import - -@implementation BertyDevice - -- (instancetype)initWithPeripheral:(CBPeripheral *)peripheral { - self = [super init]; - self.peripheral = peripheral; - self.data = [[NSMutableData alloc]init]; - self.counter = 0; - return self; -} - -@end diff --git a/client/react-native/mobile/ios/berty/BertyPeripheral.h b/client/react-native/mobile/ios/berty/BertyPeripheral.h new file mode 100644 index 0000000000..abd2c67641 --- /dev/null +++ b/client/react-native/mobile/ios/berty/BertyPeripheral.h @@ -0,0 +1,22 @@ +// +// BertyPeripheral.h +// bluetooth +// +// Created by sacha on 14/09/2018. +// Copyright © 2018 Facebook. All rights reserved. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface BertyPeripheral : NSObject + +@property (strong, nonatomic) CBPeripheral *me; + +- (instancetype)initWithPeripheral:(CBPeripheral*)me; + +@end + +NS_ASSUME_NONNULL_END diff --git a/client/react-native/mobile/ios/berty/BertyPeripheral.m b/client/react-native/mobile/ios/berty/BertyPeripheral.m new file mode 100644 index 0000000000..11505492ed --- /dev/null +++ b/client/react-native/mobile/ios/berty/BertyPeripheral.m @@ -0,0 +1,159 @@ +// +// BertyPeripheral.m +// bluetooth +// +// Created by sacha on 14/09/2018. +// Copyright © 2018 Facebook. All rights reserved. +// + +#import "BertyPeripheral.h" +#import + +@implementation BertyPeripheral + +- (instancetype)initWithPeripheral:(CBPeripheral*)me { + self.me = me; + [me setDelegate:self]; + return self; +} + + +- (void)peripheral:(CBPeripheral *)peripheral +didDiscoverServices:(NSError *)error { + RCTLogInfo(@"didDiscoverServices %@", peripheral.services); + CBService *service; + if (error) { + RCTLogWarn(@"fdp: %@", [error localizedDescription]); + } + for (service in peripheral.services) { + [peripheral discoverCharacteristics:nil forService:service]; + // [peripheral read] + } +} + +- (void)peripheral:(CBPeripheral *)peripheral + didDiscoverIncludedServicesForService:(CBService *)service + error:(NSError *)error { + if (error) { + RCTLogWarn(@"fdp: %@", [error localizedDescription]); + } + RCTLogInfo(@"didDiscoverIncludedServicesForService"); +} + +- (void)peripheral:(CBPeripheral *)peripheral + didDiscoverCharacteristicsForService:(CBService *)service + error:(NSError *)error { + if (error) { + RCTLogWarn(@"fdp: %@", [error localizedDescription]); + } + // RCTLogInfo(@"didDiscoverCharacteristicsForService %@", service); + // RCTLogInfo(@"didDiscoverCharacteristicsForService %@", service.characteristics); + CBCharacteristic *characteristic; + for (characteristic in service.characteristics) { + // [peripheral setNotifyValue:true forCharacteristic:characteristic]; + // [peripheral readValueForCharacteristic:characteristic]; + [peripheral discoverDescriptorsForCharacteristic:characteristic]; + if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:@"0b89d2d4-0ea6-4141-86bb-0c5fb91ab14a"]]) { + RCTLogInfo(@"WRITE TO %@", characteristic.UUID); + [peripheral writeValue:[@"test" dataUsingEncoding:NSUTF8StringEncoding] forCharacteristic:characteristic type:CBCharacteristicWriteWithoutResponse]; + } + } +} + +- (void)peripheral:(CBPeripheral *)peripheral +didDiscoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic + error:(NSError *)error { + RCTLogInfo(@"didDiscoverDescriptorsForCharacteristic %@", characteristic.UUID); + RCTLogInfo(@"didDiscoverDescriptorsForCharacteristic %@", characteristic.descriptors); + if (error) { + RCTLogWarn(@"fdp: %@", [error localizedDescription]); + } + CBDescriptor *desc; + NSString *test = @"testtesttesttesttest1234"; + for (desc in characteristic.descriptors) { + // RCTLogInfo(@"GO); + // if (desc.) + // [peripheral writeValue:[test dataUsingEncoding:NSUTF8StringEncoding] forDescriptor:desc]; + } +} + +- (void)peripheral:(CBPeripheral *)peripheral +didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic + error:(NSError *)error { + if (error) { + RCTLogWarn(@"fdp: %@", [error localizedDescription]); + } + RCTLogInfo(@"didUpdateValueForCharacteristic %@", characteristic.UUID); + CBDescriptor *desc; + for (desc in characteristic.descriptors) { + // if (desc.) + // [peripheral writeValue:[test dataUsingEncoding:NSUTF8StringEncoding] forDescriptor:desc]; + } +} + +- (void)peripheral:(CBPeripheral *)peripheral +didUpdateValueForDescriptor:(CBDescriptor *)descriptor + error:(NSError *)error { + RCTLogInfo(@"didUpdateValueForDescriptor %@", descriptor.UUID); + [peripheral readValueForDescriptor:descriptor]; + if (error) { + RCTLogWarn(@"fdp: %@", [error localizedDescription]); + } + RCTLogInfo(@"didDiscoverDescriptorsForCharacteristicsssss %@", descriptor.value); + // if (desc.) + // [peripheral writeValue:[test dataUsingEncoding:NSUTF8StringEncoding] forDescriptor:desc]; +} + +- (void)peripheral:(CBPeripheral *)peripheral +didWriteValueForCharacteristic:(CBCharacteristic *)characteristic + error:(NSError *)error { + if (error) { + RCTLogWarn(@"fdp: %@", [error localizedDescription]); + } + RCTLogInfo(@"didWriteValueForCharacteristic %@", characteristic.UUID); + // [peripheral setNotifyValue:true forCharacteristic:characteristic]; +} + +- (void)peripheral:(CBPeripheral *)peripheral +didWriteValueForDescriptor:(CBDescriptor *)descriptor + error:(NSError *)error { + if (error) { + RCTLogWarn(@"fdp: %@", [error localizedDescription]); + } + RCTLogInfo(@"didWriteValueForDescriptor %@", descriptor.UUID); +} + +- (void)peripheral:(CBPeripheral *)peripheral +didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic + error:(NSError *)error { + if (error) { + RCTLogWarn(@"fdp: %@", [error localizedDescription]); + } + RCTLogInfo(@"didUpdateNotificationStateForCharacteristic %@", characteristic.UUID); +} + +- (void)peripheral:(CBPeripheral *)peripheral + didReadRSSI:(NSNumber *)RSSI + error:(NSError *)error { + if (error) { + RCTLogWarn(@"fdp: %@", [error localizedDescription]); + } + RCTLogInfo(@"didReadRSSI"); +} + +- (void)peripheralDidUpdateName:(CBPeripheral *)peripheral { + RCTLogInfo(@"peripheralDidUpdateName: %@", peripheral.identifier); +} + +- (void)peripheral:(CBPeripheral *)peripheral + didModifyServices:(NSArray *)invalidatedServices { + RCTLogInfo(@"didModifyServices"); +} + +- (void)peripheral:(CBPeripheral *)peripheral + didOpenL2CAPChannel:(CBL2CAPChannel *)channel + error:(NSError *)error { + RCTLogInfo(@"didOpenL2CAPChannel"); +} + +@end