Flutter DTLS协议支持插件dart_tinydtls_libs的使用

Flutter DTLS协议支持插件dart_tinydtls_libs的使用

dart_tinydtls_libs

提供了tinyDTLS二进制文件,用于为Flutter应用程序添加DTLS支持。

使用方法

此库可以用来分发tinyDTLS二进制文件,这些文件可以在Flutter应用中被dart_tinydtls客户端和服务端包装器使用。

该库仅包含预编译的动态库,可用于Linux、Android和Windows平台。更多关于如何使用此库的信息,请参见dart_tinydtls文档。

安装

在你选择的终端中运行以下命令:

flutter pub add dart_tinydtls_libs

为了实际使用该库,还需要安装dart_tinydtls,它提供了ffi绑定和围绕tinyDTLS的惯用包装器。

第三方代码

该库包含针对Linux、Android和Windows平台的tinyDTLS编译二进制文件。

更多信息请参见下一节。

许可证

与tinyDTLS C库的许可证匹配,本库既可以根据Eclipse公共许可证v1.0条款也可以根据3-Clause BSD许可证条款提供。 此外,tinyDTLS C库包含可能包含在与tinyDTLS链接的编译二进制文件中的第三方代码。 有关第三方代码及其许可证的信息,请参见: https://github.com/eclipse/tinydtls/blob/develop/ABOUT.md 有关tinyDTLS许可条款的更多信息,请参见: https://github.com/eclipse/tinydtls/blob/develop/LICENSE 有关EPL 1.0的更多信息,请参见: https://www.eclipse.org/legal/eplfaq.php

注意:该库不受Eclipse基金会的支持或认可。

维护者

该项目目前由以下开发者维护:

姓名 邮箱地址 GitHub用户名
Jan Romann jan.romann@uni-bremen.de JKRhb
Falko Galperin falko1@uni-bremen.de falko17

示例代码

以下是一个简单的示例,展示了如何使用dart_tinydtls_libsdart_tinydtls插件来创建一个带有DTLS支持的Flutter应用。

// Copyright 2022 The NAMIB Project Developers. All rights reserved.
// See the README as well as the LICENSE file for more information.
//
// SPDX-License-Identifier: EPL-1.0 OR BSD-3-CLAUSE

import 'dart:convert';
import 'dart:io';
import 'dart:math';

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

final random = Random();

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

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  int _responseCounter = 0;

  String? _response = "No Response";

  bool _sending = false;

  // FIXME(JKRhb): 在多次交换后,tinyDTLS遇到了一些错误。
  // 因此,此示例应被视为当前的一个概念证明,但在后续版本中会修复。
  void _sendRequest() async {
    setState(() {
      _sending = true;
    });

    const address = "::1"; // IPv6 localhost
    final port = random.nextInt(1 << 16); // 生成一个随机端口

    // 创建服务器
    final server = await DtlsServer.bind(InternetAddress.anyIPv6, port,
        keyStore: {"Client_identity": "secretPSK"}); // 使用预共享密钥(PSK)
    server.listen((connection) {
      connection.listen((event) {
        setState(() {
          _responseCounter++;
        });
        final response =
            "${utf8.decode(event.data)} Response $_responseCounter";
        connection.send(utf8.encode(response)); // 发送响应
      });
    });

    // 创建客户端
    final client = await DtlsClient.bind(InternetAddress.anyIPv6, 0);

    final pskCredentials = PskCredentials("Client_identity", "secretPSK"); // 配置PSK认证

    final connection = await client.connect(InternetAddress(address), port,
        pskCredentials: pskCredentials, eventListener: (event) {
      if (event == DtlsEvent.dtlsEventCloseNotify) {
        client.close(); // 关闭连接
      }
    });
    connection
      ..listen((event) {
        server.close(); // 关闭服务器
        setState(() {
          _response = utf8.decode(event.data); // 更新响应文本
        });
      })
      ..send(utf8.encode('Hello World')); // 发送请求消息
    _sending = false;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Text('Request counter: $_responseCounter\n'
              'Response: $_response'), // 显示请求计数器和响应信息
        ),
        floatingActionButton: IconButton(
            onPressed: !_sending ? _sendRequest : null, // 控制按钮是否可用
            icon: const Icon(Icons.send)), // 发送按钮图标
      ),
    );
  }
}

更多关于Flutter DTLS协议支持插件dart_tinydtls_libs的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter DTLS协议支持插件dart_tinydtls_libs的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中,如果你想使用 DTLS(Datagram Transport Layer Security)协议,可以通过使用 dart_tinydtls_libs 插件来实现。这个小型的库提供了对 DTLS 的支持,允许你在 Dart 中处理 DTLS 加密的 UDP 通信。

以下是使用 dart_tinydtls_libs 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  dart_tinydtls_libs: ^0.1.0  # 使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 使用 dart_tinydtls_libs

dart_tinydtls_libs 是一个底层的库,它提供了对 DTLS 的基本支持。你可以使用它来创建 DTLS 客户端或服务器。

示例:创建 DTLS 客户端

import 'dart:io';
import 'package:dart_tinydtls_libs/dart_tinydtls_libs.dart';

void main() async {
  // 初始化 DTLS 库
  initializeTinyDTLS();

  // 创建一个 UDP 套接字
  var socket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 0);

  // 创建 DTLS 客户端
  var dtls = DTLSClient(
    socket: socket,
    host: 'example.com',
    port: 5684,
    psk: 'your-pre-shared-key',
    identity: 'client-id',
  );

  // 连接到服务器
  await dtls.connect();

  // 发送数据
  dtls.send('Hello DTLS Server!'.codeUnits);

  // 接收数据
  socket.listen((event) {
    if (event == RawSocketEvent.read) {
      var datagram = socket.receive();
      if (datagram != null) {
        print('Received: ${String.fromCharCodes(datagram.data)}');
      }
    }
  });

  // 关闭连接
  await dtls.close();
}

示例:创建 DTLS 服务器

import 'dart:io';
import 'package:dart_tinydtls_libs/dart_tinydtls_libs.dart';

void main() async {
  // 初始化 DTLS 库
  initializeTinyDTLS();

  // 创建一个 UDP 套接字
  var socket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 5684);

  // 创建 DTLS 服务器
  var dtls = DTLSServer(
    socket: socket,
    psk: 'your-pre-shared-key',
    identity: 'server-id',
  );

  // 监听连接
  dtls.listen((client) {
    print('New DTLS client connected: ${client.remoteAddress.address}:${client.remotePort}');

    // 接收数据
    client.listen((data) {
      print('Received from client: ${String.fromCharCodes(data)}');

      // 发送响应
      client.send('Hello DTLS Client!'.codeUnits);
    }, onDone: () {
      print('Client disconnected');
    });
  });

  // 关闭服务器
  await dtls.close();
}
回到顶部