You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:16:12