यह कोड उबंटू, विंडोज और मैक ओएस एक्स में पूरी तरह से काम करता है। यह 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);
}
मैं अपने नेक्सस-वन (फर्मवेयर 2.1.1) पर मल्टीकास्ट पैकेट प्राप्त करने का प्रयास कर रहा हूं। मैंने उपरोक्त कोड का उपयोग किया, लेकिन अब तक कोई भाग्य नहीं था। क्या आप अपना पूरा स्रोत संलग्न कर सकते हैं ताकि मैं इसकी तुलना अपने साथ कर सकूं?धन्यवाद, आंख – Eyal
ईया, मैंने एक अपडेट जोड़ा है, उम्मीद है कि यह मदद करता है। – Gubatron