2010-03-10 5 views
5

यह कोड उबंटू, विंडोज और मैक ओएस एक्स में पूरी तरह से काम करता है। यह Nexus 2.1.1 चलाने वाले नेक्सस वन के साथ भी ठीक काम करता है।क्या मल्टीकास्ट एंड्रॉइड 2.0.1 (वर्तमान में ड्रॉइड पर) के लिए टूटा हुआ है या क्या मुझे कुछ याद आ रहा है?

मैं मल्टीकास्ट डेटाग्राम भेजना और सुनना शुरू करता हूं, और सभी कंप्यूटर और नेक्सस वन एक दूसरे को पूरी तरह से देखेंगे। फिर मैं एक ही कोड को Droid (फ़र्मवेयर 2.0.1) पर चलाता हूं, और सभी को Droid द्वारा भेजे गए पैकेट मिलेंगे, लेकिन Droid केवल अपने पैकेट पर सुनेंगे।

यह run() एक थ्रेड की विधि है जो लगातार उस समूह को भेजे आने वाले पैकेट के लिए मल्टीकास्ट समूह पर सुन रही है।

मैं स्थानीय नेटवर्क पर अपने परीक्षण चला रहा हूं जहां मेरे पास राउटर में मल्टीकास्ट समर्थन सक्षम है। मेरा लक्ष्य एक मल्टीकास्ट समूह में संकुल प्रसारित करके ऑनलाइन आने के बाद डिवाइस एक-दूसरे से मिलना है।

public void run() { 
    byte[] buffer = new byte[65535]; 
    DatagramPacket dp = new DatagramPacket(buffer, buffer.length); 

    try { 
     MulticastSocket ms = new MulticastSocket(_port); 
     ms.setNetworkInterface(_ni); //non loopback network interface passed 
     ms.joinGroup(_ia); //the multicast address, currently 224.0.1.16 
     Log.v(TAG,"Joined Group " + _ia); 

     while (true) { 
      ms.receive(dp); 
      String s = new String(dp.getData(),0,dp.getLength()); 
      Log.v(TAG,"Received Package on "+ _ni.getName() +": " + s); 
      Message m = new Message(); 
      Bundle b = new Bundle(); 
      b.putString("event", "Listener ("+_ni.getName()+"): \"" + s + "\""); 
      m.setData(b); 
      dispatchMessage(m); //send to ui thread 
     } 
    } catch (SocketException se) { 
     System.err.println(se); 
    } catch (IOException ie) { 
     System.err.println(ie); 
    } 
} 

इस कोड को उपलब्ध हर वैध नेटवर्क इंटरफेस से बाहर मल्टीकास्ट डेटाग्राम भेजता है (कि लूपबैक इंटरफेस नहीं है) है। WifiManager.MulticastLock:

