iOS 蓝牙外设OTA升级记录

本文详细记录了iOS设备通过蓝牙进行外设OTA升级的过程,包括固件文件读取、数据分块发送、蓝牙特性交互等关键步骤。在升级过程中,先发送文件头信息,接着发送固件数据,最后发送文件尾信号,确保完整传输。
摘要由CSDN通过智能技术生成

蓝牙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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值