Flutter如何获取局域网设备及名称?扫描指定设备IP方案咨询
解决方案:Flutter局域网设备快速扫描与识别
一、适用的Flutter包
- network_tools_flutter:专注局域网设备扫描,支持快速端口探测、活跃设备发现,还能获取设备主机名,适配你筛选特定名称设备的需求。
- ping_discover_network:基于ICMP ping实现的扫描工具,能快速定位局域网内活跃设备,速度远快于逐个请求Web接口。
- flutter_mdns_plugin:针对支持MDNS协议的设备(多数智能设备会广播自身服务),可直接发现目标设备,无需全网段扫描。
二、快速扫描实现思路
1. 获取本地局域网网段
先通过network_info_plus包获取当前设备的WiFi IP,计算出需要扫描的网段范围:
import 'package:network_info_plus/network_info_plus.dart'; Future<String> getLocalSubnet() async { final networkInfo = NetworkInfo(); final localIp = await networkInfo.getWifiIP(); if (localIp == null) return ''; // 提取网段前缀,例如192.168.1.100 → 192.168.1. return localIp.substring(0, localIp.lastIndexOf('.') + 1); }
2. 批量扫描+主机名筛选
用network_tools_flutter批量扫描网段内设备,通过主机名筛选目标设备:
import 'package:network_tools_flutter/network_tools_flutter.dart'; void scanTargetDevices(String subnet) async { // 并发扫描网段内1-254的IP await Future.wait(List.generate(254, (index) async { final hostIp = '$subnet${index + 1}'; try { final host = await HostScanner.ping(hostIp, timeout: const Duration(milliseconds: 400)); if (host.isReachable) { final hostname = await host.reverseDNSLookup(); if (hostname != null && hostname.contains('你的特定设备名称')) { print('找到目标设备:IP=$hostIp,主机名=$hostname'); } } } catch (_) {} })); }
3. 提速优化技巧
- 缩短ping超时时间(建议300-500ms),跳过响应缓慢的设备;
- 采用并发扫描替代串行扫描,大幅压缩总耗时;
- 先通过ping筛选活跃设备,再对活跃设备请求Web接口做二次验证,避免全量请求。
三、MDNS快速发现方案(推荐给支持MDNS的设备)
如果目标设备支持MDNS协议,直接用flutter_mdns_plugin发现特定服务的设备,无需扫网段:
import 'package:flutter_mdns_plugin/flutter_mdns_plugin.dart'; void discoverMDNSTargets() async { final mdns = FlutterMdnsPlugin(); // 替换为你的设备对应的服务类型,比如_http._tcp、_mqtt._tcp await mdns.startDiscovery('_http._tcp'); mdns.onDiscovery.listen((serviceInfo) { if (serviceInfo.name.contains('你的特定设备名称')) { print('找到目标设备:IP=${serviceInfo.addresses.first},名称=${serviceInfo.name}'); } }); // 扫描5秒后停止 await Future.delayed(const Duration(seconds: 5)); await mdns.stopDiscovery(); }
内容的提问来源于stack exchange,提问作者Naymon
相关产品推荐
相关产品推荐

