Transmisión por Wi-Fi Direct

Estoy viendo la posibilidad de transmitir a través de una conexión Wi-Fi Direct entre varios dispositivos Android. He creado una simple aplicación de difusión de mensajes para probar si funciona o no, pero hasta ahora no he podido transmitir un mensaje. Cuando intento enviar el paquete consigo una SocketException (la red es unreachable):

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 

Esta es la esencia de mi código:

 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); } 

Esta publicación sugiere que la transmisión por Wi-Fi Direct debería ser posible.

¿Alguien sabe si la radiodifusión por Wi-Fi Direct en dispositivos Android funciona realmente? Si funciona, ¿qué estoy haciendo mal?

Estoy empezando a pensar que los dispositivos no saben dónde enrutar los paquetes de difusión. En mi caso, necesita trabajar sin tener que root el dispositivo y agregar manualmente una ruta para paquetes de difusión.


Actualizar

Después de usar la función getBroadcastAddress() sugerida por Romain Hippeau la SocketException desapareció y parece que la transmisión está funcionando como estaba previsto. Sin embargo, tengo problemas para recibir la transmisión en el segundo dispositivo.

Estoy usando el siguiente código para recibir la transmisión:

 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(); } 

También he intentado agregar una dirección del comodín al DatagramSocket añadiendo InetAddress.getByName("0.0.0.0") como argumento, pero ninguna suerte.

Sugerencias?

Intempestamente robado de https://code.google.com/p/boxeeremote/wiki/AndroidUDP

Trate de obtener conexión de red de esta manera:

 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); } 

A continuación, intente enviar un paquete de esta manera:

 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); 

Editar: De la misma página para leer intenta esto …

 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); 

Recuerde que necesita el siguiente permiso para que funcione:
<Uses-permission android: name = "android.permission.CHANGE_WIFI_MULTICAST_STATE" />

  • Cómo alcanzar la exhibición del wifi después de conectar por el wifi directo
  • IOS 7 Multipeer Connectivity es compatible con Android Wi-Fi Direct?
  • Pasos para transmitir de forma programada de Android a receptor de miracast
  • Desconectar de un grupo directo wifi
  • cómo encontrar la dirección del dispositivo cliente wifip2p?
  • ¿Qué es diferente de NSD y WifiP2pManager?
  • WiFi-Comunicación directa entre Mac / Windows y Android
  • El estado de WifiP2pDevice permanece en INVITADO después de la invitación directa de Wifi
  • WiFi-Direct en JellyBean, WPA Suplicante desordenado
  • Obtenga la dirección IP de la interfaz de red de Android
  • Transferencia de datos entre dispositivos Android mediante wifi directo?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.