LETransceiver.m
5.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
//
// 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