Unicast UDP de Android funciona, pero la difusión no
Para una tarea, estamos intentando configurar varios dispositivos Android para recibir una transmisión UDP desde una computadora portátil, a través de una red WiFi local.
Que funciona:
- ¿Cómo trabajar con UDP en Android?
- Difusión de audio / vídeo desde android vía udp a wifi y escuchar con vlc
- Comunicación UDP de Android
- Android ¿Recibe UDP de la aplicación de escritorio de C # a través de LAN?
- Dirección de difusión de Android
- Terminal de Python en dos portátiles son capaces de enviar y recibir UDP emisiones o unicasts entre sí.
- Los dispositivos Android pueden recibir un mensaje UDP enviado directamente a su IP
Lo que no funciona:
- El dispositivo Android (LG / Google Nexus 4) no recibe el mensaje de difusión UDP (el otro ordenador portátil que ejecuta Python)
¿Algún consejo? Aquí está nuestra fuente para cada componente (prestado sin vergüenza de los internets)
Python recibe la emisión
import select, socket port = 50000 bufferSize = 1024 ip = '0.0.0.0' s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind((ip, port)) while True: msg, result = s.recvfrom(bufferSize) pr int "Received message: ", msg
Python enviar broadcast
# Send UDP broadcast packets port = 50000 import sys, time from socket import * s = socket(AF_INET, SOCK_DGRAM) s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) data = repr(time.time()) + '\n' s.sendto(data, ('192.168.1.255', port))
Androide
private void receiveUDP() { final String[] text = new String[1]; final int server_port = 50000; // create buffer final byte[] message = new byte[1500]; final DatagramPacket p = new DatagramPacket(message, message.length); // listen for message, put in buffer new Thread(new Runnable() { @Override public void run() { try { while (true) { Log.d(Main.class.getName(), "Created socket"); DatagramSocket s = new DatagramSocket(server_port); s.receive(p); text[0] = new String(message, 0, p.getLength()); Log.d(Main.class.getName(), "message:" + text[0]); s.close(); } } catch (IOException e) { Log.e(this.getClass().getName(), "An unexpected error occurred", e); } } }).start(); }
Para reiterar, lo único que no funciona es recibir UDP broadcast en Android – puede recibir mensajes UDP individuales a su IP, y el terminal Python recibe la transmisión UDP de la otra laptop ….
¿Algún consejo?
ACTUALIZAR
Veo que se supone que debemos usar MulticastLock – ahora he intentado esto y todavía no funciona. Este es el nuevo código de Android:
private void receiveUDP() { final String[] text = new String[1]; final int server_port = 50001; // create buffer final byte[] message = new byte[1500]; final DatagramPacket p = new DatagramPacket(message, message.length); // listen for message, put in buffer new Thread(new Runnable() { @Override public void run() { DatagramSocket s = null; while (true) { try{ WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiManager.MulticastLock lock = wifi.createMulticastLock("Main"); lock.acquire(); s = new DatagramSocket(server_port, InetAddress.getByName("192.168.1.13")); Log.d(Main.class.getName(), "Created socket"); s.receive(p); lock.release(); text[0] = new String(message, 0, p.getLength()); Log.d(Main.class.getName(), "message:" + text[0]); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(context, "Received message: "+text[0], Toast.LENGTH_SHORT).show(); } }); } catch (SocketException e) { Log.e(Main.class.getName(), "An unexpected error occurred", e); } catch (IOException e) { Log.e(Main.class.getName(), "An unexpected error occurred", e); } finally { if (s != null) s.close(); Log.d(Main.class.getName(), "Closing socket"); } } } }).start(); }
- No se pueden recibir paquetes UDP adecuados mediante SSDP
- ¿Cómo puedo convertir ByteArrayInputStream a jpeg y mostrar en android móvil?
- ¿Fuerza el androide para enviar paquetes UDP inmediatamente?
- Paquetes UDP (vía WiFi Direct) nunca llegan
- Envío de paquetes UDP desde ANDROID 2.2 (deseo de HTC)
- Solución de streaming UDP o RTP para android
- Obtener la dirección de difusión wifi en Android wifi hotspot
- UDP Hole Punching no es posible con el proveedor móvil
Parece que algunos teléfonos, incluyendo Nexus 4, bloquean el UDP recibir la capacidad de difusión. La solución es utilizar un teléfono diferente. Por ejemplo, funciona en el barato Huawei G300