Flutter如何实现搜索网段内设备
在Flutter中如何实现搜索局域网内所有设备的功能?我想扫描指定网段下的IP地址,获取活跃设备列表并显示在应用中。目前了解到可以通过ping或端口扫描的方式实现,但不知道在Flutter中具体该如何操作,是否需要依赖原生代码?有没有成熟的插件或方案推荐?最好能提供简单的代码示例说明实现思路。
        
          2 回复
        
      
      
        使用Flutter搜索局域网设备,可通过以下方法:
- 
ping扫描:使用
ping_discover_network库,对网段内IP逐一发送ICMP请求检测存活设备。 - 
端口扫描:结合
raw_socket或network_info_plus获取本地IP,扫描特定端口(如80、22)发现设备。 - 
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和端口扫描结合,能较有效地发现局域网内活跃设备。
        
      
            
            
            
