Flutter插件libzt_flutter的使用方法介绍

Flutter插件libzt_flutter的使用方法介绍

libzt_flutter

<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" class="inline-block align-middle"> <rect x="2" y="2" width="16" height="16" rx="3" fill="currentColor"/> <line x1="11" y1="8" x2="11" y2="12" stroke="currentColor" stroke-width="2"/> <line x1="8" y1="11" x2="12" y2="11" stroke="currentColor" stroke-width="2"/> </svg> [![pub package](https://img.shields.io/pub/v/libzt_flutter.svg)](https://pub.dartlang.org/packages/libzt_flutter)

Flutter插件提供对libzt库的绑定。使用了dart:ffi

此包已更新至最新版本的libzt库和Flutter库。目前iOS支持正在开发中。

支持的平台

  • Android(完全支持)
  • iOS(进行中)

要支持额外的平台:

  1. 必须创建一个包含默认内容的平台特定文件夹。
  2. 必须在平台文件夹内的相应平台构建过程中包含从libzt编译的库文件。
  3. 必须更新loader.dart以包含新平台。

更多信息可以查看libzt_flutter GitHub Issues

Flutter插件libzt_flutter的使用方法

更多详细用法,请参见example文件夹。还可以参考ZeroTier Sockets教程

目前,仅实现了客户端TCP套接字。

示例代码

import 'package:libzt_flutter/libzt_flutter.dart';
import 'package:path_provider/path_provider.dart';

Future<void> startNodeAndConnectToNetwork(String networkId) async {
  // 获取节点实例
  var node = ZeroTierNode.instance;

  // 设置持久化存储路径以便缓存身份和网络配置
  // 也可以使用initSetIdentity从内存中设置身份,但网络配置不会被缓存
  var appDocPath = (await getApplicationDocumentsDirectory()).path + '/zerotier_node';
  node.initSetPath(appDocPath);
  
  // 尝试启动
  var result = node.start();
  if (!result.success) {
    throw Exception('Failed to start node: $result');
  } 
  
  await node.waitForOnline();

  // 解析网络ID
  var nwId = BigInt.parse(networkId, radix: 16);
  
  // 加入网络
  result = node.join(nwId);
  if (!result.success) {
    throw Exception('Failed to join network: $result');
  }
  
  await node.waitForNetworkReady(nwId);
  await node.waitForAddressAssignment(nwId);
 
  // 获取网络信息
  var networkInfo = node.getNetworkInfo(nwId);
  print(networkInfo.name);
  print(networkInfo.address);
  print(networkInfo.id);

  ZeroTierSocket socket;
  try {
    // 连接套接字
    socket = await ZeroTierSocket.connect('10.144.242.244', 22);
  } catch (e) {
    print('Failed to connect socket: $e');
    socket.close();
    return;
  }
  
  // 发送数据
  socket.sink.add([1, 2, 3, 4, 5]);

  // 监听数据
  socket.stream.listen((data) => print('received ${data.length} byte(s)'));

  // 检测套接字关闭
  socket.done.then((_) => print('socket closed'));
  
  // 不要忘记关闭套接字
  socket.close();
}

示例项目

main.dart

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

import 'zt_http.dart';
import 'zt_node.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'ZeroTier Flutter App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

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

class MyHomePageState extends State<MyHomePage> {
  ZeroTierNetwork? _networkInfo;
  String _response = '';
  bool _isLoading = false;

