Flutter固件更新插件flutter_ota的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter固件更新插件flutter_ota的使用

flutter_ota 是一个用于通过Flutter应用程序对ESP32设备进行无线(Over-The-Air, OTA)更新的插件。它简化了BLE通信和OTA更新过程,提供了用户友好的体验。

功能特性

  • 支持从二进制文件或URL进行固件更新。
  • 实现了一个进度流来跟踪更新进度。
  • 兼容不同的固件类型。
  • 使用Bluetooth Low Energy (BLE)与ESP32设备通信。

安装步骤

  1. 在你的pubspec.yaml文件中添加以下依赖:

    dependencies:
      flutter_ota: ^1.0.0
    
  2. 运行以下命令安装包:

    pub get
    

使用方法

1. 导入必要的库

import 'package:flutter_ota/flutter_ota.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';

2. 连接到ESP32设备

使用flutter_blue_plus包连接到ESP32设备。

3. 创建Esp32OtaPackage实例

提供必要的特征值(characteristics):

// 替换为你的ESP32 BLE服务和特征的实际UUIDs
BluetoothService service = ...;
BluetoothCharacteristic dataCharacteristic = ...;
BluetoothCharacteristic notifyCharacteristic = ...;

Esp32OtaPackage otaPackage = Esp32OtaPackage(notifyCharacteristic, dataCharacteristic);

4. 选择固件更新类型和固件类型

根据需要设置updateTypefirmwareType

5. 如果firmwareType设为1,则提供二进制固件文件路径;如果设为3,则提供固件下载URL。

6. 调用updateFirmware方法

await otaPackage.updateFirmware(
  device,
  updateType,
  firmwareType,
  service,
  dataCharacteristic,
  notifyCharacteristic,
  binFilePath: binFilePath,
  url: url,
);

7. 监听percentageStream以追踪更新进度

StreamSubscription subscription = otaPackage.percentageStream.listen((progress) {
  print('OTA update progress: $progress%');
});

// 更新UI...

await subscription.cancel();

8. 检查firmwareUpdate属性确定更新是否成功

if (otaPackage.firmwareUpdate) {
  print('OTA update successful');
} else {
  print('OTA update failed');
}

示例代码

下面是一个完整的示例,展示了如何使用flutter_ota包启动OTA更新:

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:flutter_ota/flutter_ota.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: NewOTAUpdatePage(),
    );
  }
}

class NewOTAUpdatePage extends StatefulWidget {
  @override
  _NewOTAUpdatePageState createState() => _NewOTAUpdatePageState();
}

class _NewOTAUpdatePageState extends State<NewOTAUpdatePage> {
  // 假设HomePageController已经初始化并包含了gBleDevice和gBleServices
  HomePageController homePageController = HomePageController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("OTA Update")),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Center(
            child: FeedbackEnabledButton(
              onTap: () async {
                BluetoothDevice? device = homePageController.gBleDevice;
                List<BluetoothService> services = homePageController.gBleServices;

                if (device == null || services.isEmpty) {
                  print("设备未连接或服务不可用");
                  return;
                }

                for (var service in services) {
                  // 根据实际UUID调整
                  if (service.uuid.toString() == 'fb1e4001-54ae-4a28-9f74-dfccb248601d') {
                    var characteristics = service.characteristics;
                    BluetoothCharacteristic? notifyUuid, writeUuid;

                    for (var c in characteristics) {
                      if (c.uuid.toString() == 'fb1e4003-54ae-4a28-9f74-dfccb248601d') {
                        notifyUuid = c;
                      } else if (c.uuid.toString() == 'fb1e4002-54ae-4a28-9f74-dfccb248601d') {
                        writeUuid = c;
                      }
                    }

                    if (notifyUuid != null && writeUuid != null) {
                      Esp32OtaPackage esp32otaPackage = Esp32OtaPackage(notifyUuid, writeUuid);

                      await esp32otaPackage.updateFirmware(
                        device,
                        2, // Update Type
                        2,
                        service,
                        notifyUuid,
                        writeUuid,
                        binFilePath: "assets/helllo.ino.bin",
                      );

                      showDialog(
                        context: context,
                        builder: (_) => AlertDialog(
                          title: Text('OTA Update Progress'),
                          content: StreamBuilder<int>(
                            stream: esp32otaPackage.percentageStream,
                            builder: (_, snapshot) {
                              double progress = snapshot.data?.toDouble() ?? 0.0;
                              return LinearProgressIndicator(value: progress / 100);
                            },
                          ),
                        ),
                      );
                    }
                  }
                }
              },
            ),
          ),
        ],
      ),
    );
  }
}

// 假设的HomePageController类定义
class HomePageController {
  BluetoothDevice? gBleDevice;
  List<BluetoothService> gBleServices = [];
}

请注意,以上代码仅为演示目的,并假设了一些前置条件如设备和服务已预先获取。在实际应用中,你需要确保这些数据正确无误地被填充。


更多关于Flutter固件更新插件flutter_ota的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter固件更新插件flutter_ota的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用flutter_ota插件来实现固件更新的示例代码。请注意,这个示例假设你已经有一个Flutter项目,并且已经添加了flutter_ota插件到你的pubspec.yaml文件中。

首先,确保你的pubspec.yaml文件中包含以下依赖项:

dependencies:
  flutter:
    sdk: flutter
  flutter_ota: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖项。

接下来,我们需要在Flutter代码中实现固件更新的逻辑。以下是一个基本的示例,展示如何使用flutter_ota插件来检查、下载和安装新的固件。

import 'package:flutter/material.dart';
import 'package:flutter_ota/flutter_ota.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter OTA Example'),
        ),
        body: Center(
          child: OTAExample(),
        ),
      ),
    );
  }
}

class OTAExample extends StatefulWidget {
  @override
  _OTAExampleState createState() => _OTAExampleState();
}

class _OTAExampleState extends State<OTAExample> {
  String status = "Initial State";

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text(status),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: () async {
            // 检查固件更新
            bool updateAvailable = await FlutterOta.checkForUpdate();
            setState(() {
              status = updateAvailable ? "Update Available" : "No Update Available";
            });

            if (updateAvailable) {
              // 下载固件
              FlutterOtaDownloadResult downloadResult = await FlutterOta.downloadUpdate();
              if (downloadResult.success) {
                setState(() {
                  status = "Download Complete";
                });

                // 安装固件
                FlutterOtaInstallResult installResult = await FlutterOta.installUpdate();
                if (installResult.success) {
                  setState(() {
                    status = "Install Complete. Please restart the app.";
                  });
                } else {
                  setState(() {
                    status = "Install Failed: ${installResult.error}";
                  });
                }
              } else {
                setState(() {
                  status = "Download Failed: ${downloadResult.error}";
                });
              }
            }
          },
          child: Text('Check for Update'),
        ),
      ],
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它有一个按钮用于检查固件更新。当点击按钮时,应用会:

  1. 使用FlutterOta.checkForUpdate()方法检查是否有新的固件更新。
  2. 如果有更新可用,使用FlutterOta.downloadUpdate()方法下载固件。
  3. 下载完成后,使用FlutterOta.installUpdate()方法安装固件。

请注意,这个示例中的错误处理和用户交互可能需要根据实际的应用需求进行更详细的实现。此外,flutter_ota插件的具体方法和功能可能会根据插件的版本和文档有所不同,因此请务必查阅最新的插件文档和API参考。

最后,请确保在发布应用前,对固件更新流程进行充分的测试,以确保其可靠性和安全性。

回到顶部