|
|
发表于 2016-9-2 15:19:04
|未经授权,严禁转载,违者必究...
|
|阅读模式
开辟 Ble android OTA 进级 android ble ota升级 android ota升级流程 android ota升级 android ota升级原理 android ota升级代码 android ble dfu升级 android ota升级 命令 android ota升级包 android ota升级 接口
前面几篇文章终于把ble的根基相关操作以及数据处置的大要思惟写完了,终于最先写 ble 的 OTA 进级(over-the-air,又称空中进级、DFU 进级等)了!其实,整个流程也很简单,因为 Nordic Semiconductor 这家公司已经帮我们供给好了 DFU 进级的库了,只需要学会怎么用就好了,感爱好的同窗也可以去看看源码,最后附上传送门:https://github.com/NordicSemiconductor/Android-DFU-Library
接下来就分享下我项目中一个进级方案吧,可以先看下下面这张图,首要也就是这么几步来完成的(需要申明的是进级包的格局,分歧的项目也许也会纷歧样,这里跟大师分享的是 .zip 包的,常见的还有 bin 文件、hex 文件等)。
起首得毗连上设备,获取到响应的版原本比对最新版本,确定是否需要进级。
确定需要进级后,把所需的相关数据先记实下来(为了最后的强制自检经由过程而做的预备),这个每个公司都有本身需求,所以这里只做参考。
当所需数据都记实下来后就可以最先进级了,进级的第一步就是要先让设备进入 DFU 模式,这个呢也是需要和硬件何处沟通的,我们是直接写入一个指令就可以进入 DFU 模式了,之前的蓝牙毗连也会主动断开,名字也会酿成 “DfuTarg”,mac地址也会变。
在挪用阿谁第三方库的时辰,需要传入一个mac 地址,而这个地址是 DFU 模式下的设备的 mac 地址,之所以强调是 DFU 模式下,是因为进入 DFU 模式后,设备的 mac 地址会转变,进级成功后变回之前的 mac 地址。
这里只做简单利用的介绍,并没有添加异常处置,异常环境还需本身考虑。
compile 'no.nordicsemi.android:dfu:0.6.3'
4.2.2 建立一个 DfuService 并注册
public class DfuService extends DfuBaseService {
@Override
protected Class getNotificationTarget() {
/*
* As a target activity the NotificationActivity is returned, not the MainActivity. This is because the notification must create a new task:
*
* intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
*
* when user press it. Using NotificationActivity we can check whether the new activity is a root activity (that means no other activity was open before)
* or that there is other activity already open. In the later case the notificationActivity will just be closed. System will restore the previous activity.
* However if the application has been closed during upload and user click the notification a NotificationActivity will be launched as a root activity.
* It will create and start the main activity and terminate itself.
*
* This method may be used to restore the target activity in case the application was closed or is open. It may also be used to recreate an activity
* history (see NotificationActivity).
*/
return null;
}
}
4.2.3 建立一个 DfuProgressListener 并在对应的 Activity 中注册和反注册
DfuProgressListener 中会有良多的回调函数,在对应的回调函数中可以进行响应的操作,此中以下几个回调函数比力主要:
private final DfuProgressListener mDfuProgressListener = new DfuProgressListener() {
@Override
public void onDeviceConnecting(String deviceAddress) {
Log.i("dfu", "onDeviceConnecting");
}
@Override
public void onDeviceConnected(String deviceAddress) {
Log.i("dfu", "onDeviceConnected");
}
@Override
public void onDfuProcessStarting(String deviceAddress) {
Log.i("dfu", "onDfuProcessStarting");
}
@Override
public void onDfuProcessStarted(String deviceAddress) {
Log.i("dfu", "onDfuProcessStarted");
}
@Override
public void onEnablingDfuMode(String deviceAddress) {
Log.i("dfu", "onEnablingDfuMode");
}
@Override
public void onProgressChanged(String deviceAddress, int percent, float speed, float avgSpeed, int currentPart, int partsTotal) {
Log.i("dfu", "onProgressChanged");
Log.i("dfu", "onProgressChanged" + percent);
dfuDialogFragment.setProgress(percent);
}
@Override
public void onFirmwareValidating(String deviceAddress) {
Log.i("dfu", "onFirmwareValidating");
}
@Override
public void onDeviceDisconnecting(String deviceAddress) {
Log.i("dfu", "onDeviceDisconnecting");
}
@Override
public void onDeviceDisconnected(String deviceAddress) {
Log.i("dfu", "onDeviceDisconnected");
}
@Override
public void onDfuCompleted(String deviceAddress) {
Log.i("dfu", "onDfuCompleted");
stopDfu();
dfuDialogFragment.getProgressBar().setIndeterminate(true);
//进级成功,从头毗连设备
}
@Override
public void onDfuAborted(String deviceAddress) {
Log.i("dfu", "onDfuAborted");
//进级流产,掉败
}
@Override
public void onError(String deviceAddress, int error, int errorType, String message) {
Log.i("dfu", "onError");
stopDfu();
dfuDialogFragment.dismiss();
Toast.makeText(mContext, "进级掉败,请从头点击进级。", Toast.LENGTH_SHORT).show();
}
};
在 onResume 注册 mDfuProgressListener:
在 onPause 反注册 mDfuProgressListener:
new DfuServiceInitiator(mac_address)
.setDisableNotification(true)
.setZip(R.raw.testFile)
.start((getBaseContext()), DfuService.class);
5.从头毗连,自检
DFU 进级完成后,会有个完成的回调,我们就在这个回调里从头毗连设备了。我们的设备在进级后是需要自检的,需要对空,然而如许的事怎么可能交给用户操作呢,用户就是天主哇!所以呢,这也是为什么我们要在进级前保留自检所需的相关数据的原因了。当设备毗连成功后,我们就把数据写进去,最后写入一个强制自检经由过程的指令就年夜功乐成了!
PS:最后提醒大师,能不进级就别进级吧!android 的 Ble 进级就像场赌钱,很不不变,加上各类机型。当也有可能是我对异常环境没有做处置的原因吧,android Ble 的坑还有良多,祝列位小伙伴们开辟顺遂!
原创作品,如需转载,请与作者联系,不然将究查法令责任。
|
|