1. 程式人生 > >ota / 韌體更新 / 空中升級 接入記錄

ota / 韌體更新 / 空中升級 接入記錄

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)
}