  [@override](/user/override)
  void initState() {
    super.initState();
    ZtNode.instance.init(networkId: '9f77fc393ec1bb8a').then((network) {
      setState(() {
        _networkInfo = network;
      });
    }).catchError((e) {
      debugPrint('Error: $e');
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('ZeroTier Flutter App'),
      ),
      body: SafeArea(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            const SizedBox(height: 20),
            if (_networkInfo != null)
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Text(
                  'Network Info: ${_networkInfo.toString()}',
                  textAlign: TextAlign.center,
                  style: const TextStyle(fontSize: 16),
                ),
              ),
            if (_networkInfo == null)
              const Text(
                'Loading network information...',
                style: TextStyle(fontSize: 16),
              ),
            const SizedBox(height: 20),
            if (_isLoading)
              const CircularProgressIndicator(),
            if (!_isLoading && _response.isNotEmpty)
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Text(
                  'Response: $_response',
                  textAlign: TextAlign.center,
                  style: const TextStyle(fontSize: 16),
                ),
              ),
            if (!_isLoading && _response.isEmpty)
              const Text(
                'No response yet...',
                style: TextStyle(fontSize: 16),
              ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          setState(() {
            _isLoading = true;
          });

          final response = await ZtHttp().request(
            host: '172.30.224.224',
            port: 3000,
            method: 'GET',
            path: '/',
          );

          setState(() {
            _isLoading = false;
            _response =
                response?.toString() ?? 'No response';
          });
        },
        tooltip: 'Send Data',
        child: const Icon(Icons.add),
      ),
    );
  }
}

更多关于Flutter插件libzt_flutter的使用方法介绍的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


libzt_flutter 是一个用于在 Flutter 应用中集成 ZeroTier 网络的插件。ZeroTier 是一个用于创建虚拟局域网(VLAN)的开源软件,允许设备通过互联网安全地连接,就像它们在同一个本地网络中一样。通过 libzt_flutter,你可以在 Flutter 应用中直接使用 ZeroTier 的网络功能。

1. 安装 libzt_flutter

首先,你需要在 pubspec.yaml 文件中添加 libzt_flutter 依赖:

dependencies:
  flutter:
    sdk: flutter
  libzt_flutter: ^0.1.0  # 请检查最新版本

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

2. 初始化 ZeroTier

在使用 libzt_flutter 之前,你需要初始化 ZeroTier 客户端。通常,你需要在应用启动时进行初始化:

import 'package:libzt_flutter/libzt_flutter.dart';

void initializeZeroTier() async {
  try {
    await Libzt.init();
    print("ZeroTier initialized successfully");
  } catch (e) {
    print("Failed to initialize ZeroTier: $e");
  }
}

3. 加入 ZeroTier 网络

初始化之后,你可以使用 joinNetwork 方法加入一个 ZeroTier 网络:

void joinZeroTierNetwork(String networkId) async {
  try {
    await Libzt.joinNetwork(networkId);
    print("Joined ZeroTier network successfully");
  } catch (e) {
    print("Failed to join ZeroTier network: $e");
  }
}

4. 获取网络状态

你可以使用 getNetworkStatus 方法来获取当前网络的连接状态:

void checkNetworkStatus(String networkId) async {
  try {
    var status = await Libzt.getNetworkStatus(networkId);
    print("Network status: $status");
  } catch (e) {
    print("Failed to get network status: $e");
  }
}

5. 发送和接收数据

在 ZeroTier 网络中,你可以使用标准的网络通信方法(如 Socket)来发送和接收数据。以下是一个简单的示例,展示了如何在 ZeroTier 网络中发送和接收 UDP 数据包:

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

void sendAndReceiveData() async {
  var address = InternetAddress("192.168.195.100"); // ZeroTier 网络中的 IP 地址
  int port = 12345;

  RawDatagramSocket.bind(InternetAddress.anyIPv4, port).then((socket) {
    print("UDP socket bound to ${socket.address.address}:${socket.port}");

    socket.listen((RawSocketEvent event) {
      if (event == RawSocketEvent.read) {
        Datagram datagram = socket.receive();
        if (datagram != null) {
          String message = utf8.decode(datagram.data);
          print("Received: $message from ${datagram.address.address}:${datagram.port}");
        }
      }
    });

    // 发送数据
    String message = "Hello from Flutter!";
    List<int> data = utf8.encode(message);
    socket.send(data, address, port);
    print("Sent: $message");
  });
}
回到顶部