最近做了个智能硬件的项目,具有蓝牙功能。在这里做个总结,一方面查漏补缺,一方面希望能有助于有这方面需求的人。我的项目是以智能硬件作为外设的,所以只介绍这部分。鉴于文章篇幅问题,分为两篇,第一篇介绍蓝牙的连接和发送数据,第二篇介绍固件升级,这是第二篇。第一篇链接:https://www.jianshu.com/p/8f97a80f5fd6
开始我想要自己写一个固件升级,因为本质上都是向外设发送数据,但是经过多次尝试之后,发现总会在发送数据的过程中断开,所以就选择了使用第三方库 iOSDFULibrary。
一.自己升级时候的流程,首先会向外设发送一个升级的命令,让外设处于升级模式中,这个需要和硬件工程师沟通一下,确认处于升级模式时候的状态,我这边是LED灯常亮,之后再连接外设,需要注意的是,升级模式的时候外设的name和UUID都是改变过之后的。在- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI方法中重新连接外设,之后发送升级需要的文件,但是在发送数据的时候会断开,看有关iOSDFULibrary的代码的时候发现,他在发送数据的时候,会有连接,开始,准备升级,上传等多种状态,我想我发送数据失败可能是少了某些步骤,但是跟硬件工程师沟通的时候,他确定只需要发送一个升级命令,之后发送升级包就可以,所以不想麻烦的话可以直接使用第三方。
二.使用iOSDFULibrary,代码主要部分
NSURL * url = [[NSBundle mainBundle]URLForResource:@"update" withExtension:@"hex"];
DFUFirmware * selectFirmware = [[DFUFirmware alloc]initWithUrlToBinOrHexFile:url urlToDatFile:nil type:4];
DFUServiceInitiator *initiator = [[DFUServiceInitiator alloc] initWithCentralManager: _centralManager target:_selectedPeripheral];
initiator = [initiator withFirmware:selectFirmware];
initiator.forceDfu = [[[NSUserDefaults standardUserDefaults] valueForKey:@"dfu_force_dfu"] boolValue];
initiator.packetReceiptNotificationParameter = [[[NSUserDefaults standardUserDefaults] valueForKey:@"dfu_number_of_packets"] intValue];
initiator.logger = self;
initiator.delegate = self;
initiator.progressDelegate = self;
_controller = [initiator start];
检测上传进度的代理方法- (void)dfuProgressDidChangeFor:(NSInteger)part outOf:(NSInteger)totalParts to:(NSInteger)progress currentSpeedBytesPerSecond:(double)currentSpeedBytesPerSecond avgSpeedBytesPerSecond:(double)avgSpeedBytesPerSecond
上传失败的代理方法- (void)dfuError:(enum DFUError)error didOccurWithMessage:(NSString * _Nonnull)message
代码主要就是以上这些,使用起来很方便,但是iOSDFULibrary的配置就是个比较麻烦的问题,我也是借鉴了别人的方法链接:https://www.jianshu.com/p/eb5b1e26adf7
网友评论