Envía Broadcast UDP pero no lo reciba en otros dispositivos Android

Estoy tratando de desarrollar una aplicación que envíe algunos mensajes de difusión y reciba algunas respuestas de los otros dispositivos Android. Estoy teniendo algunos problemas para recibir los mensajes UDP de los otros dispositivos. Debo mencionar que este código funcionó en Gingerbread pero en JellyBean ya no funciona y no sé cuál podría ser el problema.

Aquí es donde envío el mensaje de difusión (sé que los otros dispositivos escuchan en el puerto 5000):

 private void sendUDPMessage(String msg) {

    try {
        DatagramSocket clientSocket = new DatagramSocket();

        clientSocket.setBroadcast(true);
        InetAddress address = InetAddress.getByName(Utils.getBroadcastAddress());

        byte[] sendData;

        sendData = msg.getBytes();
        DatagramPacket sendPacket = new DatagramPacket(sendData,
                sendData.length, address, 5000);
        clientSocket.send(sendPacket);

        clientSocket.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

Y aquí es donde la recibo:

private void start_UDP()
{
    try {
            serverSocketUDP = new DatagramSocket(5000);
        }
    catch (Exception e) {

        Log.i(LOGTAG, "Exception opening DatagramSocket UDP");
    }

    final byte[] receiveData = new byte[1024];


    while(runningUDP) {
        Log.d(LOGTAG, "Waiting for Broadcast request in ServerUDP.");

        final DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);

        serverSocketUDP.receive(receivePacket);


                byte[] sendData = new byte[1024];
                InetAddress address = receivePacket.getAddress();
                int port = receivePacket.getPort();
                if(!receivePacket.getAddress().getHostAddress().equals(Utils.getLocalIpAddress()))
                {
                    String req = new String(receivePacket.getData(), 0, receivePacket.getLength());


                    Log.d(LOGTAG, "Received UDP message : "+req+" from: "+receivePacket.getAddress().getHostAddress());
                }
                      }// while ends
       }//method ends

Debo mencionar que estas 2 funciones están separadas en 2 hilos diferentes, por lo que puedo enviar y recibir simultáneamente.

También adquiero los siguientes bloqueos:

    powerManager =(PowerManager)context.getSystemService(Context.POWER_SERVICE);
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK ,LOGTAG); // PARTIAL_WAKE_LOCK Only keeps CPU on
    wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
    wifiLock = wifiManager.createWifiLock(3, LOGTAG);
    multicastLock = wifiManager.createMulticastLock(LOGTAG);

    wakeLock.acquire();
    multicastLock.acquire();
    wifiLock.acquire();

Y los permisos sobre el archivo Manifest:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>

He probado si los mensajes se envían utilizando wireshark y tcpdump y se envían. Además, lo que es aún más extraño, recibo los mensajes de difusión que envío (pero los descarto porque no necesito procesar los mensajes enviados de mí mismo), pero no recibo los mensajes de difusión enviados desde otros dispositivos (que deberían tener la mismo formato, solo la dirección de origen sería diferente y el mensaje contenido, de cualquier manera no debería afectar al mensaje de difusión).

Por favor, avíseme si tiene alguna idea porque realmente me quedé sin nada más que pudiera probar. Cualquier ayuda sería apreciada. ¡Gracias!

EDITAR: He hecho algunas pruebas e incluso cuando ejecuto en cada uno de los teléfonos ifconfig wlan0 y dice algo así como

  ifconfig wlan0
  wlan0: ip 169.254.17.28 mask 255.255.0.0 flags [up broadcast multicast]

lo que significa que la interfaz está activa y la IP está configurada y puede recibir mensajes de difusión y mensajes de multidifusión, pero cuando uso

                 InetAddress in=InetAddress.getByName("169.254.17.28");
            if (in.isReachable(1000))
                Log.i(LOGTAG, "host is reachable");
            else
                Log.i(LOGTAG, "host is not reachable");

Se muestra en el host de registros no es accesible.

Aquí es donde enciendo el wifi.

    private void startWifiAdhoc() {

    WifiManager wifiManager =     (WifiManager)SharingFileService.context.getSystemService(Context.WIFI_SERVICE);
    String command="";
    if (condWifiAdhoc == false) {

        condWifiAdhoc=true;
        wifiInterface = Utils.getWifiInterface();


        wifiManager.setWifiEnabled(true);
        localIP = Utils.getLinkLocalAddress();
    }
    else
    {
        wifiManager.setWifiEnabled(true);
        localIP = Utils.getLinkLocalAddress();
    }
        // Set wifi ad-hoc
        command = context.getFilesDir().getPath()
                + "/iwconfig " + wifiInterface + " mode ad-hoc essid "
                + "mcp" + " channel " + "1" + " commit\n";

        Log.i(LOGTAG, command);
        Utils.rootExec(command);


        Log.i(LOGTAG, "Ip address used :" + localIP);
        command = context.getFilesDir().getPath()
                + "/ifconfig " + wifiInterface + " " + localIP
                + " netmask 255.255.0.0 up\n";



        Log.i(LOGTAG, command);
        Utils.rootExec(command);

}

Respuestas a la pregunta(2)

Su respuesta a la pregunta