上篇文章講述了如何將iOSDFULibrary庫(kù)集成到oc工程中丝格,下面就講一下如何在工程中使用它撑瞧。
官方的示例IOS-nRF-Toolbox
中給出了他的swift中的使用方法,而在oc中的具體代碼如下:
-(void) initDFUService:(NSURL *)firmWareFilePath{
DFUFirmware *firmware = [[DFUFirmware alloc] initWithUrlToZipFile: firmWareFilePath];
DFUServiceInitiator * dfuInitiator = [[DFUServiceInitiator alloc]initWithQueue: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
[dfuInitiator withFirmware: firmware];
dfuInitiator.delegate = self;
dfuInitiator.progressDelegate = self;
dfuInitiator.logger = self;
dfuInitiator.enableUnsafeExperimentalButtonlessServiceInSecureDfu = YES;
dfuInitiator.packetReceiptNotificationParameter = 1;
self.dfuController = [[dfuInitiator withFirmware: firmware] startWithTarget:self.discoveredPeripheral];
}
當(dāng)然显蝌,你還需要實(shí)現(xiàn)DFUServiceDelegate预伺、DFUProgressDelegate、LoggerDelegate等代理的回調(diào)方法曼尊。
查看IOSDFULibrary的源代碼可以看到酬诀,他支持三種DFU升級(jí)模式分別是Legacy DFU、Secure DFU和Buttonless DFU骆撇。主要根據(jù)你的設(shè)備的DFU Service的UUID來(lái)區(qū)分
legacyDFUService = CBUUID(string: "00001530-1212-EFDE-1523-785FEABCD123")
legacyDFUControlPoint = CBUUID(string: "00001531-1212-EFDE-1523-785FEABCD123")
legacyDFUPacket = CBUUID(string: "00001532-1212-EFDE-1523-785FEABCD123")
legacyDFUVersion = CBUUID(string: "00001534-1212-EFDE-1523-785FEABCD123")
// Secure DFU
secureDFUService = CBUUID(string: "FE59")
secureDFUControlPoint = CBUUID(string: "8EC90001-F315-4F60-9FB8-838830DAEA50")
secureDFUPacket = CBUUID(string: "8EC90002-F315-4F60-9FB8-838830DAEA50")
// Buttonless DFU
buttonlessExperimentalService = CBUUID(string: "8E400001-F315-4F60-9FB8-838830DAEA50")
// The same UUID as the service
buttonlessExperimentalCharacteristic = CBUUID(string: "8E400001-F315-4F60-9FB8-838830DAEA50")
buttonlessWithoutBonds = CBUUID(string: "8EC90003-F315-4F60-9FB8-838830DAEA50")
buttonlessWithBonds = CBUUID(string: "8EC90004-F315-4F60-9FB8-838830DAEA50")
如果你的設(shè)備進(jìn)入到DFU模式后瞒御,他廣播的DFU Service的UUID是8E400001-F315-4F60-9FB8-838830DAEA50,那么在初始化的時(shí)候就要和我上面的代碼一樣將屬性enableUnsafeExperimentalButtonlessServiceInSecureDfu設(shè)置為T(mén)rue神郊,因?yàn)槟J(rèn)情況下肴裙,Buttonless DFU模式是被關(guān)閉的。
如果在測(cè)試的過(guò)程中遇到問(wèn)題涌乳,通瞅吲常可能需要設(shè)置以下幾個(gè)參數(shù):
- 如果你的藍(lán)牙設(shè)備有一個(gè)按鈕可以直接將藍(lán)牙設(shè)備進(jìn)入DFU模式,那就需要設(shè)置dfuInitiator.forceDfu = YES;
- 設(shè)置dfuInitiator.packetReceiptNotificationParameter = 1;這個(gè)屬性默認(rèn)是12夕晓,如果1也不行宛乃,可以設(shè)置為小于12的數(shù)字試一下,例如2,4烤惊,6乔煞。。柒室。
- 如果你的設(shè)備有自定義的DFU模式的UUID渡贾,那就需要根據(jù)他支持的DUF Service自定義相應(yīng)的UUID
DFUUuid * uuid = [[DFUUuid alloc]initWithUUID:[CBUUID UUIDWithString:@"8E400001-F315-4F60-9FB8-838830DAEA50"] forType:DFUUuidTypeSecureService];
dfuInitiator.uuidHelper = [[DFUUuidHelper alloc]initWithCustomUuids:@[uuid]];
buttonlessExperimentalService = CBUUID(string: "8E400001-F315-4F60-9FB8-838830DAEA50")
最后,還有一個(gè)比較坑的地方是雄右,IOS系統(tǒng)會(huì)緩存藍(lán)牙設(shè)備的信息空骚。DFU的整個(gè)流程應(yīng)該是這樣子的:
- iOS設(shè)備發(fā)送命令給藍(lán)牙,讓他進(jìn)入DFU模式
- 藍(lán)牙設(shè)備接收命令后擂仍,進(jìn)入DFU模式囤屹,并在他的service列表中,添加DFU服務(wù)
- iOS設(shè)備根據(jù)藍(lán)牙設(shè)備的service列表逢渔,確認(rèn)他是否進(jìn)入了DFU模式肋坚,如果進(jìn)入了,則開(kāi)始檢查固件文件肃廓,檢查完成后智厌,開(kāi)始上傳到藍(lán)牙設(shè)備然后進(jìn)行固件升級(jí)
但是由于ios會(huì)緩存藍(lán)牙設(shè)備的信息和service,所以即使藍(lán)牙設(shè)備進(jìn)入到DFU模式后盲赊,添加了service铣鹏,系統(tǒng)在檢查藍(lán)牙設(shè)備的信息時(shí),仍然會(huì)使用它以前的service列表哀蘑,因此無(wú)法知道藍(lán)牙設(shè)備已經(jīng)進(jìn)入到DFU模式诚卸,也就無(wú)法進(jìn)入到下一步。
因此绘迁,藍(lán)牙設(shè)備在進(jìn)入到DFU模式后合溺,固件會(huì)默認(rèn)將藍(lán)牙設(shè)備的mac地址加一,讓ios系統(tǒng)會(huì)認(rèn)為這是一個(gè)新的設(shè)備缀台,因此辫愉,不會(huì)使用緩存,而重新獲取藍(lán)牙設(shè)備的信息将硝,也就可以查找到相應(yīng)的DFU服務(wù)恭朗,而將整個(gè)DFU流程繼續(xù)走下去。
因此依疼,在DFU的時(shí)候痰腮,應(yīng)該會(huì)自動(dòng)將藍(lán)牙設(shè)備斷開(kāi)一次,然后重新連接律罢。不過(guò)遺憾的是膀值,我們一開(kāi)始使用的固件進(jìn)入到DFU模式的時(shí)候棍丐,不會(huì)對(duì)mac地址進(jìn)行更改,導(dǎo)致在藍(lán)牙設(shè)備進(jìn)入到DFU模式之后沧踏,我們一直無(wú)法查找到相應(yīng)的服務(wù)歌逢。而android設(shè)備只需要主動(dòng)斷開(kāi)藍(lán)牙之后,再重新連接翘狱,就會(huì)刷新設(shè)備service而不存在相應(yīng)的問(wèn)題秘案。要想解決ios的問(wèn)題,看來(lái)只能對(duì)固件進(jìn)行修改了潦匈。這個(gè)主要是針對(duì)Buttonless DFU模式阱高,其他的模式是否需要這樣,還待測(cè)試茬缩。
在蘋(píng)果的論壇中有人也遇到過(guò)類(lèi)似的問(wèn)題How to clear BLE cache in IOS ?, 但是蘋(píng)果也沒(méi)有任何回應(yīng)赤惊。
如果有任何其他問(wèn)題也可以直接在他們的git上IOS-Pods-DFU-Library提bug,他們的工作人員回復(fù)的很快也很熱心凰锡,贊一個(gè)未舟。