蓝牙OTA升级。把OTA升级的大概步骤记录下,逻辑上OTA升级和常规发送数据是一样的,只是OTA固件包相对较大,所以需要将数据分割发送,每次发送20byte,在此需注意的是需要每次记录已发送的数据长度。
蓝牙扫描连接就不提了,这里从点击升级按钮开始
/*
点击升级按钮获取到固件文件的路径 并执行bluetoothManager 中的Update方法
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *publicDocumentsDir = [paths objectAtIndex:0];
NSString *Path = [publicDocumentsDir stringByAppendingPathComponent:tagartStr];
NSURL *fileURL = [NSURL URLWithString:[NSString stringWithFormat:@"file://%@",Path]];
fileStr ; 传入的固件路径转为的URL
step 自定义的一个int属性 用来判断执行的步骤
Nextstep 自定义的一个int属性,用来记录所执行的步骤
block size ;定义的每轮发送数据的大小
用到的所有的UUID 由蓝牙工程师的协议给定
expectedValue 有蓝牙协议写定,写入数据后外设会返回相应的值,用此判断下一执行步骤
*/
- (void)OTAupdate:(NSURL *)fileStr{
CBService *service = [self findServiceFromUUID:[self IntToCBUUID:OTA_SERVICE_UUID] p:_peripheral];
if (!service) {
NSLog(@"Could not find service");
return;
}
CBCharacteristic *characteristic = [self findCharacteristicFromUUID:[CBUUID UUIDWithString:OTA_SERV_STATUS_UUID] service:service];
if (!characteristic) {
NSLog(@"Could not find characteristic");
return;
}
//重新订阅通知
[_peripheral setNotifyValue:YES forCharacteristic:characteristic];
fileData = [[NSData dataWithContentsOfURL:fileStr] mutableCopy];
step = 1;
blockSize = 240;
[self doStep];
}
- (void)doStep {
switch (step) {
case 1: {
step = 0;
expectedValue = 0x00;
nextStep = 2;
//memoryType:蓝牙协议定义的类型 memoryBank:蓝牙协议定义
int _memDevData = (memoryType << 24) | (memoryBank & 0xFF);
NSData *memDevData = [NSData dataWithBytes:&_memDevData length:sizeof(int)];
//写入文件头
[self writeValue:[self IntToCBUUID:OTA_SERVICE_UUID] characteristicUUID:[CBUUID UUIDWithString:OTA_MEM_DEV_UUID] p:_peripheral data:memDevData];
break;
}
case 2: {
int _memInfoData;
_memInfoData = (spiMISOAddress << 24) | (spiMOSIAddress << 16) | (spiCSAddress << 8) | spiSCKAddress;
NSData *memInfoData = [NSData dataWithBytes:&_memInfoData