Flutter证书管理插件certabodriver的使用

Flutter证书管理插件certabodriver的使用

certabodriver Flutter包允许你快速将certabo-board连接到你的Android应用。

开始使用certabodriver + usb_serial

添加依赖项

pubspec.yaml文件中添加以下依赖项:

dependencies:
	certabodriver: ^0.0.4
	usb_serial: ^0.2.4

导入包

在你的Dart文件中导入以下包:

import 'package:certabodriver/certabodriver.dart';
import 'package:usb_serial/usb_serial.dart';

配置编译选项

android\app\build.gradle文件中添加以下配置:

android {
    ...
    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }
    ...
}

你可以选择执行更多步骤来启用与USB相关的功能。有关详细信息,请参阅我们依赖的包usb_serial

连接到已连接的板并监听其事件

List<UsbDevice> devices = await UsbSerial.listDevices();
print(devices);
if (devices.length == 0) {
  return;
}

List<UsbDevice> dgtDevices = devices.where((d) => d.vid == 4292).toList();
UsbPort usbDevice = await dgtDevices[0].create();
await usbDevice.open();

await usbDevice.setDTR(true);
await usbDevice.setRTS(true);

usbDevice.setPortParameters(38400, UsbPort.DATABITS_8, UsbPort.STOPBITS_1, UsbPort.PARITY_NONE);

CertaboCommunicationClient client = CertaboCommunicationClient(usbDevice.write);
usbDevice.inputStream.listen(client.handleReceive);

if (dgtDevices.length > 0) {
  // 连接到板并初始化
  CertaboBoard nBoard = new CertaboBoard();
  await nBoard.init(client);
  print("CertaboBoard connected");

  // 设置已连接的板
  setState(() {
    connectedBoard = nBoard;
  });
}

实战演示

为了快速了解如何使用该库,可以查看以下项目,该项目目前尚未开源。

完整示例代码

以下是完整的示例代码:

import 'package:certabodriver/CertaboBoard.dart';
import 'package:certabodriver/CertaboCommunicationClient.dart';
import 'package:certabodriver/LEDPattern.dart';
import 'package:flutter/material.dart';
import 'package:usb_serial/usb_serial.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(key: Key("home")),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({required Key key}) : super(key: key);

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  CertaboBoard? connectedBoard;

  void connect() async {
    List<UsbDevice> devices = await UsbSerial.listDevices();
    print(devices);
    if (devices.length == 0) {
      return;
    }

    List<UsbDevice> boardDevices = devices.where((d) => d.vid == 4292).toList();
    UsbPort? usbDevice = await boardDevices[0].create();
    if (usbDevice == null) return;
    await usbDevice.open();

    await usbDevice.setDTR(true);
    await usbDevice.setRTS(true);

    usbDevice.setPortParameters(38400, UsbPort.DATABITS_8, UsbPort.STOPBITS_1, UsbPort.PARITY_NONE);

    CertaboCommunicationClient client = CertaboCommunicationClient(CertaboConnectionType.USB, usbDevice.write);
    usbDevice.inputStream!.listen(client.handleReceive);
    
    if (boardDevices.length > 0) {
      // 连接到板并初始化
      CertaboBoard nBoard = new CertaboBoard();
      await nBoard.init(client);
      print("CertaboBoard connected");

      // 设置已连接的板
      setState(() {
        connectedBoard = nBoard;
      });
    }
  }

  Map<String, List<int>>? lastData;

  LEDPattern ledpattern = LEDPattern();

  void toggleLed(String square) {
    ledpattern.setSquare(square, !ledpattern.getSquare(square));
    connectedBoard!.setLEDs(ledpattern);
    setState(() {});
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    double width = MediaQuery.of(context).size.width;
    return Scaffold(
      appBar: AppBar(
        title: Text("certabodriver example"),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          Center(child: TextButton(
            child: Text(connectedBoard == null ? "Try to connect to board" : "Connected"),
            onPressed: connectedBoard == null ? connect : null,
          )),
          Center( child: StreamBuilder(
            stream: connectedBoard?.getBoardUpdateStream(),
            builder: (context, AsyncSnapshot<Map<String, List<int>>> snapshot) {
              if (!snapshot.hasData && lastData == null) return Text("- no data -");

              Map<String, List<int>>? fieldUpdate = snapshot.data ?? lastData;
              lastData = fieldUpdate;
              List<Widget> rows = [];
              
              for (var i = 0; i < 8; i++) {
                List<Widget> cells = [];
                for (var j = 0; j < 8; j++) {
                    MapEntry<String, List<int>> entry = fieldUpdate!.entries.toList()[i * 8 + j];
                    cells.add(
                      TextButton(
                        onPressed: () => toggleLed(entry.key),
                        style: TextButton.styleFrom(
                          padding: EdgeInsets.zero,
                          minimumSize: Size(width / 8 - 4, width / 8 - 4),
                          alignment: Alignment.centerLeft
                        ),
                        child: Container(
                          padding: EdgeInsets.only(bottom: 2),
                          width: width / 8 - 4,
                          height: width / 8 - 4,
                          child: DecoratedBox(
                            decoration: BoxDecoration(
                              borderRadius: BorderRadius.circular(2),
                              color: ledpattern.getSquare(entry.key) ? Colors.blueAccent : Colors.black54,
                            ),
                            child: Column(
                              mainAxisAlignment: MainAxisAlignment.center,
                              children: [
                                Text(entry.key, style: TextStyle(color: Colors.white)),
                                Text("[" + entry.value.join(", ") + "]", style: TextStyle(color: Colors.white, fontSize: 8)),
                              ],
                            )
                          ),
                        ),
                      )
                    );
                }
                rows.add(Row(
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                  children: cells,
                ));
              }

              return Column(
                children: rows,
              );
            }
          )),
        ],
      ),
    );
  }
}

