Gerätesuche im lokalen Netzwerk

Ich bin derzeit an der Entwicklung einer android-app mit SDK >= 16, die sollten in der Lage sein zu entdecken, verschiedene android-Geräte (später auch iOS-Geräte) in ein lokales Netzwerk mit dem WLAN-radio.

Meine erste Vermutung war der Einsatz von multicast, die sich als nicht funktionsfähig auf meinem Samsung Galaxy S2: Pakete nur empfangen, beim senden aus dem gleichen Gerät.

Meine zweite Vermutung ist, aktiv Scannen Sie das Netzwerk mit einer begrenzten IP-Adressbereich ein, und warten Sie für eine angemessene Reaktion. Leider, dies bedeutet, dass das Netzwerk verwendet DHCP-Adresse die IP-Adressen.

Keine der oben genannten Lösungen scheinen die perfekte Lösung.

Meine aktuelle Lösung für meine erste Vermutung:

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;
    }
}

Dieser code führt zu Sperrung auf der line-Buchse.receive(recv); Wenn ich eine Zeit angeben, bekomme ich eine timeout-exception.

InformationsquelleAutor anopheles | 2013-03-30
Schreibe einen Kommentar