使用 iOSDFULibrary 進行藍牙 DFU升級(OTA 升級)

現(xiàn)在公司用的藍牙芯片是 NRF51 系列,DFU 升級(OTA 升級)可直接使用官方提供的 iOSDFULibrary鹏浅。

準備

使用 cocoapods 安裝

target 'YourAppTargetName' do
    use_frameworks!
    pod 'iOSDFULibrary'
end

安裝后除了iOSDFULibrary 還有一個 ZIPFoundation。是iOSDFULibrary的一個依賴庫桶至,解壓zip 包用的晾匠,我們不會直接使用。

使用前確認硬件同事發(fā)過來的空升包能正常使用准颓,在 APP Store 下載 nRF Connect 操作哈蝇,能升級成功,再看代碼不遲瞬场。

空升步驟

  1. 確認手柄與系統(tǒng)已連接
  2. 向藍牙設備發(fā)“開啟升級模式”消息买鸽。此時手柄會主動斷連。
  3. APP 收到藍牙斷開回調(diào)贯被,APP 發(fā)起藍牙連接請求眼五,(此時連接的設備名變?yōu)闀淖儯韬陀布麓_認)
  4. APP 收到藍牙連接成功回調(diào)彤灶,讀本地空升包看幼,調(diào)用 iOSDFULibrary與 dfuService 通信

空升代碼

開始空升(空升步驟第3步),我這里建了一個單獨的類 DFUHelper幌陕,遵守協(xié)議 DFUServiceDelegate, DFUProgressDelegate, LoggerDelegate诵姜。

func startDFU() {
    guard let filePath = Bundle.main.path(forResource: "你的空升包名字", ofType: "zip") else {
        return
    }
    
    guard let selectedFirmware = DFUFirmware(urlToZipFile: URL(fileURLWithPath: filePath)) else { return }

    let initiator = DFUServiceInitiator(centralManager: BlueToothHelper.centralManager, target: BlueToothHelper.peripheral)
    initiator.forceDfu = UserDefaults.standard.bool(forKey: "dfu_force_dfu")
    initiator.packetReceiptNotificationParameter = UInt16(UserDefaults.standard.integer(forKey: "dfu_number_of_packets"))
    initiator.logger = self
    initiator.delegate = self
    initiator.progressDelegate = self
    initiator.enableUnsafeExperimentalButtonlessServiceInSecureDfu = true
    dfuController = initiator.with(firmware: selectedFirmware).start()
}

協(xié)議回調(diào)

// 升級狀態(tài)回調(diào)
func dfuStateDidChange(to state: DFUState) {
    switch state {
    case .completed:
        print("升級成功")
    default:
        break
    }
}

// 升級進度回調(diào),范圍 1-100
func dfuProgressDidChange(for part: Int, outOf totalParts: Int, to progress: Int, currentSpeedBytesPerSecond: Double, avgSpeedBytesPerSecond: Double) {
    DispatchQueue.main.async {
        // 回主線程更新 UI
    }
}

func dfuError(_ error: DFUError, didOccurWithMessage message: String) {
    print("??  dfuError: \(error), didOccurWithMessage: \(message)")
}

func logWith(_ level: LogLevel, message: String) {
    print("??  logWith   \(level), message: \(message)")
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搏熄,一起剝皮案震驚了整個濱河市棚唆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌心例,老刑警劉巖宵凌,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異止后,居然都是意外死亡瞎惫,警方通過查閱死者的電腦和手機溜腐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓜喇,“玉大人挺益,你說我怎么就攤上這事〕撕” “怎么了望众?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長伞辛。 經(jīng)常有香客問我黍檩,道長,這世上最難降的妖魔是什么始锚? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任刽酱,我火速辦了婚禮,結果婚禮上瞧捌,老公的妹妹穿的比我還像新娘棵里。我一直安慰自己,他們只是感情好姐呐,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布殿怜。 她就那樣靜靜地躺著,像睡著了一般曙砂。 火紅的嫁衣襯著肌膚如雪头谜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天鸠澈,我揣著相機與錄音柱告,去河邊找鬼。 笑死笑陈,一個胖子當著我的面吹牛际度,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涵妥,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乖菱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蓬网?” 一聲冷哼從身側響起窒所,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帆锋,沒想到半個月后吵取,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡窟坐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年海渊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哲鸳。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡臣疑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出徙菠,到底是詐尸還是另有隱情讯沈,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布婿奔,位于F島的核電站缺狠,受9級特大地震影響,放射性物質發(fā)生泄漏萍摊。R本人自食惡果不足惜挤茄,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冰木。 院中可真熱鬧穷劈,春花似錦、人聲如沸踊沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逼龟。三九已至评凝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腺律,已是汗流浹背奕短。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匀钧,地道東北人篡诽。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像榴捡,于是被迫代替她去往敵國和親杈女。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354