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和端口扫描结合,能较有效地发现局域网内活跃设备。

