Senden Sie Broadcast-UDP, aber empfangen Sie es nicht auf anderen Android-Geräten
Ich versuche, eine App zu entwickeln, die einige Broadcast-Nachrichten sendet und einige Antworten von den anderen Android-Geräten empfängt. Ich habe Probleme beim Empfangen der UDP-Nachrichten von den anderen Geräten. Ich sollte erwähnen, dass dieser Code bei Gingerbread funktioniert hat, aber bei JellyBean funktioniert er nicht mehr und ich weiß nicht, was das Problem sein könnte.
Hier sende ich die Broadcast-Nachricht (ich weiß, dass die anderen Geräte Port 5000 abhören):
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();
}
}
Und hier bekomme ich es:
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
Ich sollte erwähnen, dass diese 2 Funktionen in 2 verschiedenen Threads getrennt sind, damit ich gleichzeitig senden und empfangen kann.
Ich erwerbe auch folgende Schlösser:
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();
Und die Berechtigungen für die Manifest-Datei:
<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"/>
Ich habe getestet, ob die Nachrichten mit wireshark und tcpdump gesendet werden, und sie werden gesendet. Darüber hinaus, was noch seltsamer ist, erhalte ich die gesendeten Broadcast-Nachrichten (aber ich verwerfe sie, weil ich die von mir selbst gesendeten Nachrichten nicht verarbeiten muss), aber ich erhalte die von den anderen Geräten gesendeten Broadcast-Nachrichten (die die haben sollten) nicht dasselbe Format, nur die Quelladresse wäre unterschiedlich und die enthaltene Nachricht sollte in keiner Weise die Broadcast-Nachricht beeinflussen).
Bitte lassen Sie mich wissen, wenn Sie irgendwelche Ideen haben, weil mir wirklich alles ausgeht, was ich versuchen könnte. Jede Hilfe wäre dankbar. Vielen Dank!
EDIT: Ich habe einige Tests gemacht und auch wenn ich auf jedem der Telefone ifconfig wlan0 laufen lasse und es so etwas aussagt
ifconfig wlan0
wlan0: ip 169.254.17.28 mask 255.255.0.0 flags [up broadcast multicast]
was bedeutet, dass die Schnittstelle aktiv ist und die IP eingestellt ist und Broadcast-Nachrichten und Multicast-Nachrichten empfangen kann, aber wenn ich verwende
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");
Es zeigt in den Protokollen, dass der Host nicht erreichbar ist.
Hier schalte ich das WLAN ein
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);
}