nRF Connect Device Manager library is a Flutter plugin based on Android and iOS nRF Connect Device Manager libraries.
- Android:
minSdkVersion 19 - iOS:
13.0
Use UpdateManagerFactory to create an instance of FirmwareUpdateManager:
final managerFactory: UpdateManagerFactory = FirmwareUpdateManagerFactory() // `deviceId` is a String with the device's MAC address (on Android) or UUID (on iOS) final updateManager = await managerFactory.getUpdateManager(deviceId); // call `setup` before using the manager final updateStream = updateManager.setup();To update the device, call update method on the FirmwareUpdateManager instance:
// `firmware` is a List of Image objects List<Image> firmwareImages = []; for (final file in manifest.files) { final image = Image( image: file.image, data: firmwareFileData, ); firmwareImages.add(image); } final configuration = const FirmwareUpgradeConfiguration( estimatedSwapTime: const Duration(seconds: 0), byteAlignment: ImageUploadAlignment.fourByte, eraseAppSettings: true, pipelineDepth: 1, ); // `configuration` is an optional parameter. If not provided, default values will be used. updateManager.update(firmwareImages, configuration: configuration);Alternatively, you can use updateWithImageData to update the device with a single image data:
await updateManager.updateWithImageData(image: fwImage!);Tip
update and updateWithImageData methods are asynchronous, however, they do not return a result of the update process. They only start the update process. To listen for updates, subscribe to the updateStream and progressStream. See also Issue #63 for more information.
To listen for updates, subscribe to the updateStream and progressStream:
updateManager.updateStateStream?.listen((event) { if (event == FirmwareUpgradeState.success) { print("Update Success"); } else { print(event); } }); updateManager.progressStream.listen((event) { print("${event.bytesSent} / ${event.imageSize}} bytes sent"); });To control the update, use FirmwareUpdateManager methods:
/// Pause the update process. Future<void> pause(); /// Resume the update process. Future<void> resume(); /// Cancel update. Future<void> cancel(); /// Check if the progress is in process. Future<bool> inProgress(); /// Check if the progress is paused. Future<bool> isPaused();After the update is finished, call kill to kill the manager, otherwise it will lead to memory leaks and other issues:
updateManager.kill();To listen for logs, subscribe to the logger.logMessageStream:
updateManager.logger.logMessageStream .where((log) => log.level.rawValue > 1) // filter out debug messages .listen((log) { print(log.message); });To read logs from the device, use readLog method:
List<McuLogMessage> logs = await updateManager.logger.readLogs(clearLogs: false);