2013-03-30 2 views
6

현재 SDK> = 16을 사용하는 Android 앱을 개발 중입니다. Wi-Fi를 사용하는 LAN에서 다른 Android 기기 (이후 iOS 기기)를 검색 할 수 있어야합니다.로컬 네트워크에서 기기 검색

내 첫 번째 추측은 삼성 Galaxy S2에서 작동하지 않는 멀티 캐스트를 사용하는 것입니다. 패킷은 동일한 기기에서 전송되었을 때만 수신됩니다.

나의 두 번째 추측은 제한된 IP 주소 범위를 사용하여 네트워크를 적극적으로 스캔하고 적절한 응답을 기다리는 것입니다. 불행히도 이것은 네트워크가 DHCP를 사용하여 IP 주소를 처리한다는 것을 의미합니다.

위의 솔루션 중 어느 것도 완벽한 솔루션으로 보이지 않습니다. 내 첫번째 추측에 대한

내 현재 솔루션 : 라인 socket.receive (RECV)에 차단하는

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

이 코드의 결과; 타임 아웃을 지정하면 타임 아웃 예외가 발생합니다.

답변

2

체크 아웃 http://developer.android.com/training/connect-devices-wirelessly/index.html 로컬 서비스 - NSD 및 wifi direct를 찾는 두 가지 방법이 언급되어 있습니다. 나는 일부 네트워크 응용 프로그램을 코딩 할 때

+0

하지만 Wi-Fi를 사용하면 로컬 네트워크 연결이 끊어지는 것을 직접적으로 알 수 있습니다. 그렇습니까? 나는 여전히 다른 장치를 발견하는 동안 인터넷에 액세스 할 수 있기를 원합니다. 또한 테스트 목적으로 비 안드로이드 OS를 실행하는 로컬 시스템을 발견 할 수 있으면 좋을 것입니다. – anopheles

+0

그런 다음 NSD를 시도하십시오. 검사는 가야 할 길은 아니지만 네트워크 관리자에게는 공격과 같습니다. –

+1

NSD에서 멀티 캐스트를 사용하지 않습니까? – anopheles

2

Android Network Discovery Service (ish) before API 14

나는 멀티 캐스트는 갤럭시 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(); 
} 
+0

예, 위의 코드는 샘플 앱에 있습니다. 원래의 코멘트에 전체 코드를 게시합니다. 나는 네트워크상의 다른 컴퓨터에서 멀티 캐스트가 작동하는지 확고히 확인할 수 있지만 Galaxy S2는 비참하게 실패합니다. ( – anopheles

+0

두 개의 안드로이드 장치가 있으면 pttdroid를 실행 해 볼 수 있습니다. p/pttdroid /와 멀티 캐스트 그룹에 데이터 (음성)를 송수신하는 옵션이 있습니다. – MP23

관련 문제