Flutter如何实现搜索网段内设备

在Flutter中如何实现搜索局域网内所有设备的功能?我想扫描指定网段下的IP地址,获取活跃设备列表并显示在应用中。目前了解到可以通过ping或端口扫描的方式实现,但不知道在Flutter中具体该如何操作,是否需要依赖原生代码?有没有成熟的插件或方案推荐?最好能提供简单的代码示例说明实现思路。

2 回复

使用Flutter搜索局域网设备,可通过以下方法:

  1. ping扫描:使用ping_discover_network库,对网段内IP逐一发送ICMP请求检测存活设备。

  2. 端口扫描:结合raw_socketnetwork_info_plus获取本地IP,扫描特定端口(如80、22)发现设备。

  3. UDP广播:发送广播包,监听响应(如SSDP协议发现智能设备)。

注意:需添加网络权限,并处理异步操作。

更多关于Flutter如何实现搜索网段内设备的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中搜索网段内设备,可以通过以下步骤实现:

1. 获取本地IP和子网掩码

使用 network_info_plus 包获取本机IP和子网掩码,计算网段范围。

dependencies:
  network_info_plus: ^4.1.0
import 'package:network_info_plus/network_info_plus.dart';

final NetworkInfo networkInfo = NetworkInfo();
String? ip = await networkInfo.getWifiIP();
String? subnetMask = await networkInfo.getWifiSubmask();

2. 计算网段IP范围

根据IP和子网掩码计算网段起始和结束IP:

List<String> calculateIPRange(String ip, String subnetMask) {
  List<int> ipParts = ip.split('.').map(int.parse).toList();
  List<int> maskParts = subnetMask.split('.').map(int.parse).toList();
  
  List<int> network = [];
  List<int> broadcast = [];
  
  for (int i = 0; i < 4; i++) {
    network.add(ipParts[i] & maskParts[i]);
    broadcast.add(network[i] | (~maskParts[i] & 0xFF));
  }
  
  String startIP = network.join('.');
  String endIP = broadcast.join('.');
  return [startIP, endIP];
}

3. 扫描网段内设备

使用 ping_discover_network 包进行设备发现:

dependencies:
  ping_discover_network: ^2.1.0
import 'package:ping_discover_network/ping_discover_network.dart';

List<String> activeIPs = [];

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

4. 完整示例

Future<void> scanDevices() async {
  String? ip = await NetworkInfo().getWifiIP();
  String? subnetMask = await NetworkInfo().getWifiSubmask();
  
  if (ip == null || subnetMask == null) return;
  
  List<String> range = calculateIPRange(ip, subnetMask);
  String subnet = range[0].substring(0, range[0].lastIndexOf('.'));
  
  // 扫描常用端口(如80)
  scanNetwork('$subnet.1/24', 80);
}

注意事项:

  • 需要网络权限:在 AndroidManifest.xml 中添加 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • 扫描速度较慢,建议在后台执行
  • 部分设备可能禁用ICMP响应,无法被发现

这种方法通过ping和端口扫描结合,能较有效地发现局域网内活跃设备。

回到顶部