Flutter网络设备扫描插件arp_scanner的使用

Flutter网络设备扫描插件arp_scanner的使用

arp_scanner 是一个用于在本地网络中发现设备的 Flutter 插件。它返回 IPv4 地址、MAC 地址、接口供应商和主机名。

限制

  • 该插件仅支持 Android SDK 版本 29。
  • 主机名解析仅在 2.4G Wi-Fi 下工作,否则将返回 null

使用

要使用此插件,将其添加为依赖项到你的 pubspec.yaml 文件中:

dependencies:
  arp_scanner: ^版本号

修改 App 的 build.gradle

build.gradle 中的 compileSdkVersion 改为 29:

android {
    ....
    compileSdkVersion 29
    ....
}

修改 Project 的 build.gradle

build.gradle 中的 Kotlin 版本改为 1.5.30 或更高版本:

buildscript {
  ...
  ext.kotlin_version = '1.5.30'
  ...
}

修复 Duplicate class com.google.gson 错误

build.gradle 文件中排除 gson 模块:

android {
  configurations {
    all {
      exclude module: 'gson'
    }
  }
}

示例

你可以在这里找到示例代码:示例代码

示例代码

import 'package:arp_scanner/device.dart';
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:arp_scanner/arp_scanner.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _result = ''; // 用于存储扫描结果

  [@override](/user/override)
  void initState() {
    super.initState();
    // 监听扫描过程中的设备事件
    ArpScanner.onScanning.listen((Device device) {
      setState(() {
        _result = "${_result}Mac:${device.mac} ip:${device.ip} hostname:${device.hostname} time:${device.time} vendor:${device.vendor} \n";
      });
    });
    // 监听扫描完成后的事件
    ArpScanner.onScanFinished.listen((List<Device> devices) {
      setState(() {
        _result = "${_result}total: ${devices.length}";
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        floatingActionButton: FloatingActionButton( // 扫描按钮
            child: const Icon(Icons.scanner_sharp),
            onPressed: () async {
              // 执行子网设备扫描
              await ArpScanner.scan();
              setState(() {
                _result = ""; // 清空结果
              });
            }),
        appBar: AppBar(
          actions: <Widget>[ // 取消按钮
            IconButton(
              icon: const Icon(Icons.cancel),
              onPressed: () async {
                await ArpScanner.cancel(); // 取消扫描
              },
            ),
          ],
          title: const Text('插件示例应用'),
        ),
        body: Center(
          child: Text(_result), // 显示扫描结果
        ),
      ),
    );
  }
}

更多关于Flutter网络设备扫描插件arp_scanner的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络设备扫描插件arp_scanner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用arp_scanner插件进行网络设备扫描的示例代码。这个插件允许你通过ARP请求扫描同一局域网内的设备。

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

dependencies:
  flutter:
    sdk: flutter
  arp_scanner: ^0.4.0  # 请检查最新版本号

然后运行flutter pub get来获取依赖。

接下来,你可以在你的Flutter项目中编写代码来使用这个插件。以下是一个简单的示例,展示了如何扫描网络设备并打印结果:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<NetworkDevice> devices = [];
  bool isScanning = false;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('ARP Scanner Demo'),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: isScanning ? null : scanDevices,
              child: Text(isScanning ? 'Scanning...' : 'Scan Devices'),
            ),
            SizedBox(height: 20),
            Expanded(
              child: ListView.builder(
                itemCount: devices.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Text('Device: ${devices[index].ipAddress}'),
                    subtitle: Text('MAC: ${devices[index].macAddress}'),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }

  Future<void> scanDevices() async {
    setState(() {
      isScanning = true;
      devices = [];
    });

    try {
      List<NetworkDevice> result = await ArpScanner.scan();
      setState(() {
        devices = result;
        isScanning = false;
      });
    } catch (e) {
      print('Error scanning devices: $e');
      setState(() {
        isScanning = false;
      });
    }
  }
}

在这个示例中,我们定义了一个简单的Flutter应用,其中包含一个按钮用于启动扫描,以及一个列表视图用于显示扫描到的设备。

代码说明:

  1. 依赖导入

    • 导入flutter/material.dart用于UI组件。
    • 导入arp_scanner/arp_scanner.dart用于ARP扫描功能。
  2. 主应用

    • MyApp是一个有状态的Widget,包含设备列表和扫描状态。
  3. UI布局

    • 使用Column布局包含按钮和列表视图。
    • 按钮用于启动扫描,当扫描进行时按钮文本变为"Scanning…"且不可点击。
    • 列表视图显示扫描到的设备IP地址和MAC地址。
  4. 扫描功能

    • scanDevices方法使用ArpScanner.scan()方法异步扫描设备。
    • 扫描结果存储在devices列表中,并更新UI。
    • 捕获任何扫描过程中可能发生的异常并打印错误信息。

确保你的设备具有适当的权限来执行ARP请求,这通常需要在Android的AndroidManifest.xml中添加适当的网络权限。对于iOS,通常不需要额外的配置,但始终建议检查插件的文档以确认任何平台特定的要求。

注意:这个插件可能不适用于所有设备和所有网络环境,特别是如果设备或网络有特殊的安全设置或防火墙规则。

回到顶部