更多关于Flutter证书管理插件certabodriver的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


certabodriver 是一个用于在 Flutter 应用中进行证书管理的插件。它允许开发者管理和使用客户端证书进行安全通信,通常用于需要客户端认证的 HTTPS 请求。以下是如何使用 certabodriver 插件的基本步骤:

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 certabodriver 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  certabodriver: ^1.0.0  # 请使用最新版本

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

2. 导入插件

在你的 Dart 文件中导入 certabodriver 插件:

import 'package:certabodriver/certabodriver.dart';

3. 初始化插件

在使用插件之前,通常需要对其进行初始化。你可以在 main 函数或应用启动时进行初始化:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await CertaboDriver.initialize();
  runApp(MyApp());
}

4. 加载证书

你可以使用 CertaboDriver 来加载和管理证书。以下是一个加载证书的示例:

void loadCertificate() async {
  try {
    final certificate = await CertaboDriver.loadCertificate(
      certificatePath: 'assets/certificate.pem',  // 证书文件路径
      privateKeyPath: 'assets/private_key.pem',  // 私钥文件路径
      password: 'your_password',  // 证书密码(如果有)
    );

    print('Certificate loaded: $certificate');
  } catch (e) {
    print('Failed to load certificate: $e');
  }
}

5. 使用证书进行 HTTPS 请求

加载证书后,你可以使用它来进行 HTTPS 请求。以下是一个使用 http 包进行 HTTPS 请求的示例:

import 'package:http/http.dart' as http;

void makeSecureRequest() async {
  final client = http.Client();
  
  try {
    final response = await client.get(
      Uri.parse('https://your-secure-api.com'),
      headers: {
        'Authorization': 'Bearer your_token',
      },
    );

    print('Response status: ${response.statusCode}');
    print('Response body: ${response.body}');
  } catch (e) {
    print('Failed to make request: $e');
  } finally {
    client.close();
  }
}

6. 处理证书错误

在进行证书管理时,可能会遇到各种错误,例如证书格式错误、私钥不匹配等。你可以使用 try-catch 块来捕获和处理这些错误:

void manageCertificate() async {
  try {
    final certificate = await CertaboDriver.loadCertificate(
      certificatePath: 'assets/certificate.pem',
      privateKeyPath: 'assets/private_key.pem',
      password: 'your_password',
    );

    print('Certificate loaded: $certificate');
  } catch (e) {
    print('Certificate management error: $e');
  }
}

7. 释放资源

在应用关闭或不再需要证书时,记得释放相关资源:

void disposeCertificate() async {
  await CertaboDriver.dispose();
}
回到顶部