在本地设备AP(热点)上使用Zeroconf和JmDNS定位服务

时间:2011-08-09 13:18:23

标签: android wifi zeroconf jmdns

将我的Android设备设置为热点/接入点(AP), 如何使用JmDNS(3.4.0)查找连接到该AP的其他设备?

使用常规AP在正常方式创建JmDNS实例时一切正常;

jmdns = JmDNS.create();

但是使用我的设备作为AP会抛出异常。

    java.net.SocketException: No such device
    at org.apache.harmony.luni.platform.OSNetworkSystem.setSocketOption(Native Method)
    at dalvik.system.BlockGuard$WrappedNetworkSystem.setSocketOption(BlockGuard.java:382)
    at org.apache.harmony.luni.net.PlainDatagramSocketImpl.setOption(PlainDatagramSocketImpl.java:198)
    at org.apache.harmony.luni.net.PlainDatagramSocketImpl.join(PlainDatagramSocketImpl.java:137)
    at java.net.MulticastSocket.joinGroup(MulticastSocket.java:190)
    at javax.jmdns.impl.JmDNSImpl.openMulticastSocket(JmDNSImpl.java:459)
    at javax.jmdns.impl.JmDNSImpl.<init>(JmDNSImpl.java:420)
    at javax.jmdns.JmDNS.create(JmDNS.java:60)

我也尝试使用本地IP

创建JmDNS实例
jmdns = JmDNS.create( InetAddress.getByName("192.168.1.1") );

只会抛出相同的异常。

如何让JmDNS查找连接到本地AP的服务?

3 个答案:

答案 0 :(得分:1)

无法在本地热点上使用多播,因为无法获取多播锁。因此JmDNS将无效。

对于遇到此问题的其他人来说,找到我最终使用的连接设备的替代解决方案是基于解析/ proc / net / arp

答案 1 :(得分:0)

我不认为这直接回答了你的问题,但我发现除非我有主动wifi,否则jmDNS将无效。如果我的wifi关闭,我不得不禁用发现。

答案 2 :(得分:0)

借助Android网络服务发现(NSD),现在可以实现此功能(自API 16开始)。
NSD支持电话作为热点/ AP以及常规的AP连接(即与路由器的连接)。因此,您不再需要JmDns来实现您的目标。
参见:https://developer.android.com/training/connect-devices-wirelessly/nsd