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:

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

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.