如何在 Android 中使用 mDNS 从“.local”解析 Ipv4 和 Ipv6

How to resolve Ipv4 and Ipv6 from ".local" using mDNS in Android

我正在尝试使用多播 DNS 从“.local”解析 IPv4 和 IpV6,我尝试了 https://github.com/posicks/mdnsjava 但它无法解析所需的 ipv4/ipv6。或者,我找到了一个适合我但不知道它如何工作的应用程序。

应用程序 Link : https://play.google.com/store/apps/details?id=com.dokoden.dotlocalfinder

我也在尝试使用 Linux 终端解析“.local” -
用于解析ipv4的命令 avahi-resolve-host-name abc.local -4
用于解析ipv6的命令 avahi-resolve-host-name abc.local -6
并成功解决。

我在 Android 中尝试了相同的命令来解析“.local”,但得到 无法 运行 程序“avahi-resolve-host-name”:错误=13,权限被拒绝

我正在尝试 Android -

中的这段代码
  Process process = Runtime.getRuntime().exec("avahi-resolve-host-name abc.local -4");
  BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
  Log.d("OutPut",in.readLine());

我不是 100% 这会奏效,但评论太大了。

  1. 检查您 AndroidManifest.xml
  2. 中的以下权限
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  1. 以下链接可能有用:

终于成功了

我使用 mdnsjava 依赖关系解决了 Ipv4 和 Ipv6,即

implementation "xyz.gianlu.mdnsjava:mdnsjava:2.2.1"

为了解析 Ipv4,我使用了这个代码片段

for (Record record : new Lookup(localName, Type.A, DClass.IN).lookupRecords()) {
   if (record.getType() == Type.A) {
       ((ARecord) record).getAddress().getHostAddress();
       }
    }

在编写此代码片段之前,您必须使用

将 MuticastLock 放在已连接的 Wifi 上
  WifiManager.MulticastLock multicastLoc = wifiManager.createMulticastLock("mDnsLock");
  multicastLoc.setReferenceCounted(true);
  multicastLoc.acquire();

获取ip后释放multicastLock。

对于 Ipv6,我仅在此处使用了相同的 Ipv4 代码片段,记录类型应为 Type.AAAA,而不是 Type.A

此代码最多可运行 Android 10。