2013-03-30 13 views
6

मैं वर्तमान में एसडीके> = 16 का उपयोग कर एंड्रॉइड ऐप विकसित कर रहा हूं जो वाईफाई रेडियो का उपयोग कर स्थानीय क्षेत्र नेटवर्क में विभिन्न एंड्रॉइड डिवाइस (बाद में आईओएस डिवाइस) को खोजने में सक्षम होना चाहिए।स्थानीय नेटवर्क में डिवाइस खोज

मेरा पहला अनुमान मल्टीकास्ट का उपयोग करना था जो मेरे सैमसंग गैलेक्सी एस 2 पर गैर कार्यात्मक नहीं हुआ: पैकेट केवल उसी डिवाइस से भेजे जाने पर प्राप्त होते हैं।

मेरा दूसरा अनुमान सीमित आईपी पता सीमा का उपयोग कर नेटवर्क को सक्रिय रूप से स्कैन करना और उचित प्रतिक्रिया की प्रतीक्षा करना है। दुर्भाग्यवश, इसका तात्पर्य है कि नेटवर्क आईपी पते को संबोधित करने के लिए डीएचसीपी का उपयोग करता है।

उपरोक्त में से कोई भी समाधान सही समाधान प्रतीत नहीं होता है। मेरा पहला अनुमान के लिए

मेरे वर्तमान समाधान:

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 देखें यह स्थानीय सेवाओं को खोजने के दो तरीकों का उल्लेख करता है- एनएसडी और वाईफ़ाई प्रत्यक्ष।

+0

लेकिन वाईफ़ाई प्रत्यक्ष का तात्पर्य है कि आप अपने स्थानीय नेटवर्क से कनेक्शन खो देते हैं, है ना? मैं अभी भी अन्य उपकरणों की खोज करते समय इंटरनेट तक पहुंचने में सक्षम होना चाहता हूं। परीक्षण उद्देश्यों के लिए, यह एक अच्छा एंड्रॉइड ओएस चलाने वाली स्थानीय मशीन को भी खोजने में सक्षम होना अच्छा होगा। – anopheles

+0

फिर एनएसडी आज़माएं। स्कैनिंग जाने का तरीका नहीं है, एक नेटवर्क व्यवस्थापक के लिए यह एक हमले की तरह दिखता है। –

+1

एनएसडी हुड के तहत मल्टीकास्ट का उपयोग नहीं करता है? – anopheles

2

बहुत समान प्रश्न में मेरा उत्तर चेक Android Network Discovery Service (ish) before API 14

मैं belive नहीं है कि बहुस्त्र्पीय गैलेक्सी एस 2 पर काम नहीं कर रहा है, कुछ समय पहले जब मैं कुछ नेटवर्क आवेदन कोडन था, मैं कई परीक्षण कई उपकरणों पर बनाया है, कुछ पुराने जी 1 की तरह, लेकिन एस 2, एस 3 और गैलेक्सी टैब पर भी 10.

लेकिन मल्टीकास्ट का उपयोग करने में सक्षम होने के लिए आपको इसे प्रोग्रामिक रूप से सक्षम करना होगा।

क्या आपने कोड का यह टुकड़ा उपयोग किया है?

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

हां, मेरे पास मेरे नमूना ऐप में उपरोक्त कोड है। मैं अपना पूरा कोड अपनी मूल टिप्पणी में पोस्ट करूंगा। मैं बदनाम रूप से पुष्टि कर सकता हूं कि मेरे नेटवर्क पर विभिन्न मशीनों पर मल्टीकास्ट काम करता है, लेकिन मेरा गैलेक्सी एस 2 खराब तरीके से विफल रहता है :( – anopheles

+0

तो, यदि आपके पास दो एंड्रॉइड डिवाइस हैं तो आप pttdroid चलाने का प्रयास कर सकते हैं, जो opensourced है http://code.google.com/ पी/pttdroid/और मल्टीकास्ट समूहों को डेटा (आवाज) भेजने/प्राप्त करने का विकल्प है। – MP23

संबंधित मुद्दे