Flutter网络发现与探测插件ping_discover_network_forked的使用

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

Flutter网络发现与探测插件ping_discover_network_forked的使用

简介

ping_discover_network 是一个用于 Dart/Flutter 的库,它允许对 IP 子网进行 ping 操作以发现网络设备。可以用来查找打印机(例如,在端口 9100 上)以及其他任何本地网络中的设备和服务。该库已在 Android 和 iOS 平台上进行了测试。

pub.dev页面 | 文档

快速开始

示例:发现给定子网和端口上的可用网络设备

import 'package:ping_discover_network_forked/ping_discover_network_forked.dart';

void main() async {
  // NetworkAnalyzer.discover2 同时对所有 PORT:IP 地址进行 ping 操作。
  const port = 80;
  final stream = NetworkAnalyzer.discover2(
    '192.168.0', // 子网地址
    port,
    timeout: Duration(milliseconds: 5000), // 超时时间
  );

  int found = 0;
  stream.listen((NetworkAddress addr) {
    if (addr.exists) {
      found++;
      print('Found device: ${addr.ip}:$port');
    }
  }).onDone(() => print('Finish. Found $found device(s)'));
}

示例:获取本地 IP 并发现网络设备

import 'package:wifi/wifi.dart';
import 'package:ping_discover_network_forked/ping_discover_network_forked.dart';

void main() async {
  final String ip = await Wifi.ip; // 获取本地 IP 地址
  final String subnet = ip.substring(0, ip.lastIndexOf('.')); // 提取子网部分
  final int port = 80;

  final stream = NetworkAnalyzer.discover2(subnet, port);
  stream.listen((NetworkAddress addr) {
    if (addr.exists) {
      print('Found device: ${addr.ip}');
    }
  });
}

示例:在给定子网和端口范围内发现可用网络设备

import 'package:ping_discover_network_forked/ping_discover_network_forked.dart';

void checkPortRange(String subnet, int fromPort, int toPort) {
  if (fromPort > toPort) {
    return;
  }

  print('Checking port ${fromPort}');

  final stream = NetworkAnalyzer.discover2(subnet, fromPort);

  stream.listen((NetworkAddress addr) {
    if (addr.exists) {
      print('Found device: ${addr.ip}:${fromPort}');
    }
  }).onDone(() {
    checkPortRange(subnet, fromPort + 1, toPort); // 递归检查下一个端口
  });
}

void main() {
  checkPortRange('192.168.0', 400, 410);
}

完整示例代码

以下是一个完整的 main.dart 文件示例,展示了如何使用 ping_discover_network_forked 插件来发现本地网络中的设备:

/*
 * ping_discover_network_forked
 * Created by Andrey Ushakov
 * 
 * See LICENSE for distribution and usage details.
 */

import 'package:ping_discover_network_forked/ping_discover_network_forked.dart';
import 'package:wifi/wifi.dart';

void main() async {
  // 获取本地 IP 地址并提取子网部分
  final String ip = await Wifi.ip;
  final String subnet = ip.substring(0, ip.lastIndexOf('.'));
  final int port = 80;

  // 使用 NetworkAnalyzer.discover2 对所有 PORT:IP 地址进行 ping 操作
  final stream = NetworkAnalyzer.discover2(subnet, port, timeout: Duration(milliseconds: 5000));

  int found = 0;
  stream.listen((NetworkAddress addr) {
    if (addr.exists) {
      found++;
      print('Found device: ${addr.ip}:$port');
    }
  }).onDone(() => print('Finish. Found $found device(s)'));
}

通过以上内容,您可以根据需要选择适合您的应用场景,并使用 ping_discover_network_forked 插件轻松实现网络设备的发现功能。希望这些信息对您有所帮助!


更多关于Flutter网络发现与探测插件ping_discover_network_forked的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络发现与探测插件ping_discover_network_forked的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用ping_discover_network_forked插件来进行网络发现与探测的示例代码。这个插件可以用于发现局域网内的设备,并通过ping操作来检测设备的可达性。

首先,你需要在你的pubspec.yaml文件中添加这个插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  ping_discover_network_forked:
    git:
      url: https://github.com/some-forked-repo/ping_discover_network_forked.git  # 替换为实际的forked仓库URL
      ref: main  # 或者其他你需要的分支或标签

注意:由于这个插件可能是一个forked版本,你需要替换URL为实际的forked仓库地址。

接下来,你可以在你的Flutter项目中创建一个页面,用于显示发现的设备和ping结果。以下是一个简单的示例:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Network Discovery',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: NetworkDiscoveryPage(),
    );
  }
}

class NetworkDiscoveryPage extends StatefulWidget {
  @override
  _NetworkDiscoveryPageState createState() => _NetworkDiscoveryPageState();
}

class _NetworkDiscoveryPageState extends State<NetworkDiscoveryPage> {
  List<String> devices = [];
  Map<String, bool> pingResults = {};

  @override
  void initState() {
    super.initState();
    _discoverDevices();
  }

  Future<void> _discoverDevices() async {
    try {
      // 假设插件提供了一个方法来发现设备,这里我们假设它是discoverDevices()
      var discoveredDevices = await PingDiscoverNetworkForked.discoverDevices();
      
      // 更新状态以显示发现的设备
      setState(() {
        devices = discoveredDevices;
        
        // 初始化ping结果
        pingResults = devices.map((device) => MapEntry(device, false)).toMap();
        
        // 对每个设备进行ping操作
        for (var device in devices) {
          _pingDevice(device);
        }
      });
    } catch (e) {
      print("Error discovering devices: $e");
    }
  }

  Future<void> _pingDevice(String device) async {
    try {
      bool result = await PingDiscoverNetworkForked.ping(device);
      
      // 更新ping结果
      setState(() {
        pingResults[device] = result;
      });
    } catch (e) {
      print("Error pinging device $device: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Network Discovery'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Text('Discovered Devices:', style: TextStyle(fontSize: 20)),
            SizedBox(height: 16),
            Expanded(
              child: ListView.builder(
                itemCount: devices.length,
                itemBuilder: (context, index) {
                  var device = devices[index];
                  var result = pingResults[device] ?? false;
                  return ListTile(
                    title: Text(device),
                    trailing: Text(result ? 'Reachable' : 'Unreachable'),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

注意

  1. 插件的API可能会有所不同,因此你需要查看ping_discover_network_forked插件的文档或源代码,以确定正确的方法名和用法。
  2. 示例中的PingDiscoverNetworkForked.discoverDevices()PingDiscoverNetworkForked.ping(device)是假设的方法名,你需要根据实际的插件API进行替换。
  3. 由于网络发现可能涉及权限问题(如访问网络状态、使用Wi-Fi扫描等),你可能需要在AndroidManifest.xmlInfo.plist中添加相应的权限声明。

希望这个示例能帮助你开始在Flutter项目中使用ping_discover_network_forked插件进行网络发现与探测。

回到顶部