//固件升級代碼(設置代理之類的就不說了,代碼這么多原理也看不過來) // DFUFirmware *selectedFirmware = [[DFUFirmware alloc] initWithZipFile:firmWareData]; dispatch_queue_t eventQueue = dispatch_queue_create("com.ota.updater", DISPATCH_QUEUE_CONCURRENT); DFUServiceInitiator * dfuInitiator = [[DFUServiceInitiator alloc] initWithQueue:eventQueue delegateQueue:eventQueue progressQueue:eventQueue loggerQueue:eventQueue]; dfuInitiator = [dfuInitiator withFirmware:selectedFirmware]; dfuInitiator.delegate = self; dfuInitiator.progressDelegate = self; dfuInitiator.logger = self; ///這個設置無關精要 //dfuInitiator.packetReceiptNotificationParameter = 4; ///之前一直處理不成功,自動斷開連接然后又一直重試連接,重試是sdk搞出來的事情,最后發現是一直在嘗試給硬件設置名稱(我們的硬件這類命令發過去都是要先綁定和授權的)所以一直失敗,由此設置這個屬性不讓它進行這種莫名其妙的操作,接下來就是見證奇跡的時刻了 dfuInitiator.alternativeAdvertisingNameEnabled = NO; dfuInitiator.enableUnsafeExperimentalButtonlessServiceInSecureDfu = YES; self.dfuController = [[dfuInitiator withFirmware:selectedFirmware] startWithTarget:peripheral];
不進行這個配置,使用其他工具 nRF Connect上報的錯誤信息(后來看這個報錯也比較明確說了處理方式)
[Callback] Central Manager did disconnect peripheral
Disconnected by the remote device
Buttonless service not configured, see: https://devzone.nordicsemi.com/f/nordic-q-a/59881/advertising-rename-feature-not-working/243566#243566. To workaround, disable alternative advertising name.
Connecting to T001...
centralManager.connect(peripheral, options: nil)
[Callback] Central Manager did connect peripheral
Connected to T001
Discovering services...
系統給出的斷連錯誤信息:
Error Domain=CBErrorDomain Code=6 "The connection has timed out unexpectedly." UserInfo={NSLocalizedDescription=The connection has timed out unexpectedly.}