public void sendPing() { 
    MulticastSocket ms = null; 
    try { 
     ms = new MulticastSocket(_port); 
     ms.setTimeToLive(TTL_GLOBAL); 

     List<NetworkInterface> interfaces = getMulticastNonLoopbackNetworkInterfaces(); 
     for (NetworkInterface iface : interfaces) { 
      //skip loopback 
      if (iface.getName().equals("lo")) 
       continue; 
      ms.setNetworkInterface(iface); 
      _buffer = ("FW-"+ _name +" PING ("+iface.getName()+":"+iface.getInetAddresses().nextElement()+")").getBytes(); 
      DatagramPacket dp = new DatagramPacket(_buffer, _buffer.length,_ia,_port); 
      ms.send(dp); 
      Log.v(TAG,"Announcer: Sent packet - " + new String(_buffer) + " from " + iface.getDisplayName()); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (Exception e2) { 
     e2.printStackTrace(); 
    } 
} 

अद्यतन (2 अप्रैल 2010) मैं मल्टीकास्ट का उपयोग कर बातचीत करने के लिए Droid के नेटवर्क इंटरफेस के लिए एक रास्ता मिल गया।

MulticastLock _wifiMulticastLock = ((WifiManager) context.getSystemService(Context.WIFI_SERVICE)).createMulticastLock("multicastLockNameHere"); 
_wifiMulticastLock.acquire(); 

तो आपका काम पूरा हो ...

if (_wifiMulticastLock != null && _wifiMulticastLock.isHeld()) 
    _wifiMulticastLock.release(); 

बाद मैं ऐसा किया, Droid भेजने और एक मल्टीकास्ट समूह पर UDP डाटाग्राम प्राप्त शुरू कर दिया।

अद्यतन जुलाई-6-2010

अनुरोध के अनुसार, यहाँ मेरे वर्तमान कोड अगली विधि एक सार वर्ग है कि दोनों प्रसारण और मल्टीकास्ट रिसीवर के लिए इस्तेमाल किया जा सकता पर मौजूद है है,।

public void run() { 
    onInit(); 
    try { 
     byte[] data = new byte[65535]; 
     while (isProcessing()) { 
      try { 
       DatagramPacket receivedDatagram = new DatagramPacket(data, data.length); 
       _socket.receive(receivedDatagram); 
       onDatagramReceived(receivedDatagram); 
       data = new byte[65535]; // This pattern is for saving memory allocation. 
      } catch (InterruptedIOException e) { 
       if (!isProcessing()) 
        break; 
      } 
     } // while 

    } catch (Exception e) { 
     Log.e(TAG, e.getMessage(), e); 
    } finally { 
     onStop(); 
     _socket.close(); 
     _socket.disconnect(); 
    } 
} 

आपका विस्तार वर्गों onInit() और onDatagramReceived()

एक मल्टीकास्ट रिसीवर के लिए, को लागू करना चाहिए onInit()कुछ लग रहा है इस तरह:

_socket = new MulticastSocket(PORT_MULTICAST); 
InetAddress groupAddress = InetAddress.getByAddress(MULTICAST_GROUP_ADDRESS); 
InetAddress groupInetAddress = FrostWireUtils.fastResolveAddress(groupAddress); //reflection hack to not resolve ips 
try { 
    _socket.setSoTimeout(500); 
    _socket.setTimeToLive(MULTICAST_TTL_GLOBAL); 
    _socket.setReuseAddress(true); 
    _socket.setNetworkInterface(
     WifiUtils.getWifiNetworkInterface()); 
    _socket.joinGroup(groupInetAddress); 
    WifiUtils.lockMulticast(); 
} catch (Exception e) { 
    Log.e(TAG, e.getMessage(), e); 
} 
+0

मैं अपने नेक्सस-वन (फर्मवेयर 2.1.1) पर मल्टीकास्ट पैकेट प्राप्त करने का प्रयास कर रहा हूं। मैंने उपरोक्त कोड का उपयोग किया, लेकिन अब तक कोई भाग्य नहीं था। क्या आप अपना पूरा स्रोत संलग्न कर सकते हैं ताकि मैं इसकी तुलना अपने साथ कर सकूं?धन्यवाद, आंख – Eyal

+0

ईया, मैंने एक अपडेट जोड़ा है, उम्मीद है कि यह मदद करता है। – Gubatron

उत्तर

0

मैं एक और परीक्षण को क्रियान्वित किया है, इस बार यूडीपी प्रसारण का उपयोग करना। यह काम करता है।

निष्कर्ष: मेरे ज्ञान की सीमा तक फर्मवेयर 2.0.1 पर मोटोरोला Droid फोन मल्टीकास्ट का समर्थन नहीं करते हैं, लेकिन आप हमेशा प्रसारण पते पर नियमित डेटाग्राम पैकेट का उपयोग कर सकते हैं।

+0

इस धागे पर अद्यतन (अप्रैल 2 9 2010) देखें। मैंने मल्टीकास्ट पर मल्टीकास्ट पर संवाद करने में कामयाब रहा है, फर्मवेयर 2.0.1 का उपयोग करके मल्टीकास्ट लॉक को प्राप्त कर रहा है। "WifiManager.MulticastLock वाईफ़ाई मल्टीकास्ट पैकेट प्राप्त करने देता है। आम तौर पर वाईफ़ाई ढेर बाहर फिल्टर पैकेट स्पष्ट रूप से इस उपकरण के लिए लक्षित नहीं। एक MulticastLock acquring ढेर पैकेट प्राप्त करने मल्टीकास्ट पतों को संबोधित कारण होगा। इन अतिरिक्त पैकेट का संसाधन एक उल्लेखनीय बैटरी नाली का कारण बन सकता है और जरूरत पड़ने पर अक्षम किया जाना चाहिए। " – Gubatron

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