8

私は現在、SDK >= 16 を使用して Android アプリを開発しています。これは、WiFi 無線を使用してローカル エリア ネットワークでさまざまな Android デバイス (後で iOS デバイスも) を検出できるはずです。

私の最初の推測は、Samsung Galaxy S2 で機能しないことが判明したマルチキャストを使用することでした。パケットは、同じデバイスから送信された場合にのみ受信されます。

私の 2 番目の推測は、限られた 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); の行がブロックされます。タイムアウトを指定すると、タイムアウト例外が発生します。

4

2 に答える 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();
}
于 2013-03-30T16:21:29.017 に答える
1

http://developer.android.com/training/connect-devices-wireless/index.htmlをチェックしてください 。ローカル サービスを見つける 2 つの方法、NSD と wifi direct について言及されています。

于 2013-03-30T16:06:27.307 に答える