问题描述
我正在尝试使用多播DNS从“ .local”解析IPv4和IpV6,并且尝试了https://github.com/posicks/mdnsjava,但无法解析所需的ipv4 / ipv6。另外,我找到了一个对我有用的应用程序,却不知道它如何工作。
应用链接: 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”:error = 13,权限被拒绝
我正在Android中尝试这段代码-
Process process = Runtime.getRuntime().exec("avahi-resolve-host-name casa.local -4");
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
Log.d("OutPut",in.readLine());
解决方法
最后,我成功了。
我使用 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后释放多播锁。
对于Ipv6,我只使用了相同的Ivv4代码段,此处的记录类型应为Type.AAAA
代替Type.A
此代码适用于Android 10。
,我不是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"/>
- 以下链接可能有用: