2013-03-30 39 views
6

Tôi hiện đang phát triển một ứng dụng Android sử dụng SDK> = 16 để có thể khám phá các thiết bị Android khác nhau (sau này cũng là thiết bị iOS) trong mạng cục bộ bằng cách sử dụng đài WiFi.Phát hiện thiết bị trong mạng cục bộ

Đoán đầu tiên của tôi là sử dụng phát đa hướng hóa ra không hoạt động trên Samsung Galaxy S2: các gói chỉ được nhận khi được gửi từ cùng một thiết bị.

Dự đoán thứ hai của tôi là chủ động quét mạng bằng dải địa chỉ IP giới hạn và chờ phản hồi phù hợp. Thật không may, điều này ngụ ý rằng mạng sử dụng DHCP để giải quyết các địa chỉ IP.

Không có giải pháp nào ở trên dường như là giải pháp hoàn hảo.

giải pháp hiện tại của tôi cho đoán đầu tiên của tôi:

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

Mã này kết quả trong việc ngăn chặn trên đường dây socket.receive (recv); Nếu tôi chỉ định thời gian chờ, tôi sẽ nhận được một ngoại lệ hết thời gian chờ.

Trả lời

2

Kiểm tra http://developer.android.com/training/connect-devices-wirelessly/index.html Nó đề cập đến hai cách tìm kiếm các dịch vụ địa phương- NSD và wifi trực tiếp.

+0

Nhưng wifi trực tiếp ngụ ý rằng bạn mất kết nối với mạng cục bộ, phải không? Tôi vẫn muốn có thể truy cập internet trong khi khám phá các thiết bị khác. Ngoài ra cho mục đích thử nghiệm, nó sẽ được tốt đẹp để có thể cũng khám phá ra một máy địa phương chạy một os không android. – anopheles

+0

Sau đó thử NSD. Quét không phải là cách để đi, với một quản trị mạng nó trông giống như một cuộc tấn công. –

+1

Không NSD sử dụng phát đa hướng dưới mui xe? – anopheles

2

Kiểm tra câu trả lời của tôi trong câu hỏi rất giống Android Network Discovery Service (ish) before API 14

tôi không belive multicast mà không hoạt động trên Galaxy S2, một số thời gian trước đây khi tôi đã mã hóa một số ứng dụng mạng, tôi thực hiện một số thử nghiệm trên nhiều thiết bị, một số cũ như G1 nhưng cũng trên S2, S3 và Galaxy Tab 10.

Nhưng để có thể sử dụng phát đa hướng, bạn phải bật tính năng này theo chương trình.

Bạn đã sử dụng đoạn mã này chưa?

WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
if(wifi != null){ 
WifiManager.MulticastLock lock = wifi.createMulticastLock("Log_Tag"); 
lock.acquire(); 
} 
+0

Có, tôi có mã ở trên trong ứng dụng mẫu của mình. Tôi sẽ đăng mã hoàn chỉnh của mình trong nhận xét ban đầu. Tôi thách thức có thể xác nhận rằng multicast hoạt động trên các máy khác nhau trên mạng của tôi, nhưng Galaxy S2 của tôi không thành công: ( – anopheles

+0

Vì vậy, nếu bạn có hai thiết bị Android, bạn có thể thử chạy pttdroid, được mở ra http://code.google.com/ p/pttdroid/và có tùy chọn gửi/nhận dữ liệu (thoại) đến các nhóm phát đa hướng. – MP23

Các vấn đề liên quan