Flutter网络唤醒插件wake_on_lan的使用

发布于 1周前 作者 ionicwang 来自 Flutter

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

1 回复

更多关于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();
  }
}

代码解释:

  1. 依赖导入

    • 导入flutter/material.dart用于UI设计。
    • 导入wake_on_lan/wake_on_lan.dart用于发送魔术包。
  2. 主应用

    • MyApp是一个无状态组件,它设置了应用的主题并指定了主页面WakeOnLanScreen
  3. 主页面

    • WakeOnLanScreen是一个有状态组件,用于管理用户输入和发送魔术包的状态。
    • 使用TextEditingController管理MAC地址输入框的内容。
    • _sendWakeOnLanPacket方法处理发送魔术包的逻辑,包括验证MAC地址格式、发送魔术包并处理结果。
  4. UI布局

    • 使用ScaffoldColumn布局输入框、按钮和结果文本。
    • 使用TextField接收用户输入的MAC地址。
    • 使用ElevatedButton作为发送按钮。
    • 使用Text显示操作结果。
  5. 资源释放

    • dispose方法中释放TextEditingController资源。

这段代码提供了一个完整的Flutter应用示例,展示了如何使用wake_on_lan插件来发送魔术包以唤醒支持网络唤醒的设备。你可以根据实际需求进一步扩展和修改这个示例。

回到顶部