如何在 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% 这会奏效,但评论太大了。
- 检查您
AndroidManifest.xml
中的以下权限
<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"/>
- 以下链接可能有用:
终于成功了
我使用 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。
我正在尝试使用多播 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% 这会奏效,但评论太大了。
- 检查您
AndroidManifest.xml
中的以下权限
<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"/>
- 以下链接可能有用:
终于成功了
我使用 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。