DFU固件升级 蓝牙BLE4.0

最近研究DFU固件升级,由于网上的资源非常少,也走了很多弯路。经过一段时间的研究,写出了一个demo测试可用。可以使用2019最新的官方库。希望能够帮到大家。

进入正题,现在的DFU固件升级基本都是使用NRF的github开源库,公司和厂商也有合作,中国区只有代理,如果有技术问题可以发邮件给欧洲的厂商。但是经过最终确认厂商不提供技术支持,所以只能自己翻文档,看代码了。官方提供的资源如下

1>nRF Toolbox App 源码  https://github.com/NordicSemiconductor/IOS-nRF-Toolbox

2>IOS-DFU-Library 源码  https://github.com/NordicSemiconductor/IOS-DFU-Library

一个是DFU的library库一个是swift的源码 ,当然swift如果用不惯的话,网上也会有一些ios版本的参考,下面是简书上一个作者提供的,原文地址如下https://www.jianshu.com/p/19958474139e

OC版的可以参考这个项目:nRF-Toolbox-master 密码: w7kd

当然到了2019年 你会发现网上的资源没有一个可以用的,遇到了跟这篇文章作者同样的错误,但是按照修复方法都无法解决。后来分析了好久,发现了原因,虽然都是报的找不到libary framework或者是zip framework,但是实际原因并不是这样。因为现有的网上的demo库都是swift 3.0以前的老版本,所以新版编译器是无法支持的。所以无法编译出来这个库,这就是为什么你怎么配置编译选项都还是找不到这个库。厂商提供的demo也是以前的swift库,10.2的xcode已经无法编译了。厂商给的答复也是,github的代码是参考代码。不保证能够使用。

下面进入正式集成,我们使用cocoapod,来集成最新的库

   use_frameworks!
    pod 'iOSDFULibrary'

Podfile中添加如下代码,然后pod install就不细讲了。不会的同学请自行翻书。

DFU固件升级 蓝牙BLE4.0_第1张图片

pod 下来两个库 如下图 这就是最新的代码了 是可以使用10.2 xcode编译的

接下来配置证书,因为需要使用蓝牙模块,所以必须真机调试哦

DFU固件升级 蓝牙BLE4.0_第2张图片

注意证书和bundle id需要对应上。

ok准备工作完成 开始我们的集成工作,首先导入库,以及升级所用的核心代码

@import iOSDFULibrary;


-(void)btnclick{
    // To start the DFU operation the DFUServiceInitiator must be used
    NSString *path = [[NSBundle mainBundle] pathForResource:@"app_dfu_package" ofType:@"zip"];
    NSURL *url = [NSURL URLWithString:path];
    DFUFirmware *selectedFirmware = [[DFUFirmware alloc] initWithUrlToZipFile:url];
    DFUServiceInitiator *initiator = [[DFUServiceInitiator alloc] initWithCentralManager: self.centalManager target:self.peripheral
                                      ];
    [initiator withFirmware:selectedFirmware];
 
    initiator.logger = self;
    initiator.delegate = self;
    initiator.progressDelegate = self;
    // initiator.peripheralSelector = ... // the default selector is used
    DFUServiceController *controller  = [initiator start];
    
    
}

然后实现几个代理

@interface ViewController ()

//更新进度
- (void)dfuProgressDidChangeFor:(NSInteger)part outOf:(NSInteger)totalParts to:(NSInteger)progress currentSpeedBytesPerSecond:(double)currentSpeedBytesPerSecond avgSpeedBytesPerSecond:(double)avgSpeedBytesPerSecond{
    
    _progress.progress = ((float) progress /totalParts)/100;
}


-(void)logWith:(enum LogLevel)level message:(NSString *)message
{
    NSLog(@"%logWith ld: %@", (long) level, message);
}

//更新进度状态  升级开始..升级中断..升级完成等状态
- (void)dfuStateDidChangeTo:(enum DFUState)state{
    
    NSLog(@"DFUState state%ld",state);
    //升级完成
    if (state==DFUStateCompleted) {
        NSLog(@"升级完成");
    }
    
}


//升级error信息
- (void)dfuError:(enum DFUError)error didOccurWithMessage:(NSString * _Nonnull)message{
    
    NSLog(@"Error %ld: %@", (long) error, message);
}

代理方法中主要提供升级过程中的各种状态的反馈。

好啦这就是dfu固件升级的核心代码。具体请参考源码github,如果帮到你的话还请大家点亮一颗星星

https://github.com/lee727n/DFU-bluetooth_update

如有使用问题,或者技术讨论请留言github,或者csdn 博客

另外demo中使用的蓝牙控件,主要是为了获取设备,以及连接设备,控件名称是easybluetooth,如果需要详细理解的请参考github源码。本人只是拿过来很小一部分,做连接用途

你可能感兴趣的:(蓝牙基础及最新技术)