Flutter网络唤醒插件wake_on_lan的使用
Flutter网络唤醒插件 wake_on_lan
的使用
wake_on_lan
是一个用于发送 Wake-on-LAN 魔法包(magic packets)的 Dart 库。它支持 IPv4 和 IPv6 地址、SecureON 密码认证以及可选的重复发送功能。
Getting Started
1. 创建 IP 地址实例
首先,我们需要创建一个 IP 地址实例。可以使用静态方法 IPAddress.validate(address, { type })
来验证 IP 地址字符串是否正确格式化。
import 'package:wake_on_lan/wake_on_lan.dart';
String ipv4 = '192.168.1.255';
final validation = IPAddress.validate(ipv4);
if (validation.state) {
IPAddress ip = IPAddress(ipv4);
// 继续执行
} else {
// 处理无效地址的情况 - 可以通过 `validation.error` 访问验证错误信息
}
你也可以使用 IPAddress.fromHost(host, { type, hostPredicate })
方法从主机名获取 IP 地址:
IPAddress ipAddress = await IPAddress.fromHost('example.com');
2. 创建 MAC 地址实例
接下来,我们需要创建一个 MAC 地址实例。可以使用静态方法 MACAddress.validate(String address, { delimiter })
来验证 MAC 地址字符串是否正确格式化。
String mac = 'AA:BB:CC:DD:EE:FF';
final validation = MACAddress.validate(mac);
if (validation.state) {
MACAddress macAddress = MACAddress(mac);
// 继续执行
} else {
// 处理无效地址的情况 - 可以通过 `validation.error` 访问验证错误信息
}
如果 MAC 地址的分隔符不是冒号(:),你可以传递自定义的 delimiter
参数:
String delimiter = '#';
String mac = 'AA#BB#CC#DD#EE#FF';
final validation = MACAddress.validate(mac, delimiter: delimiter);
if (validation.state) {
MACAddress macAddress = MACAddress(mac, delimiter: delimiter);
// 继续执行
} else {
// 处理无效地址的情况 - 可以通过 `validation.error` 访问验证错误信息
}
3. (可选)创建 SecureON 密码实例
一些较新的设备支持 Wake-on-LAN 的 SecureON 密码功能。可以使用静态方法 SecureONPassword.validate(String password, { delimiter })
来验证 SecureON 密码字符串是否正确格式化。
String password = '00:11:22:33:44:55';
final validation = SecureONPassword.validate(password);
if (validation.state) {
SecureONPassword secureOnPassword = SecureONPassword(password);
// 继续执行
} else {
// 处理无效密码的情况 - 可以通过 `validation.error` 访问验证错误信息
}
同样,如果 SecureON 密码的分隔符不是冒号(:),你可以传递自定义的 delimiter
参数:
String delimiter = '#';
String password = '00#11#22#33#44#55';
final validation = SecureONPassword.validate(password, delimiter: delimiter);
if (validation.state) {
SecureONPassword secureOnPassword = SecureONPassword(password, delimiter: delimiter);
// 继续执行
} else {
// 处理无效密码的情况 - 可以通过 `validation.error` 访问验证错误信息
}
4. 发送 Wake-on-LAN 包
创建一个 WakeOnLAN
实例,并调用 wake({ repeat, repeatDelay })
方法来发送魔法包。
import 'package:wake_on_lan/wake_on_lan.dart';
void main() async {
String ipv4 = '192.168.1.255';
String mac = 'AA:BB:CC:DD:EE:FF';
// 验证 IP 地址和 MAC 地址
final ipValidation = IPAddress.validate(ipv4);
final macValidation = MACAddress.validate(mac);
if (!ipValidation.state || !macValidation.state) {
throw Exception('Invalid IP or MAC address');
}
// 创建 IP 和 MAC 地址实例
IPAddress ipv4Address = IPAddress(ipv4);
MACAddress macAddress = MACAddress(mac);
// 发送 Wake-on-LAN 包
WakeOnLAN wakeOnLan = WakeOnLAN(ipv4Address, macAddress);
await wakeOnLan.wake(
repeat: 5,
repeatDelay: const Duration(milliseconds: 500),
);
}
完整示例 Demo
以下是一个完整的示例代码,展示了如何使用 wake_on_lan
插件发送 Wake-on-LAN 包:
import 'package:wake_on_lan/wake_on_lan.dart';
void main() async {
String ipv4 = '192.168.1.255';
String mac = 'AA:BB:CC:DD:EE:FF';
String password = '00:11:22:33:44:55'; // 可选
// 验证 IP 地址
final ipValidation = IPAddress.validate(ipv4);
if (!ipValidation.state) {
throw ipValidation.error!;
}
// 验证 MAC 地址
final macValidation = MACAddress.validate(mac);
if (!macValidation.state) {
throw macValidation.error!;
}
// 验证 SecureON 密码(如果使用)
final passwordValidation = SecureONPassword.validate(password);
SecureONPassword? secureOnPassword;
if (password.isNotEmpty && passwordValidation.state) {
secureOnPassword = SecureONPassword(password);
} else if (password.isNotEmpty) {
throw passwordValidation.error!;
}
// 创建 IP 和 MAC 地址实例
IPAddress ipv4Address = IPAddress(ipv4);
MACAddress macAddress = MACAddress(mac);
// 创建 WakeOnLAN 实例并发送包
WakeOnLAN wakeOnLan = WakeOnLAN(ipv4Address, macAddress, password: secureOnPassword);
await wakeOnLan.wake(
repeat: 5,
repeatDelay: const Duration(milliseconds: 500),
);
print('Wake-on-LAN packet sent successfully!');
}
更多关于Flutter网络唤醒插件wake_on_lan的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter网络唤醒插件wake_on_lan的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter应用中使用wake_on_lan
插件来实现网络唤醒(Wake-on-LAN, WoL)功能的代码示例。
首先,确保你已经在你的pubspec.yaml
文件中添加了wake_on_lan
依赖:
dependencies:
flutter:
sdk: flutter
wake_on_lan: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
以下是一个简单的Flutter应用示例,展示如何使用wake_on_lan
插件发送魔术包来唤醒一台计算机:
import 'package:flutter/material.dart';
import 'package:wake_on_lan/wake_on_lan.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Wake-on-LAN Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: WakeOnLanScreen(),
);
}
}
class WakeOnLanScreen extends StatefulWidget {
@override
_WakeOnLanScreenState createState() => _WakeOnLanScreenState();
}
class _WakeOnLanScreenState extends State<WakeOnLanScreen> {
final _macAddressController = TextEditingController();
String _result = '';
void _sendWakeOnLanPacket() async {
setState(() {
_result = '';
});
String macAddress = _macAddressController.text.replaceAll(RegExp(r'[:-]'), '');
if (macAddress.length != 12 || !RegExp(r'^[0-9a-fA-F]+$').hasMatch(macAddress)) {
setState(() {
_result = 'Invalid MAC address!';
});
return;
}
try {
bool success = await WakeOnLan.sendPacket(macAddress);
setState(() {
_result = success ? 'Packet sent successfully!' : 'Failed to send packet.';
});
} catch (e) {
setState(() {
_result = 'Error: ${e.toString()}';
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Wake-on-LAN Demo'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
TextField(
controller: _macAddressController,
decoration: InputDecoration(
labelText: 'Enter MAC Address',
helperText: 'Format: XX:XX:XX:XX:XX:XX or XX-XX-XX-XX-XX-XX',
),
keyboardType: TextInputType.text,
),
SizedBox(height: 16),
ElevatedButton(
onPressed: _sendWakeOnLanPacket,
child: Text('Send Wake-on-LAN Packet'),
),
SizedBox(height: 16),
Text(
_result,
style: TextStyle(color: Colors.red),
),
],
),
),
);
}
@override
void dispose() {
_macAddressController.dispose();
super.dispose();
}
}
代码解释:
-
依赖导入:
- 导入
flutter/material.dart
用于UI设计。 - 导入
wake_on_lan/wake_on_lan.dart
用于发送魔术包。
- 导入
-
主应用:
MyApp
是一个无状态组件,它设置了应用的主题并指定了主页面WakeOnLanScreen
。
-
主页面:
WakeOnLanScreen
是一个有状态组件,用于管理用户输入和发送魔术包的状态。- 使用
TextEditingController
管理MAC地址输入框的内容。 _sendWakeOnLanPacket
方法处理发送魔术包的逻辑,包括验证MAC地址格式、发送魔术包并处理结果。
-
UI布局:
- 使用
Scaffold
和Column
布局输入框、按钮和结果文本。 - 使用
TextField
接收用户输入的MAC地址。 - 使用
ElevatedButton
作为发送按钮。 - 使用
Text
显示操作结果。
- 使用
-
资源释放:
- 在
dispose
方法中释放TextEditingController
资源。
- 在
这段代码提供了一个完整的Flutter应用示例,展示了如何使用wake_on_lan
插件来发送魔术包以唤醒支持网络唤醒的设备。你可以根据实际需求进一步扩展和修改这个示例。