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

OTA升级的代码需要涉及到蓝牙服务和固件编程,因此具体的实现方式会因开发环境和目标设备而异。以下是一个基本的OTA升级代码示例,你可以根据需要进行修改和调整: ```c // 初始化蓝牙服务 BLEService otaService("OTA Service"); // OTA升级特征 BLECharacteristic otaCharacteristic("OTA Characteristic", BLERead | BLEWrite); // 固件升级程序 void updateFirmware() { // 实现固件升级 } // 处理OTA特征写入事件 void onOTAWrite(BLECharacteristic& characteristic) { // 读取写入的数据 std::string data = characteristic.getValue(); // 将数据写入固件升级缓存 // ... // 如果缓存已满,执行固件升级 if (isCacheFull()) { updateFirmware(); } } void setup() { // 初始化蓝牙服务和特征 BLE.addService(otaService); otaService.addCharacteristic(otaCharacteristic); // 注册事件处理函数 otaCharacteristic.setEventHandler(BLEWritten, onOTAWrite); } void loop() { // 处理蓝牙事件 BLE.poll(); } ``` 这段代码演示了如何使用Arduino编写一个简单的OTA升级程序。其中,BLEService和BLECharacteristic是中科蓝讯提供的蓝牙服务和特征类。在setup()函数中,我们初始化了OTA服务和特征,并在特征上注册了事件处理函数。当设备接收到OTA数据时,事件处理函数会将数据写入固件升级缓存,并检查缓存是否已满,如果已满,就执行固件升级。在loop()函数中,我们通过BLE.poll()函数来处理蓝牙事件。 需要注意的是,这只是一个简单的示例代码,实际的OTA升级程序需要根据设备和固件的具体情况进行修改和优化。同时,OTA升级过程中需要保证数据的安全性和可靠性,因此还需要考虑一些异常情况的处理和错误恢复机制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值