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
Vous devez vous connecter pour publier un commentaire.
J'ai eu ce travail en utilisant une méthode décrite ici pour calculer l'adresse de diffusion: https://code.google.com/p/boxeeremote/wiki/AndroidUDP
Voici mon récepteur:
Et voici mon expéditeur:
Je suis tombé sur votre message lorsque vous tentez de résoudre un problème similaire. Avez-vous des trucs de travail?
Dans mon cas, j'avais essayé d'obtenir une Nexus 7 (première gen avec Jelly Bean 4.3) et Nexus One (Gingerbread 2.3.6) de parler les uns aux autres via UDP. Au départ, mon application, en cours d'exécution sur les deux appareils, avec succès lien, mais seulement avec une communication à sens unique à partir du téléphone à la tablette. Je n'avais qu'une permission en place dans le manifeste: INTERNET. Communication de la tablette, le téléphone a commencé à travailler une fois que j'avais ajouté le ACCESS_NETWORK_STATE la permission de le manifester.
Si, pour une raison quelconque, la Nexus 7 est heureux avec juste le INTERNET autorisation pour l'envoi et la réception des paquets UDP (eh bien, mon implémentation particulière, au moins). Le Nexus One sera envoyer avec seulement l'INTERNET permission, mais ne recevront pas moins que le ACCESS_NETWORK_STATE, l'autorisation est donnée.
Votre code ressemble à la mienne (je ne reconnais pas votre "UTILITAIRES". les appels, cependant). Dans mon cas, même si, pour les fins de test, j'ai codé en dur l'adresse de diffusion (192.168.n.255). Je suis sur un point d'accès lorsque vous êtes sur un réseau ad hoc. Peut-être qui a un certain effet.