最近研究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就不细讲了。不会的同学请自行翻书。
pod 下来两个库 如下图 这就是最新的代码了 是可以使用10.2 xcode编译的
接下来配置证书,因为需要使用蓝牙模块,所以必须真机调试哦
注意证书和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源码。本人只是拿过来很小一部分,做连接用途