मैं कई एंड्रॉइड डिवाइसों के बीच एक वाई-फाई डायरेक्ट कनेक्शन प्रसारित करने की संभावना को देख रहा हूं। मैंने यह जांचने के लिए एक सरल संदेश प्रसारण एप्लिकेशन बनाया है कि यह काम करता है या नहीं, लेकिन अब तक मैं एक संदेश प्रसारित करने में सक्षम नहीं हूं। जब मैं पैकेट भेजने का प्रयास मैं एक SocketException (नेटवर्क पहुँच योग्य नहीं है):वाई-फाई डायरेक्ट पर प्रसारण
03-20 13:23:00.148: E/UdpBroadcaster(4180): sendto failed: ENETUNREACH (Network is unreachable)
03-20 13:23:00.148: E/UdpBroadcaster(4180): java.net.SocketException: sendto failed: ENETUNREACH (Network is unreachable)
03-20 13:23:00.148: E/UdpBroadcaster(4180): at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:496)
03-20 13:23:00.148: E/UdpBroadcaster(4180): at libcore.io.IoBridge.sendto(IoBridge.java:465)
03-20 13:23:00.148: E/UdpBroadcaster(4180): at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:182)
03-20 13:23:00.148: E/UdpBroadcaster(4180): at java.net.DatagramSocket.send(DatagramSocket.java:307)
03-20 13:23:00.148: E/UdpBroadcaster(4180): at com.example.android.wifidirect.UdpBroadcaster.sendMessage(UdpBroadcaster.java:59)
03-20 13:23:00.148: E/UdpBroadcaster(4180): at com.example.android.wifidirect.UdpBroadcaster.run(UdpBroadcaster.java:44)
03-20 13:23:00.148: E/UdpBroadcaster(4180): Caused by: libcore.io.ErrnoException: sendto failed: ENETUNREACH (Network is unreachable)
03-20 13:23:00.148: E/UdpBroadcaster(4180): at libcore.io.Posix.sendtoBytes(Native Method)
03-20 13:23:00.148: E/UdpBroadcaster(4180): at libcore.io.Posix.sendto(Posix.java:146)
03-20 13:23:00.148: E/UdpBroadcaster(4180): at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177)
03-20 13:23:00.148: E/UdpBroadcaster(4180): at libcore.io.IoBridge.sendto(IoBridge.java:463)
03-20 13:23:00.148: E/UdpBroadcaster(4180): ... 4 more
यह मेरा कोड का सार है:
InetAddress broadcastAddress = InetAddress.getByName("255.255.255.255");
int port = 8888;
DatagramSocket socket = new DatagramSocket(port);
socket.setBroadcast(true);
socket.connect(broadcastAddress, port);
String message = "Hello";
byte[] buffer = message.getBytes();
DatagramPacket packet = new DatagramPacket(
buffer, buffer.length, broadcastAddress, port);
try {
socket.send(packet); // <----- Causes a SocketException
} catch (IOException e) {
Log.e(TAG, e.getMessage(), e);
}
This post पता चलता है कि Wi-Fi प्रत्यक्ष से अधिक प्रसारण संभव होना चाहिए।
क्या किसी को पता है कि पर वाई-फाई डायरेक्ट पर प्रसारण करना एंड्रॉइड डिवाइस वास्तव में काम करता है? अगर यह काम करना चाहिए, तो मैं गलत क्या कर रहा हूं?
मुझे लगता है कि डिवाइस नहीं जानते हैं कि ब्रॉडकास्ट पैकेट को रूट करना है। मेरे मामले में इसे डिवाइस को रूट किए बिना और मैन्युअल रूप से प्रसारण पैकेट के लिए एक मार्ग जोड़ने के बिना काम करने की आवश्यकता है।
अद्यतन
getBroadcastAddress()
समारोह रोमेन Hippeau ने सुझाव दिया इस्तेमाल करने के बाद SocketException गायब हो गया और यह प्रसारण की तरह के रूप में इरादा काम कर रहा है लगता है। हालांकि, मुझे दूसरे डिवाइस पर प्रसारण प्राप्त करने में समस्याएं आ रही हैं।
मैं प्रसारण प्राप्त करने के लिए निम्नलिखित कोड का उपयोग कर रहा:
DatagramSocket socket = null;
try {
socket = new DatagramSocket(8888);
socket.setBroadcast(true); // Not needed?
socket.setSoTimeout(200);
DatagramPacket packet = null;
while (!mStopping) {
byte[] buffer = new byte[1024];
packet = new DatagramPacket(buffer, buffer.length);
try {
socket.receive(packet);
if (packet.getData().length > 0) {
String receivedString = new String(packet.getData());
Log.i(TAG, "Received string: " + receivedString);
}
} catch (InterruptedIOException e) { /* Ignore */ }
}
} catch (IOException e) {
Log.e(TAG, e.getMessage(), e);
} finally {
if (socket != null)
socket.close();
}
मैं भी InetAddress.getByName("0.0.0.0")
तर्क के रूप में जोड़कर DatagramSocket
करने के लिए एक वाइल्डकार्ड पता जोड़ने की कोशिश की है, लेकिन कोई किस्मत।
सुझाव?
Btw: इस लेख को देखो: http: //developer.android.com/training/connect-devices-wirelessly/wifi-direct.html –