Android BLE dfu升级
dfu升级适用于nordic nRF51 nRF52 的系统,github上提供了相关升级的库https://github.com/NordicSemiconductor/Android-DFU-Library 支持 Android 4.3+
gradle配置如下:
implementation 'no.nordicsemi.android:dfu:1.8.1'
在使用前请先配置好BLE的相关权限以及动态权限 读写权限 定位等可以使用EasyPermission配置
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
第一步 我们创建一个service集成DfuBaseService
public class DfuService extends DfuBaseService {
public DfuService() {
}
@Override
protected Class<? extends Activity> getNotificationTarget() {
return NotificationActivity.class;
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
第二步 创建一个NotificationActivity
public class NotificationActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// If this activity is the root activity of the task, the app is not running
if (isTaskRoot()) {
// Start the app before finishing
final Intent intent = new Intent(this, UpdateZipActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtras(getIntent().getExtras()); // copy all extras
startActivity(intent);
}
// Now finish, which will drop you to the activity at which you were at the top of the task stack
finish();
}
}
其中UpdateZipActivity即为处理升级业务的界面
在这里要根据你的业务需求来,可以把升级包打包在apk里,也可以做成下载后升级的情况
如果是打包在apk里可以按下面做,如果你是下载的情况只需要改starter.setZip(uri, path); 传入文件uri和路径即可
private DfuServiceInitiator starter;
starter = new DfuServiceInitiator(mac).setDeviceName("Smart Lock").setKeepBond(false).setPacketsReceiptNotificationsEnabled(true).setPacketsReceiptNotificationsValue(10);
// If you want to have experimental buttonless DFU feature supported call additionally:
starter.setUnsafeExperimentalButtonlessServiceInSecureDfuEnabled(true);
starter.setZip(R.raw.update24); //setDeviceName为设备过滤条件 setzip传入raw文件的路径即可
@Override
protected void onResume() {
DfuServiceListenerHelper.registerProgressListener(this, mDfuProgressListener); //监听升级进度
starter.start(this, DfuService.class); //启动升级服务
}
/**
* dfu升级监听
*/
private final DfuProgressListener mDfuProgressListener = new DfuProgressListener() {
@Override
public void onDeviceConnecting(String deviceAddress) {
Log.i("dfu", "onDeviceConnecting");
proBar.setIndeterminate(true);
airUpgradeTv.setText(R.string.dfu_status_connecting);
} @Override
public void onDeviceConnected(String deviceAddress) { } @Override
public void onDfuProcessStarting(String deviceAddress) {
proBar.setIndeterminate(true);
airUpgradeTv.setText(R.string.dfu_status_starting);
} @Override
public void onDfuProcessStarted(String deviceAddress) {
Log.i("dfu", "onDfuProcessStarted");
} @Override
public void onEnablingDfuMode(String deviceAddress) {
Log.i("dfu", "onEnablingDfuMode");
proBar.setIndeterminate(true);
airUpgradeTv.setText(R.string.dfu_status_switching_to_dfu);
} @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);
proBar.setProgress(percent);
proBar.setIndeterminate(false);
airUpgradeTv.setText(percent + "%");
} @Override
public void onFirmwareValidating(String deviceAddress) {
Log.i("dfu", "onFirmwareValidating");
proBar.setIndeterminate(true);
airUpgradeTv.setText(R.string.dfu_status_validating);
} @Override
public void onDeviceDisconnecting(String deviceAddress) {
Log.i("dfu", "onDeviceDisconnecting");
} @Override
public void onDeviceDisconnected(String deviceAddress) {
Log.i("dfu", "onDeviceDisconnected");
proBar.setIndeterminate(true);
airUpgradeTv.setText(R.string.dfu_status_disconnecting); } @Override
public void onDfuCompleted(String deviceAddress) { airUpgradeTv.setText(R.string.dfu_status_completed);
proBar.setProgress(100);
proBar.setIndeterminate(false);
//升级成功
new Handler().postDelayed(new Runnable() {
@Override
public void run() { // if this activity is still open and upload process was completed, cancel the notification
final NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(DfuService.NOTIFICATION_ID); }
},200); } @Override
public void onDfuAborted(String deviceAddress) {
Log.i("dfu", "onDfuAborted");
//升级流产,失败
airUpgradeTv.setText(R.string.dfu_status_aborted);
// let's wait a bit until we cancel the notification. When canceled immediately it will be recreated by service again.
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Toast.makeText(UpdateZipActivity.this, "升级出错", Toast.LENGTH_SHORT).show();
// if this activity is still open and upload process was completed, cancel the notification
final NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(DfuService.NOTIFICATION_ID);
}
}, 200); } @Override
public void onError(String deviceAddress, int error, int errorType, String message) {
Log.i("dfu", "onError"); airUpgradeTv.setText(getString(R.string.dfu_status_aborted));
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// if this activity is still open and upload process was completed, cancel the notification
final NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(DfuService.NOTIFICATION_ID); }
}, 200); }
@Override
protected void onPause() {
//取消监听
DfuServiceListenerHelper.unregisterProgressListener(this, mDfuProgressListener);
super.onPause();
}
Android BLE dfu升级的更多相关文章
- BLE空中升级 谈(二)
BLE 空中升级谈 -- CC2541 的产品开发中OAD注意事项(续) TI CC2541支持多个硬件,多个软件对它进行空中升级,可以有不同的组合,硬件有 编号 名称 Hex 用法 1 Cc2540 ...
- Android BLE蓝牙详细解读
代码地址如下:http://www.demodashi.com/demo/15062.html 随着物联网时代的到来,越来越多的智能硬件设备开始流行起来,比如智能手环.心率检测仪.以及各式各样的智能家 ...
- nrf52——DFU升级USB/UART升级方式详解(基于SDK开发例程)
摘要:在前面的nrf52--DFU升级OTA升级方式详解(基于SDK开发例程)一文中我测试了基于蓝牙的OTA,本文将开始基于UART和USB(USB_CDC_)进行升级测试. 整体升级流程: 整个过程 ...
- nrf52——DFU升级OTA升级方式详解(基于SDK开发例程)
在我们开始前,默认你已经安装好了一些基础工具,如nrfutil,如果你没有安装过请根据官方中文博客去安装好这些基础工具,连接如下:Nordic nRF5 SDK开发环境搭建(nRF51/nRF52芯片 ...
- Android BLE 蓝牙低功耗教程,中央BluetoothGatt和周边BluetoothGattServer的实现
http://blog.csdn.net/wave_1102/article/details/39271693 分类: Android(105) 作者同类文章X Android4.3 规范了BLE的A ...
- 蓝牙4.0——Android BLE开发官方文档翻译
ble4.0开发整理资料_百度文库 http://wenku.baidu.com/link?url=ZYix8_obOT37JUQyFv-t9Y0Sv7SPCIfmc5QwjW-aifxA8WJ4iW ...
- android开发 更新升级安装到一半自动闪退
如题:android开发 更新升级安装到一半自动闪退,,,解决办法,如下(红色为我新增的代码) /** * 安装APK文件 */ private void installApk( ...
- 【转】蓝牙4.0——Android BLE开发官方文档翻译
原文网址:http://ricardoli.com/2014/07/31/%E8%93%9D%E7%89%9940%E2%80%94%E2%80%94android-ble%E5%BC%80%E5%8 ...
- Android ble 蓝牙4.0 总结
本文介绍Android ble 蓝牙4.0,也就是说API level >= 18,且支持蓝牙4.0的手机才可以使用,如果手机系统版本API level < 18,也是用不了蓝牙4.0的哦 ...
随机推荐
- widerface---VOC
import os, h5py, cv2, sys, shutil import numpy as np from xml.dom.minidom import Document rootdir = ...
- scrapy数据存储在mysql数据库的两种方式
方法一:同步操作 1.pipelines.py文件(处理数据的python文件) import pymysql class LvyouPipeline(object): def __init__(se ...
- 函数调用模式,this指向
## 函数的四种调用模式 1.函数模式 this--->window function test(){ console.log(this); } test(): 2.方法模式 thi ...
- CSS设计模式
关于web设计的网站 https://www.smashingmagazine.com/
- git 拉取远程代码
git 拉取远程代码 || 利用vscode编辑器自带了git,可在ctrl+~打开控制台拉取代码,非常好用哦~在实际项目开发过程中,往往是已经存在远程项目了,我们定义的需求是只需要简单的操作git, ...
- 【C/C++】C++11 Lambda
Lambda C++11 中 lambda 是一个匿名函数对象 最简形式 []{ cout << "lambda" << endl; }(); // pri ...
- 微信或QQ屏蔽域名,爆红域名如何在微信打开,如何进行微信域名防封?
近很多朋友都会遇到这个问题,为什么我的微信域名或者QQ域名怎么总是提示拦截呢?在这里跟大家说一下吧: 第一点:就是域名里面的内容违规或者诱导被举报而导致的拦截 第二点:就是被用户或者同行恶意举报而导致 ...
- 关于在UNIcode环境下得TCHAR转string类型以及string转TCHAR
using namespace System::Text: String ^TCHARtoStr(TCHAR *temp) //TCHAR转String { array<unsigned cha ...
- springboot秒杀课程学习整理1-2
1)从数据库到前端,做了三层转换,最后统一返回给前端的格式 DO-> model: 放在service中,目的是为了组装来自于数据库的数据,有些字段来自于不同的表的取,这一层相当于真正的业务模型 ...
- 常见IO模型
在socket的通信中,recv,accept,recvfrom(UDP协议接收信息)这些阶段由于需要收到信息,才能继续下面的代码,所以这些阶段叫做阻塞,类似于我们python变成中的input函数, ...