LETransceiver.m 5.8 KB
//
//  LETransceiver.m
//  ActsBluetoothSpeed
//
//  Created by inidhu on 2019/3/15.
//  Copyright © 2019 Actions. All rights reserved.
//

#import "LETransceiver.h"
#import <UIKit/UIKit.h>

#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