android - 本地网络中的设备发现

标签 android networking discovery

我目前正在使用 SDK >= 16 开发一个 android 应用程序,它应该能够使用 WiFi radio 在局域网中发现不同的 android 设备(后来还有 iOS 设备)。

我的第一个猜测是使用多播,结果证明它在我的 Samsung Galaxy S2 上不起作用:数据包仅在从同一设备发送时才被接收。

我的第二个猜测是使用有限的 IP 地址范围主动扫描网络并等待适当的响应。不幸的是,这意味着网络使用 DHCP 来寻址 IP 地址。

上述解决方案似乎都不是完美的解决方案。

我目前的第一个猜测的解决方案:

public class MulticastReceiver extends AsyncTask<Activity, Integer, String> {

    private static final String host = "224.1.1.1";
    private static final int port = 5007;
    private static final String TAG = "MulticastReceiver";

    protected String doInBackground(Activity... activities) {
        WifiManager wm = (WifiManager)activities[0].getSystemService(Context.WIFI_SERVICE);
        WifiManager.MulticastLock multicastLock = wm.createMulticastLock("mydebuginfo");
        multicastLock.acquire();
        String message = "Nothing";

        if (multicastLock.isHeld()) {
            Log.i(TAG, "held multicast lock");
        }

        try {
            InetAddress addr = InetAddress.getByName(host);
            MulticastSocket socket = new MulticastSocket(port);
            socket.setTimeToLive(4);
            socket.setReuseAddress(true);
            socket.joinGroup(addr);

            byte[] buf = new byte[5];
            DatagramPacket recv = new DatagramPacket(buf, buf.length, addr, port);
            socket.receive(recv);
            message = new String(recv.getData());
            socket.leaveGroup(addr);
            socket.close();
        } catch (Exception e) {
            message = "ERROR " + e.toString();
        }

        multicastLock.release();

        return message;
    }
}

此代码导致阻塞在线 socket.receive(recv);如果我指定超时,我会收到超时异常。

最佳答案

检查我在非常相似的问题中的回答Android Network Discovery Service (ish) before API 14

我不相信多播在 Galaxy S2 上不起作用,前段时间当我编写一些网络应用程序时,我在许多设备上进行了多次测试,一些较旧的设备如 G1,但也在 S2、S3 和 Galaxy Tab 10 上。

但要能够使用多播,您必须以编程方式启用它。

这段代码你用过吗?

WifiManager wifi = (WifiManager)getSystemService( Context.WIFI_SERVICE );
if(wifi != null){
WifiManager.MulticastLock lock = wifi.createMulticastLock("Log_Tag");
lock.acquire();
}

关于android - 本地网络中的设备发现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15720558/

相关文章:

docker - Kubernetes/Rancher中的Docker网络

web-services - 是否有任何可用的公共(public) UDDI 注册中心?

web-services - UDDI 有替代方案吗?

java - 安卓 Wi-Fi 直连 : re-connect to a device without re-Discovery

windows - Postgres ODBC : connection "actively refused"

java - 改造:由以下原因引起:java.lang.IllegalArgumentException:无法找到 CustomClass 的调用适配器

android - 第二次渐进式网络应用程序安装

android - 如何将 Object[] 转换为 String[ ]

android - 从 Android 上的设备获取文件,在尝试使用它时一直提示未找到文件

android - FragmentPagerAdapter 已弃用