ブロードキャストメッセージを送信し、他のアンドロイドデバイスから回答を受け取るアプリを開発しようとしています。私は、他のデバイスからUDPメッセージを受信するのにいくつかの問題があります。私はこのコードがGingerbreadで動作することを言及する必要がありますが、JellyBeanではもう動作しません。何が問題か分かりません。私は(私は他のデバイスがポート5000でリッスン知っている)ブロードキャストメッセージを送るのはここブロードキャストUDPを送信しますが、他のAndroidデバイスでは受信しません。
は次のとおりです。私はそれを受け取る場所
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();
}
}
そして、ここでは、次のとおりです。
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
私はそれを言及する必要がありますこれらの2つの関数は2つの異なるスレッドで分離されているので、私は同時に送受信できます。
私はまた、次のロック獲得:
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();
とマニフェストファイルのパーミッション:メッセージはWiresharkのとtcpdumpのを使用して送信され、それらが送信された場合、私はテストしている
<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"/>
を。さらに、奇妙なことに、私は自分が送信したブロードキャストメッセージを受信します(しかし、私は自分自身から送られたメッセージを処理する必要はないのでそれらを破棄します)。しかし、他のデバイスから送信されたブロードキャストメッセージは受信しません同じフォーマットでは、送信元アドレスだけが異なり、メッセージが含まれています。いずれの方法でもブロードキャストメッセージに影響を与えてはいけません)。
私が試してみることのできるものが本当になくなったため、アイデアがあれば教えてください。どんな助けもありがとう。ありがとう!
編集:私は、いくつかのテストを行った 場合でも、私は電話のifconfig wlan0の各上で実行され、それが言うとき、インターフェイスがアクティブで、IPが設定されていることを意味
ifconfig wlan0
wlan0: ip 169.254.17.28 mask 255.255.0.0 flags [up broadcast multicast]
のようなものとブロードキャストメッセージとマルチキャストメッセージを受信できますが、使用するときは
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");
これはログに表示されるホストに到達できません。
私は同様の問題を解決しようとすると、私はあなたのポストに出くわしたの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);
}
注意は、いくつかのことルータはデフォルトでマルチキャストDNSを無効にします。 – yorkw
ああ...私はWi-Fiアドホックであることを言及しなければならない – Lara
この投稿を見ることができます:http://stackoverflow.com/a/16208617/1028256それは、一部のwifiドライバがブロードキャストレシーバを無効にすることができ、その場合はスリープモードから復帰した後に発生します。 – Mixaz