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

Flutter/Dart 扫描本地网络获取已连设备IP和主机名方法问询

解决方案

方案1:使用 multicast_dns 包执行mDNS查询

大部分本地网络设备会开启mDNS服务(即Bonjour/零配置网络),可以通过查询本地域名(默认后缀为.local)获取主机名,和你现有的ping_discover_network扫描逻辑结合即可:

  • 步骤:先用ping_discover_network扫描存活IP,对每个存活IP发起 PTR 类型的mDNS查询,查询格式为[反序IP段].in-addr.arpa,比如IP是192.168.1.100,查询地址为100.1.168.192.in-addr.arpa
  • 示例代码片段:
import 'package:multicast_dns/multicast_dns.dart';

Future<String?> getHostnameFromIp(String ip) async {
  final parts = ip.split('.').reversed.join('.');
  final query = '$parts.in-addr.arpa';
  final client = MDnsClient();
  await client.start();
  
  await for (final PtrResourceRecord ptr in client.lookup<PtrResourceRecord>(
    ResourceRecordQuery.serverPointer(query),
  )) {
    await client.stop();
    // 去掉末尾的.local后缀即可得到设备名
    return ptr.domainName.replaceAll('.local', '');
  }
  await client.stop();
  return null;
}

注意:iOS需要在Info.plist中添加NSLocalNetworkUsageDescription权限声明,Android需要声明ACCESS_NETWORK_STATE、ACCESS_WIFI_STATE、INTERNET权限

方案2:读取系统ARP缓存表

本地网络设备和本机通信后会在ARP表中留下记录,你可以直接读取系统ARP文件解析主机名和IP的对应关系,适配不同平台的读取逻辑即可:

  • Android/iOS的ARP表路径均为 /proc/net/arp,直接读取该文件内容按空格分割即可提取IP、MAC、设备名相关字段
  • 示例代码片段:
import 'dart:io';

Future<Map<String, String>> getArpTable() async {
  final arpFile = File('/proc/net/arp');
  final Map<String, String> arpMap = {};
  if (await arpFile.exists()) {
    final lines = await arpFile.readAsLines();
    // 跳过表头第一行
    for (int i = 1; i < lines.length; i++) {
      final parts = lines[i].split(RegExp(r'\s+'));
      if (parts.length >= 4) {
        final ip = parts[0];
        final mac = parts[3];
        // 部分设备会在ARP表中记录主机名,无记录时可返回MAC作为替代展示
        arpMap[ip] = parts.length >= 5 ? parts[4] : mac;
      }
    }
  }
  return arpMap;
}

注意:部分高版本Android系统可能限制读取/proc路径权限,此时优先使用方案1

补充说明

InternetAddress.reverse()方法依赖DNS反向解析,大多数家用路由器没有配置本地DNS反向解析记录,所以只会返回原IP,属于正常现象。你可以将两个方案结合使用,优先读取ARP缓存获取结果,无结果时再发起mDNS查询,能覆盖90%以上的本地设备识别场景。

内容的提问来源于stack exchange,提问作者Aterus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 23:45:00