2013-03-20 8 views
14

मैं कई एंड्रॉइड डिवाइसों के बीच एक वाई-फाई डायरेक्ट कनेक्शन प्रसारित करने की संभावना को देख रहा हूं। मैंने यह जांचने के लिए एक सरल संदेश प्रसारण एप्लिकेशन बनाया है कि यह काम करता है या नहीं, लेकिन अब तक मैं एक संदेश प्रसारित करने में सक्षम नहीं हूं। जब मैं पैकेट भेजने का प्रयास मैं एक 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 करने के लिए एक वाइल्डकार्ड पता जोड़ने की कोशिश की है, लेकिन कोई किस्मत।

सुझाव?

+0

Btw: इस लेख को देखो: http: //developer.android.com/training/connect-devices-wirelessly/wifi-direct.html –

उत्तर

12

बेशर्मी https://code.google.com/p/boxeeremote/wiki/AndroidUDP

से चोरी आप कनेक्शन इस तरह से नेटवर्क हो रही का प्रयास करें:

InetAddress getBroadcastAddress() throws IOException { 
    WifiManager wifi = mContext.getSystemService(Context.WIFI_SERVICE); 
    DhcpInfo dhcp = wifi.getDhcpInfo(); 
    // handle null somehow 

    int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask; 
    byte[] quads = new byte[4]; 
    for (int k = 0; k < 4; k++) 
     quads[k] = (byte) ((broadcast >> k * 8) & 0xFF); 
    return InetAddress.getByAddress(quads); 
} 

फिर एक पैकेट इस तरह से भेजने की कोशिश:

DatagramSocket socket = new DatagramSocket(PORT); 
socket.setBroadcast(true); 
DatagramPacket packet = new DatagramPacket(data.getBytes(), data.length(), 
    getBroadcastAddress(), PORT); 
socket.send(packet); 

// If you want to listen for a response ... 
byte[] buf = new byte[1024]; 
DatagramPacket packet = new DatagramPacket(buf, buf.length); 
socket.receive(packet); 

संपादित करें: एक ही पृष्ठ से इसे पढ़ें ...

WifiManager wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); 
MulticastLock lock = wifi.createMulticastLock("dk.aboaya.pingpong"); 
lock.acquire(); 
serverSocket = new DatagramSocket(19876); 
serverSocket.setSoTimeout(15000); //15 sec wait for the client to connect 
byte[] data = new byte[UDPBatPositionUpdater.secretWord.length()]; 
DatagramPacket packet = new DatagramPacket(data, data.length); 
serverSocket.receive(packet); 
lock.release(); 
String s = new String(packet.getData()); 
System.out.println(s); 

याद रखें, यह काम करने के लिए है कि आप निम्न अनुमति की जरूरत:
< का उपयोग करता है-अनुमति एंड्रॉयड: नाम = "android.permission.CHANGE_WIFI_MULTICAST_STATE"/>

+3

ब्रॉडकास्ट पता प्राप्त करने के लिए उस फ़ंक्शन का उपयोग करने के बाद सॉकेट अपवाद गायब हो गया और प्रसारण काम करता प्रतीत होता है, लेकिन मुझे प्रसारण प्राप्त करने में समस्याएं आ रही हैं दूसरे डिवाइस पर।मैं प्राप्त डिवाइस पर उसी तरह से 'डेटाग्राम सॉकेट' शुरू करता हूं। मैंने तर्क के रूप में 'InetAddress.getByName (" 0.0.0.0 ") जोड़कर 'डेटाग्राम सॉकेट' प्राप्त करने पर वाइल्डकार्ड पते का उपयोग करने का भी प्रयास किया है। कोई भाग्य नहीं। – KatoStoelen

+0

@ user2190832 ने यूडीपी पढ़ने के मेरे जवाब में कुछ और विवरण जोड़ा। –

+0

कोड महान काम करता है, धन्यवाद! उपकरणों के बारे में कुछ विवरण: मैं इस कोड के आधार पर इस संचार को संभालने के लिए अपनी खुद की पुस्तकालयों का निर्माण करता हूं। मैं वर्तमान में पोर्ट 8888 का उपयोग कर रहा हूं। मेरा नेक्सस 5 भेज और प्राप्त कर सकता है। मेरा मोटो जी केवल पैकेज भेज सकता है (और अपना खुद का प्राप्त कर सकता है, लेकिन अन्य डिवाइस नहीं बना सकता है)। मैंने हाल ही में सैमसंग गैलेक्सी एस 2 में कोशिश की और पैकेज भेज और प्राप्त कर सकते हैं। किसी भी तरह मोटोरोला आने वाले प्रसारण को अवरुद्ध कर रहा है। मैंने दो अलग-अलग मोटो जी में कोशिश की, एक विशिष्ट फ़ायरवॉल नीतियों और एक स्टॉक के साथ एक रोटी, लेकिन कोई भाग्य नहीं। –

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