Flutter VPN管理插件wireguard_vpn的使用
Flutter VPN管理插件wireguard_vpn的使用
wireguard_vpn
是一个 Flutter 插件,用于通过 WireGuard 激活和停用 VPN 连接。
Setup
Android 配置
-
修改
android/app/build.gradle
文件中的minSdkVersion
为 21:android { defaultConfig { minSdkVersion 21 } }
-
如果要在发布模式下运行应用,需要在
./android/app/
目录下添加一个名为proguard-rules.pro
的文件,并包含以下内容:-keep class app.wachu.wireguard_vpn.** {*;} -keep class com.beust.klaxon.** {*;}
-
或者,可以在
./android/app/build.gradle
文件的buildtypes release
下添加以下内容:shrinkResources false minifyEnabled false
感谢贡献者
感谢用户 ByteSizedMarius 对包在发布模式下的执行所做的贡献。感谢你!
Usage
添加依赖
在 pubspec.yaml
文件中添加 wireguard_vpn
依赖:
dependencies:
wireguard_vpn: ^0.0.2
导入包
在 Dart 文件中导入 wireguard_vpn
包:
import 'package:wireguard_vpn/wireguard_vpn.dart';
Activate and Deactivate VPN
使用 WireguardFlutterPlugin
类的 changeStateParams
方法来激活或停用 VPN 连接。该方法需要一个 SetStateParams
对象作为参数,该对象包含关于 VPN 隧道的信息。
bool vpnActivate = false;
String initName = "MyWireguardVPN";
String initAddress = "192.168.1.1/24";
String initDnsServer = "8.8.8.8";
String initPort = "51820";
String initAllowedIp = "0.0.0.0/0";
String initEndpoint = "vpn.example.com:51820";
String initPublicKey = "PUBLIC_KEY";
String initPrivateKey = "PRIVATE_KEY";
String presharedKey = "PRESHARED_KEY";
final _wireguardFlutterPlugin = WireguardFlutterPlugin();
void _activateVpn(bool value) async {
final results = await _wireguardFlutterPlugin.changeStateParams(SetStateParams(
state: !vpnActivate,
tunnel: Tunnel(
name: initName,
address: initAddress,
dnsServer: initDnsServer,
listenPort: initPort,
peerAllowedIp: initAllowedIp,
peerEndpoint: initEndpoint,
peerPublicKey: initPublicKey,
privateKey: initPrivateKey,
peerPresharedKey: presharedKey),
));
setState(() {
vpnActivate = results ?? false;
});
}
Obtain Connection Statistics
使用 WireguardFlutterPlugin
类的 tunnelGetStats
方法来获取 VPN 连接的统计信息。该方法需要传入 VPN 隧道的名称。
String initName = "MyWireguardVPN";
final _wireguardFlutterPlugin = WireguardFlutterPlugin();
void _obtainStats() {
Timer.periodic(const Duration(seconds: 1), (timer) async {
final results = await _wireguardFlutterPlugin.tunnelGetStats(initName);
setState(() {
stats = results ?? Stats(totalDownload: 0, totalUpload: 0);
});
});
}
Complete Example
以下是一个完整的示例,展示了如何使用此插件激活和停用 VPN 连接以及获取连接统计信息:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:wireguard_vpn/wireguard_vpn.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final _wireguardFlutterPlugin = WireguardVpn();
bool vpnActivate = false;
Stats stats = Stats(totalDownload: 0, totalUpload: 0);
final String initName = 'MyWireguardVPN';
final String initAddress = "10.7.0.2/24";
final String initPort = "51820";
final String initDnsServer = "8.8.8.8, 8.8.4.4";
final String initPrivateKey = "PRIVATE_KEY";
final String initAllowedIp = "0.0.0.0/0, ::/0";
final String initPublicKey = "PUBLIC_KEY";
final String initEndpoint = "vpn.example.com:51820";
final String presharedKey = 'PRESHARED_KEY';
@override
void initState() {
super.initState();
if (vpnActivate) {
_obtainStats();
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Wireguard-VPN Example'),
),
body: Column(
children: [
Text('Active VPN: ${stats.totalDownload} D -- ${stats.totalUpload} U'),
SwitchListTile(
value: vpnActivate,
onChanged: _activateVpn,
title: Text(initName),
subtitle: Text(initEndpoint),
),
],
),
),
);
}
void _obtainStats() {
Timer.periodic(const Duration(seconds: 1), (timer) async {
final results = await _wireguardFlutterPlugin.tunnelGetStats(initName);
setState(() {
stats = results ?? Stats(totalDownload: 0, totalUpload: 0);
});
});
}
void _activateVpn(bool value) async {
final results = await _wireguardFlutterPlugin.changeStateParams(SetStateParams(
state: !vpnActivate,
tunnel: Tunnel(
name: initName,
address: initAddress,
dnsServer: initDnsServer,
listenPort: initPort,
peerAllowedIp: initAllowedIp,
peerEndpoint: initEndpoint,
peerPublicKey: initPublicKey,
privateKey: initPrivateKey,
peerPresharedKey: presharedKey,
),
));
setState(() {
vpnActivate = results ?? false;
if (vpnActivate) {
_obtainStats();
}
});
}
}
Generate WireGuard VPN Configurations
要获取 WireGuard VPN 配置以进行测试,可以访问 ProtonVPN 网站,注册并生成配置文件。也可以参考 WireGuard 官方网站上的指南。
Contributions
欢迎贡献。如果你发现错误或想添加新功能,请打开一个新的 issue 或发送一个 pull request。
License
本包根据 BSD 3-clause 许可证提供。更多信息请参阅 LICENSE 文件。
更多关于Flutter VPN管理插件wireguard_vpn的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter VPN管理插件wireguard_vpn的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用wireguard_vpn
插件的示例代码。请注意,wireguard_vpn
插件的具体用法可能会随着插件版本的更新而有所变化,因此在实际项目中使用时,请参考最新的官方文档。
首先,确保你已经在Flutter项目中添加了wireguard_vpn
依赖。在pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
wireguard_vpn: ^最新版本号 # 替换为实际最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目中,你可以按照以下步骤使用wireguard_vpn
插件来管理WireGuard VPN配置。
1. 导入插件
在你的Dart文件中导入wireguard_vpn
插件:
import 'package:wireguard_vpn/wireguard_vpn.dart';
2. 配置WireGuard接口
下面是一个配置WireGuard接口的示例代码:
void configureWireGuard() async {
try {
// 创建一个新的WireGuard接口配置
WireGuardConfig config = WireGuardConfig(
name: 'myWireGuardInterface',
privateKey: '你的私钥(以base64编码)',
peers: [
WireGuardPeer(
publicKey: '对方的公钥(以base64编码)',
allowedIps: ['192.168.1.0/24'], // 允许的IP地址范围
endpoint: WireGuardEndpoint(address: '对方的服务器地址', port: 51820),
persistentKeepalive: 20, // 持久性保活间隔(秒)
),
// 可以添加更多peer配置
],
);
// 应用配置
bool success = await WireGuardVpn.configureInterface(config: config);
if (success) {
print('WireGuard接口配置成功');
} else {
print('WireGuard接口配置失败');
}
} catch (e) {
print('配置WireGuard接口时发生错误: $e');
}
}
3. 启动/停止WireGuard接口
配置完成后,你可以启动或停止WireGuard接口:
void startWireGuard() async {
try {
bool success = await WireGuardVpn.startInterface(name: 'myWireGuardInterface');
if (success) {
print('WireGuard接口启动成功');
} else {
print('WireGuard接口启动失败');
}
} catch (e) {
print('启动WireGuard接口时发生错误: $e');
}
}
void stopWireGuard() async {
try {
bool success = await WireGuardVpn.stopInterface(name: 'myWireGuardInterface');
if (success) {
print('WireGuard接口停止成功');
} else {
print('WireGuard接口停止失败');
}
} catch (e) {
print('停止WireGuard接口时发生错误: $e');
}
}
4. 检查WireGuard接口状态
你还可以检查WireGuard接口的状态:
void checkWireGuardStatus() async {
try {
WireGuardStatus status = await WireGuardVpn.getInterfaceStatus(name: 'myWireGuardInterface');
print('WireGuard接口状态: ${status.toMap()}');
} catch (e) {
print('检查WireGuard接口状态时发生错误: $e');
}
}
注意事项
- 权限:确保你的应用具有必要的权限来配置和管理VPN接口。在Android上,你可能需要在
AndroidManifest.xml
中添加相应的权限声明。 - 私钥和公钥:在实际使用中,私钥和公钥应该是安全生成的,并且不应该硬编码在代码中。
- 错误处理:在实际应用中,应该添加更完善的错误处理逻辑来应对各种可能的异常情况。
以上代码提供了一个基本的框架,展示了如何在Flutter项目中使用wireguard_vpn
插件来管理WireGuard VPN配置。根据具体需求,你可以进一步扩展和修改这些代码。