2013-03-30 57 views
6

我目前正在開發一款使用SDK> = 16的android應用程序,該應用程序應該能夠在使用WiFi無線電的局域網中發現不同的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);如果我指定一個超時,我會得到一個超時異常。

回答

2

結賬http://developer.android.com/training/connect-devices-wirelessly/index.html它提到了兩種找到本地服務的方法--NSD和wifi直接。

+0

但是wifi直接意味着你失去了與本地網絡的連接,不是嗎?我仍然希望能夠在發現其他設備的同時訪問互聯網。同樣爲了測試目的,能夠發現運行非android操作系統的本地機器也是很好的。 – anopheles

+0

然後嘗試NSD。掃描不是要走的路,對於網絡管理員來說,它看起來像是一次攻擊。 –

+1

不是NSD在引擎蓋下使用多播嗎? – anopheles

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(); 
} 
+0

是的,我在示例應用程序中有上面的代碼。我將在我的原始評論中發佈我的完整代碼。我敢肯定可以確認組播在我的網絡上的不同機器上工作,但我的Galaxy S2失敗:( – anopheles

+0

因此,如果你有兩個Android設備,你可以嘗試運行pttdroid,這是opensourced http://code.google.com/ p/pttdroid /並且可以選擇向多播組發送/接收數據(語音)。 – MP23