如何在Flutter中获取局域网内已扫描IP对应的设备名称?
局域网IP+对应主机名的Flutter实现方案
1. 基于lan_scanner扩展反向解析逻辑
lan_scanner本身只负责检测IP可达性,没有内置主机名获取功能,你可以在拿到在线IP后,手动添加反向DNS查询,部分Windows设备还可以通过NetBIOS协议获取主机名:
import 'dart:io'; import 'package:lan_scanner/lan_scanner.dart'; Future<void> scanLanWithHostnames() async { final scanner = LanScanner(); final subnet = await scanner.getSubmask(); final scanStream = scanner.startScan(subnet); await for (final host in scanStream) { if (host.isReachable) { String? hostname; // 优先尝试反向DNS查询 try { final addresses = await InternetAddress.lookup(host.ip); hostname = addresses.first.host; } catch (_) {} // DNS失败则尝试NetBIOS查询(仅Windows设备) if (hostname == null) { hostname = await _fetchNetBiosName(host.ip); } print('IP: ${host.ip} | 主机名: ${hostname ?? '未知'}'); } } } // 简化版NetBIOS主机名查询(依赖UDP 137端口) Future<String?> _fetchNetBiosName(String ip) async { try { final socket = await Socket.connect(ip, 137, timeout: const Duration(seconds: 2)); final request = Uint8List.fromList([ 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x43, 0x4B, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x21, 0x00, 0x01 ]); socket.add(request); final response = await socket.first; socket.close(); if (response.length > 50) { final nameBytes = response.sublist(50, 65); return String.fromCharCodes(nameBytes).trim().replaceAll('\x00', ''); } } catch (_) {} return null; }
2. 使用内置主机名扫描的替代包
如果不想自己写解析逻辑,可以直接用network_tools_flutter包,它集成了ping、反向DNS、NetBIOS扫描,能直接返回设备主机名:
import 'package:network_tools_flutter/network_tools_flutter.dart'; Future<void> scanWithPrebuiltTools() async { final localSubnet = await NetworkAnalyzer.getLocalSubnet(); // 扫描子网内1-254段IP final deviceStream = NetworkAnalyzer.discover(localSubnet, firstSubnet: 1, lastSubnet: 254); await for (final device in deviceStream) { if (device.exists) { print('IP: ${device.ip} | 主机名: ${device.hostName ?? '未知'}'); } } }
3. 关键注意事项
- 反向DNS依赖局域网DNS服务器,部分IoT设备或未配置主机名的设备无法返回结果。
- NetBIOS仅适用于Windows设备,且需要设备开启UDP 137端口。
- 苹果设备和智能家居常用mDNS协议,可尝试
mdns_client包实现mDNS查询,补充主机名获取能力。 - 扫描时设置合理超时(2-3秒),避免阻塞Flutter UI线程。
内容的提问来源于stack exchange,提问作者Panos_42
相关产品推荐
相关产品推荐

