查看: 868|回复: 1

android Ble开辟的那些事(四)—— OTA进级

[复制链接]
发表于 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 的坑还有良多,祝列位小伙伴们开辟顺遂!
原创作品,如需转载,请与作者联系,不然将究查法令责任
发表于 2016-9-2 15:23:16 |
返回顶部快速回复上一主题下一主题返回列表

声远论坛|联系电话:0537-2311005|Archiver|手机版|小黑屋|Sitemap|声远网 |网站地图|网站地图

鲁公网安备 37089702000485号 | 鲁ICP备 18028751号 | 互联网药品信息服务资格证:(鲁)-经营性-2022-0209 | 增值电信业务经营许可证:鲁B2-20230761号 | (鲁)职介证字[223]:第08120014号

中国互联网违法和不良信息举报中心 | 山东省互联网违法和不良信息举报中心 | 人工智能生成合成内容标识办法

GMT+8, 2026-6-2 03:43, Processed in 0.066766 second(s), 25 queries , Gzip On, APCu On.

Powered by Discuz! X3.5© 2001-2026 SYUAN.COM

快速回复 返回顶部 返回列表