使用iOSDFULibrary對(duì)藍(lán)牙設(shè)備進(jìn)行DFU升級(jí)(2)

上篇文章講述了如何將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ù):

  1. 如果你的藍(lán)牙設(shè)備有一個(gè)按鈕可以直接將藍(lán)牙設(shè)備進(jìn)入DFU模式,那就需要設(shè)置dfuInitiator.forceDfu = YES;
  2. 設(shè)置dfuInitiator.packetReceiptNotificationParameter = 1;這個(gè)屬性默認(rèn)是12夕晓,如果1也不行宛乃,可以設(shè)置為小于12的數(shù)字試一下,例如2,4烤惊,6乔煞。。柒室。
  3. 如果你的設(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)該是這樣子的:

  1. iOS設(shè)備發(fā)送命令給藍(lán)牙,讓他進(jìn)入DFU模式
  2. 藍(lán)牙設(shè)備接收命令后擂仍,進(jìn)入DFU模式囤屹,并在他的service列表中,添加DFU服務(wù)
  3. 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è)未舟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市掂为,隨后出現(xiàn)的幾起案子裕膀,更是在濱河造成了極大的恐慌,老刑警劉巖菩掏,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魂角,死亡現(xiàn)場(chǎng)離奇詭異昵济,居然都是意外死亡智绸,警方通過(guò)查閱死者的電腦和手機(jī)适篙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)奕谭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人纹蝴,你說(shuō)我怎么就攤上這事海铆〖?郑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵卧斟,是天一觀(guān)的道長(zhǎng)殴边。 經(jīng)常有香客問(wèn)我,道長(zhǎng)珍语,這世上最難降的妖魔是什么锤岸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮板乙,結(jié)果婚禮上是偷,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好蛋铆,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布馋评。 她就那樣靜靜地躺著,像睡著了一般刺啦。 火紅的嫁衣襯著肌膚如雪留特。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天洪燥,我揣著相機(jī)與錄音磕秤,去河邊找鬼。 笑死捧韵,一個(gè)胖子當(dāng)著我的面吹牛市咆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播再来,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蒙兰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了芒篷?” 一聲冷哼從身側(cè)響起搜变,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎针炉,沒(méi)想到半個(gè)月后挠他,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡篡帕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年殖侵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镰烧。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拢军,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出怔鳖,到底是詐尸還是另有隱情茉唉,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布结执,位于F島的核電站度陆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏献幔。R本人自食惡果不足惜懂傀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斜姥。 院中可真熱鬧鸿竖,春花似錦沧竟、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至闪水,卻和暖如春糕非,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背球榆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工朽肥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人持钉。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓衡招,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親每强。 傳聞我的和親對(duì)象是個(gè)殘疾皇子始腾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 人都得做點(diǎn)事。 我是上班族空执,當(dāng)然在上班工作中做事浪箭。我做事的風(fēng)格是,有序辨绊,有效率奶栖。用以做這事,有什么說(shuō)明门坷,有什么目的...
    大李員外閱讀 211評(píng)論 0 0
  • 人生的每一個(gè)階段宣鄙,都仿佛是上天賜予你的一張白紙,或?qū)懟虍?huà)拜鹤,筆全握在自己手中框冀。學(xué)生時(shí)代的假期流椒,更顯得無(wú)比恣意敏簿,沒(méi)有學(xué)...
    一只大花梨閱讀 458評(píng)論 0 1
  • 我知道對(duì)于我這個(gè)不肯敞開(kāi)心扉的人來(lái)說(shuō),再多繁華也不過(guò)是過(guò)客宣虾,煙花易冷惯裕,花燈走馬,終歸于寂绣硝。
    云無(wú)風(fēng)閱讀 162評(píng)論 0 0