接触蓝牙也有很长一段时间了,接下来给大家讲讲DFU蓝牙升级吧
DFU升级步骤也是很简单的
1. 向蓝牙外设(手环)发送升级指令
2. 蓝牙外设进入DFU模式
3. 下载DFU升级文件
4. 把DFU升级文件写入蓝牙外设中
声明所需变量
@property(strong, nonatomic) DFUServiceController *controller;
@property(strong, nonatomic) DFUFirmware *selectedFirmware;
DFUServiceInitiator*initiator = [[DFUServiceInitiator alloc] initWithCentralManager:(CBCentralManager,蓝牙中心管理者) target:(CBPeripheral)连接的外设特征];
self.selectedFirmware = [[DFUFirmware alloc] initWithUrlToZipFile:self.DFUFilePath(DFU文件的路径)];
[initiator withFirmware:self.selectedFirmware];
initiator.logger = self;
initiator.delegate = self;
initiator.progressDelegate = self;
//开始升级
self.controller = [initiator start];
这里要注意的是DFU升级需要传递三个参数 第一个是 initWithCentralManager () 要传递的对象是你的蓝牙中心管理者对象 第二个是 target()要传递的是蓝牙的外设特征 这两个可以用协议 全局变量 都可以暴露出来 第三个是 initWithUrlToZipFile:self()传递的是DFU文件的路径 你可以下载完成后存在沙盒然后把路径拿过来就可以 其他的照着写就行了
然后分别实现 LoggerDelegate, DFUServiceDelegate, DFUProgressDelegate 三个协议
//更新进度
- (void)dfuProgressDidChangeFor:(NSInteger)part outOf:(NSInteger)totalParts to:(NSInteger)progress currentSpeedBytesPerSecond:(double)currentSpeedBytesPerSecond avgSpeedBytesPerSecond:(double)avgSpeedBytesPerSecond{
floatcurrentProgress=((float) progress /totalParts)/100;
}
-(void)logWith:(enumLogLevel)level message:(NSString*)message {
NSLog(@"%logWith ld: %@", (long) level, message);
}
//更新进度状态 升级开始..升级中断..升级完成等状态
- (void)dfuStateDidChangeTo:(enumDFUState)state{
NSLog(@"DFUState state%ld",state);
//升级完成
if (state==DFUStateCompleted) {
}
}
//升级error信息
- (void)dfuError:(enumDFUError)error didOccurWithMessage:(NSString*_Nonnull)message{
NSLog(@"Error %ld: %@", (long) error, message);
}
因为是OC版本的 所以github上作者已经很久没有更新oc的版本,而且也没有保留oc的Demo 前段时间DFU升级是没有问题的,但是最近更新一直都很崩溃 发现是 DFU frameworks 版本太老 导致崩溃 所以等下会提供最新的frameworks和 OC 的官方Demo 在下面 大家可以试下 升级的过程也就这么简单 在这里提供一下 DFU升级遇到的问题 解决博客 DFU遇到的问题和解决方法 如果DFU升级有遇到问题可以在下面留言
转载自:https://blog.csdn.net/zthhsa/article/details/78624830
网友评论