场景很简单:我有两个智能手机 A 和 B 。 A 以特定频率(例如每分钟一个)广播UDP消息,而 B 侦听并捕获这些数据包。 两个设备都连接到同一个WiFi本地网络,可以相互ping通。
当我使用这两个设备时,一切都按预期工作:
我可以看到设备B正确接收UDP消息。
然后,我用摩托罗拉Moto G,第1代,Android 5.1替换接收器设备B.摩托罗拉手机没有接收到这些数据包。 使用Wireshark我可以看到A像以前一样继续发送数据包。
这是我用来发送的代码:
private class D2DBroadcastThread implements Runnable {
public void run() {
Log.i(TAG, "Running the broadcast message runnable");
if (context == null) {
Log.e(TAG, "Context is null!!!");
}
broadcastMessage(new D2DMessage(context, D2DMessage.MsgType.HELLO));
mBroadcastHandler.postDelayed(mBroadcastRunnable, Constants.D2D_BROADCAST_INTERVAL);
}
private void broadcastMessage(final D2DMessage msg) {
new Thread() {
public void run() {
DatagramPacket packet;
MulticastSocket socket = null;
try {
byte[] data = Utils.objectToByteArray(msg);
socket = new MulticastSocket(Constants.D2D_BROADCAST_PORT);
socket.setBroadcast(true);
InetAddress myIpAddress = Utils.getIpAddress();
if (myIpAddress != null) {
Log.i(TAG, "My IP address: " + myIpAddress.getHostAddress());
InetAddress broadcastAddress = Utils.getBroadcast(myIpAddress);
Log.i(TAG, "Broadcast IP address: " + broadcastAddress);
try {
packet = new DatagramPacket(data, data.length, broadcastAddress,
Constants.D2D_BROADCAST_PORT);
socket.send(packet);
Log.i(TAG, "==>> Broadcast message sent to " + broadcastAddress);
Log.i(TAG, "==>> CMD: " + msg);
} catch (NullPointerException | IOException e) {
Log.e(TAG, "Exception while sending data: " + e);
}
}
} catch (Exception e) {
Log.e(TAG, "Exception while sending data: " + e);
} finally {
if (socket != null) {
socket.close();
}
}
}
}.start();
}
}
这是我用来接收的代码:
receiveSocket = new MulticastSocket(Constants.D2D_BROADCAST_PORT);
receiveSocket.setBroadcast(true);
Log.i(TAG, "Started listening on multicast socket.");
try {
while (true) {
Log.i(TAG, "Waiting for broadcasted data...");
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
receiveSocket.receive(packet);
Log.d(TAG, "Received a new broadcast packet from: " + packet.getAddress());
processPacket(packet);
}
} catch (IOException e) {
Log.d(TAG, "The socket was closed.");
}