ota / 韌體更新 / 空中升級 接入記錄
阿新 • • 發佈:2018-12-28
ota / 韌體更新 / 空中升級 即 通過手機升級BLE藍芽裝置。
韌體更新最重要的就是參考 官方升級依賴庫、與 官方使用Demo
官方空中升級依賴庫:https://github.com/NordicSemiconductor/Android-DFU-Library
官方使用Demo:https://github.com/NordicSemiconductor/Android-nRF-Toolbox
簡單使用(如果你不花太長時間就想接入的Demo,當然也由於短小而不靠譜)
1、新增依賴(我用的不是最新版)
//韌體更新 implementation 'no.nordicsemi.android:dfu:1.6.1'
2、配置引數與開始升級
/**進行空中升級 [zipPath]:升級檔案*/ @WorkerThread//我是在子執行緒執行的,沒在主執行緒測試過 private fun updateDevice(zipPath: String) { //配置升級引數 val initiator = DfuServiceInitiator(mMac)//裝置地址 initiator.setPacketsReceiptNotificationsEnabled(false)//啟用或禁用資料包接收通知(PRN)過程 initiator.setUnsafeExperimentalButtonlessServiceInSecureDfuEnabled(true)//官方Demo為true initiator.setDeviceName("智慧手環")//裝置名稱,怎麼寫都行 initiator.setKeepBond(false)//保持裝置繫結 官方Demo為false initiator.setZip(File(zipPath).toUri(), zipPath)//指定更新檔案(zip檔案) val controller = //您可以使用控制器暫停,恢復或中止DFU過程。 initiator.start(baseContext, DfuService::class.java)//呼叫此方法啟動升級服務進行升級 }
3、建立上文用到的 DfuService
<!--仿照官方Demo--> <service android:name=".db.view.ota.DfuService" android:exported="true"> <intent-filter> <action android:name="no.nordicsemi.android.action.DFU_UPLOAD" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service>
class DfuService : DfuBaseService() {
/**點選更新通知時開啟此Activity*/
override fun getNotificationTarget(): Class<out Activity> {
return UpdateProgressActivity::class.java
}
override fun isDebug(): Boolean = true
}
4、在頁面可見與不可見時進行升級監聽
/**韌體更新監聽*/
private val dufProgressListener: DfuProgressListener? = object : DfuProgressListener {
/**裝置連線了*/
override fun onDeviceConnected(deviceAddress: String?) {
MLog.d("onDeviceConnected() called with: " + "deviceAddress = [" + deviceAddress + "]")
}
/**升級準備開始*/
override fun onDfuProcessStarting(deviceAddress: String?) {
MLog.d("onDfuProcessStarting() called with: " + "deviceAddress = [" + deviceAddress + "]")
}
/**正在連線裝置*/
override fun onDeviceConnecting(deviceAddress: String?) {
MLog.d("onDeviceConnecting() called with: " + "deviceAddress = [" + deviceAddress + "]")
}
/**更新進度開始*/
override fun onDfuProcessStarted(deviceAddress: String?) {
MLog.d("onDfuProcessStarted() called with: " + "deviceAddress = [" + deviceAddress + "]")
}
/**升級中的回撥*/
override fun onProgressChanged(
deviceAddress: String?, percent: Int, speed: Float, avgSpeed: Float, currentPart: Int,
partsTotal: Int
) {
MLog.d("onProgressChanged() called with: " + "deviceAddress = [" + deviceAddress + "], percent = [" + percent + "], speed = [" + speed + "], avgSpeed = [" + avgSpeed + "], currentPart = [" + currentPart + "], partsTotal = [" + partsTotal + "]")
}
/**裝置正在斷開*/
override fun onDeviceDisconnecting(deviceAddress: String?) {
MLog.d("onDeviceDisconnecting() called with: " + "deviceAddress = [" + deviceAddress + "]")
}
/**裝置斷開了*/
override fun onDeviceDisconnected(deviceAddress: String?) {
MLog.d("onDeviceDisconnected() called with: " + "deviceAddress = [" + deviceAddress + "]")
}
/**升級完成*/
override fun onDfuCompleted(deviceAddress: String?) {
MLog.d("onDfuCompleted() called with: " + "deviceAddress = [" + deviceAddress + "]")
}
/**升級失敗*/
override fun onError(
deviceAddress: String?, error: Int, errorType: Int, message: String?
) {
MLog.d("onError() called with: " + "deviceAddress = [" + deviceAddress + "], error = [" + error + "], errorType = [" + errorType + "], message = [" + message + "]")
}
/**韌體驗證-未用*/
override fun onFirmwareValidating(deviceAddress: String?) {
MLog.d("onFirmwareValidating() called with: " + "deviceAddress = [" + deviceAddress + "]")
}
/**未用*/
override fun onDfuAborted(deviceAddress: String?) {
MLog.d("onDfuAborted() called with: " + "deviceAddress = [" + deviceAddress + "]")
}
/**未用*/
override fun onEnablingDfuMode(deviceAddress: String?) {
MLog.d("onEnablingDfuMode() called with: " + "deviceAddress = [" + deviceAddress + "]")
}
}
override fun onResume() {
super.onResume()
DfuServiceListenerHelper.registerProgressListener(baseContext, dufProgressListener)
}
override fun onPause() {
super.onPause()
DfuServiceListenerHelper.unregisterProgressListener(baseContext, dufProgressListener)
}