Android中的UDP广播不适用于所有设备

时间:2016-09-26 07:46:21

标签: android sockets networking udp broadcast

场景很简单:我有两个智能手机 A B A 以特定频率(例如每分钟一个)广播UDP消息,而 B 侦听并捕获这些数据包。 两个设备都连接到同一个WiFi本地网络,可以相互ping通。

工作方案

当我使用这两个设备时,一切都按预期工作:

  • 设备A(发件人):Sony Xperia Z5,Android 6.0.1。
  • 设备B(接收器):Xiaomi Mi 4S,Android 5.1.1。

我可以看到设备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.");
  }

0 个答案:

没有答案