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:
- ¿Existe un equivalente de Wi-Fi Direct / Wi-Fi P2P para Phonegap / Cordova?
- ¿Cómo puedo manejar múltiples clientes conectados a un servidor mediante sockets?
- Conecta el iPhone a Android Wifi Direct soft AP
- Wi-Fi Directo y "normal" Wi-Fi - ¿Diferentes MAC?
- Configurar una conexión Wifi-Direct entre Android y Raspberry Pi 3 Linux
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?
- ¿Podemos conectarnos al iPhone desde un dispositivo Android aunque no esté en la misma red?
- ¿Puedo conectar Windows PC a un teléfono Android con WiFi Direct
- Android NSD no descubre todos los servicios
- Descubrimiento del servicio directo Wifi de Android
- Cómo obtener la dirección IP directa de WiFi de mi dispositivo
- Cómo detener el descubrimiento de pares en WifiDirect Android
- Detalles del dispositivo WiFi Android WiFi
- Wi-Fi Direct Android
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 integrar la biblioteca de código de Matlab con Android?
- SharedPreferences no se guardará / cargará en PreferenciaActividad