本地网络中的设备发现

8
我目前正在使用SDK >= 16开发Android应用程序,该应用程序应该能够使用WiFi无线电在本地区域网络中发现不同的Android设备(稍后还包括iOS设备)。
我最初的想法是使用多播,但在我的三星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)这一行会导致阻塞。如果我指定一个超时时间,就会抛出超时异常。

2个回答

2

请查看我在非常相似的问题中的答案: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();
}

是的,我在我的示例应用程序中有上述代码。我会在我的原始评论中发布完整的代码。我绝对可以确认多播在我的网络上的不同计算机上运行正常,但我的Galaxy S2却失败了。 :( - anopheles
所以,如果您有两个Android设备,可以尝试运行开源的pttdroid(http://code.google.com/p/pttdroid/),并具有向多播组发送/接收数据(语音)的选项。 - MP23

1

但是 WiFi Direct 意味着您会失去与本地网络的连接,对吗?我仍然希望在发现其他设备的同时能够访问互联网。此外,为了测试目的,也很好能够发现运行非 Android 操作系统的本地计算机。 - anopheles
那么尝试使用NSD。扫描不是正确的方法,对于网络管理员来说,这看起来像是一次攻击。 - Gabe Sechan
1
NSD底层不使用组播吗? - anopheles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接