Envoie la diffusion UDP mais ne la reçoit pas sur d'autres appareils Android

Je suis en train de développer une application qui envoie des messages à diffusion générale et reçoit des réponses de l'autre les appareils android. Je vais avoir quelques difficultés lors de la réception des messages UDP à partir d'autres périphériques. Je tiens à préciser que ce code a travaillé sur pain d'épice, mais sur JellyBean, ça ne marche plus et je ne sais pas quel pourrait être le problème.

C'est là que j'ai envoyer le message à diffusion générale (je sais que les autres périphériques à écouter sur le port 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();
    }

}

Et c'est là où j'ai le recevoir :

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

Je dois mentionner que ces 2 fonctions sont séparées en 2 threads différents pour que je puisse envoyer et recevoir simultanément.

J'ai aussi l'acquisition de la suite des écluses:

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

Et les autorisations sur le fichier Manifeste :

<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"/>

J'ai testé si les messages sont envoyés à l'aide de wireshark et tcpdump et ils sont envoyés. En outre, ce qui est encore plus étrange, je reçois la diffusion de messages que j'envoie (mais je les rejette parce que je n'ai pas besoin de traiter les messages envoyés à partir de moi-même) mais je n'ai pas de recevoir la diffusion des messages envoyés à partir d'autres appareils (qui doit avoir le même format, seule l'adresse de la source serait différent et le message contenu, de toute façon ne devrait pas affecter le message à diffusion générale).

S'il vous plaît laissez-moi savoir si vous avez des idées parce que j'ai vraiment manqué de rien d'autre que je pourrais essayer. Toute aide serait appréciée. Merci!

EDIT:
J'ai fait quelques tests, et même si quand je le lance sur chacun des téléphones ifconfig wlan0 et il dit quelque chose comme

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

ce qui signifie que l'interface est active et l'IP est définie et peut recevoir des messages de diffusion et de multidiffusion msgs mais quand j'utilise

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

Il montre dans les journaux de l'hôte n'est pas accessible.

C'est là que je me tourne sur le Wi-fi

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

}

source d'informationauteur Lara