// // LETransceiver.m // ActsBluetoothSpeed // // Created by inidhu on 2019/3/15. // Copyright © 2019 Actions. All rights reserved. // #import "LETransceiver.h" #import #define BLE_UUID_SERVICE @"e49a25f8-f69a-11e8-8eb2-f2801f1b9fd1" #define BLE_UUID_SERVICE_WRITE @"e49a25e0-f69a-11e8-8eb2-f2801f1b9fd1" #define BLE_UUID_SERVICE_READ @"e49a28e1-f69a-11e8-8eb2-f2801f1b9fd1" @implementation LETransceiver { NSString *writeServiceUUID; NSString *writeCharacteristicUUID; NSString *indicateServiceUUID; NSString *indicateCharacteristicUUID; // CBCharacteristicWriteType writeType; CBPeripheral *connectedPeripheral; CBCharacteristic *characteristicWrite; CBCharacteristic *characteristicIndicate; NSTimer *connectTimer; BOOL isReadyToSendWrite; } - (void)closeOTA { [connectedPeripheral setNotifyValue:NO forCharacteristic:characteristicIndicate]; } - (id) init { self = [super init]; if (self) { NSDictionary *uuids = [NSDictionary dictionaryWithObjectsAndKeys:BLE_UUID_SERVICE, KeyWriteServiceUUID, BLE_UUID_SERVICE_WRITE, KeyWriteCharacteristicUUID, BLE_UUID_SERVICE, KeyIndicateServiceUUID, BLE_UUID_SERVICE_READ, KeyIndicateCharacteristicUUID, nil]; [self setUUIDs:uuids]; } // writeType = CBCharacteristicWriteWithoutResponse; // centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; return self; } - (void)setUUIDs:(NSDictionary *) uuids { NSArray *keys = [uuids allKeys]; for (NSString *key in keys) { if ([key isEqualToString:KeyWriteServiceUUID]) { writeServiceUUID = [[uuids objectForKey:KeyWriteServiceUUID] uppercaseString]; } else if ([key isEqualToString:KeyIndicateServiceUUID]) { indicateServiceUUID = [[uuids objectForKey:KeyIndicateServiceUUID] uppercaseString]; } else if ([key isEqualToString:KeyWriteCharacteristicUUID]) { writeCharacteristicUUID = [[uuids objectForKey:KeyWriteCharacteristicUUID] uppercaseString]; } else if ([key isEqualToString:KeyIndicateCharacteristicUUID]) { indicateCharacteristicUUID = [[uuids objectForKey:KeyIndicateCharacteristicUUID] uppercaseString]; } } } - (NSUInteger) getMtuForType:(CBCharacteristicWriteType) type { return [connectedPeripheral maximumWriteValueLengthForType:type]; } - (void)write:(NSData *) data { if (characteristicWrite) { NSUInteger mtu = [self getMtuForType:CBCharacteristicWriteWithoutResponse]; NSLog(@"writeData mtu: %ld, %@", mtu, data); for (NSUInteger index = 0; index < data.length; index += mtu) { NSUInteger len = (data.length - index) > mtu ? mtu : (data.length - index); NSData *value = [data subdataWithRange:NSMakeRange(index, len)]; [connectedPeripheral writeValue:value forCharacteristic:characteristicWrite type:CBCharacteristicWriteWithoutResponse]; NSLog(@"writeValue: %@", value); } } } - (void)write:(NSData *) data index:(int) i { if (characteristicWrite) { NSUInteger mtu = [self getMtuForType:CBCharacteristicWriteWithoutResponse]; NSLog(@"i writeData mtu: %ld, %@", mtu, data); for (NSUInteger index = 0; index < data.length; index += mtu) { NSUInteger len = (data.length - index) > mtu ? mtu : (data.length - index); NSData *value = [data subdataWithRange:NSMakeRange(index, len)]; if(i != 0 && i % 62 == 0) { NSData *value2 = [value subdataWithRange:NSMakeRange(0, 1)]; NSData *value3 = [value subdataWithRange:NSMakeRange(1, value.length - 1)]; [connectedPeripheral writeValue:value2 forCharacteristic:characteristicWrite type:CBCharacteristicWriteWithResponse]; [connectedPeripheral writeValue:value3 forCharacteristic:characteristicWrite type:CBCharacteristicWriteWithoutResponse]; } else { [connectedPeripheral writeValue:value forCharacteristic:characteristicWrite type:CBCharacteristicWriteWithoutResponse]; } NSLog(@"writeValue: %@", value); } } } - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{ NSLog(@"didDiscoverCharacteristicsForService: %@, %@", peripheral.name, service.UUID.UUIDString); if (error) { NSLog(@"Error didDiscoverCharacteristicsForService:%@",[error localizedDescription]); return; } NSLog(@"UUID: %@, %@, %@", service.UUID.UUIDString, writeServiceUUID, indicateServiceUUID); if ([writeServiceUUID containsString:service.UUID.UUIDString]) { for (CBCharacteristic *characteristic in service.characteristics) { NSLog(@"DiscoverCharacteristics: %@", characteristic.UUID); if ([characteristic.UUID.UUIDString isEqualToString:writeCharacteristicUUID]) characteristicWrite = characteristic; } } if ([indicateServiceUUID containsString:service.UUID.UUIDString]) { for (CBCharacteristic *characteristic in service.characteristics) { NSLog(@"DiscoverCharacteristics: %@", characteristic.UUID); if ([characteristic.UUID.UUIDString isEqualToString:indicateCharacteristicUUID]) { [peripheral setNotifyValue:YES forCharacteristic:characteristic]; characteristicIndicate = characteristic; } } } if (characteristicWrite && characteristicIndicate) { connectedPeripheral = peripheral; [connectTimer invalidate]; if(_connectionDelegate && [_connectionDelegate respondsToSelector:@selector(onPeripheralOtaConnected:)]) { [_connectionDelegate onPeripheralOtaConnected:peripheral]; } } } @end