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> [](https://pub.dartlang.org/packages/libzt_flutter)Flutter插件提供对libzt
库的绑定。使用了dart:ffi
。
此包已更新至最新版本的libzt
库和Flutter库。目前iOS支持正在开发中。
支持的平台
- Android(完全支持)
- iOS(进行中)
要支持额外的平台:
- 必须创建一个包含默认内容的平台特定文件夹。
- 必须在平台文件夹内的相应平台构建过程中包含从
libzt
编译的库文件。 - 必须更新
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
更多关于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");
});
}