首页 文章

在Pixel 2和Pixel 2 XL接收UDP广播包

提问于
浏览
2

我正在开发一个从Wi-Fi相机接收UPD广播包的应用程序 . 在我发现在Google Pixel 2 / Pixel 2 XL上接收UPD广播数据包的问题之前,它曾经很好 .

为了弄清楚原因,我制作了2个测试应用程序:一个是UPD广播发送者(https://senatech.box.com/s/gmhr391pbl32lqai0mhkffyk6j0ckle5),另一个是UDP广播接收者(https://senatech.box.com/s/abamuor47nlafocs035nfuj90d0uvx0m) .

我在一些Android设备上测试了它们,发现Google Pixel 2 / Pixel 2 XL无法恢复UDP广播数据包 . 除Pixel 2 / Pixel 2 XL之外的Android设备运行良好 . Android 8.1上的Nexus运行良好 .

我试图搜索类似的问题,我发现一些如Android 8.0(https://bugreports.qt.io/browse/QTBUG-64233)上没有收到的UDP广播包 . 我认为这可能是由于同样的问题导致的,尽管它是用QT编写的 .

这是UDP广播发送者的简短代码

public void sendUPDBroadcast() {
   Thread thread = new Thread() {
      @Override
      public void run() {
         DatagramSocket ds = null;
         int port = 0;
         String udpData = "";
         try {         
            port = Integer.parseInt(etPort.getText().toString());
            udpData = etUDPData.getText().toString();
            InetAddress ia = InetAddress.getByName("192.168.255.255");
            ds = new DatagramSocket(port);
            DatagramPacket data = new DatagramPacket(udpData.getBytes(), udpData.getBytes().length, ia, port);
            ds.send(data);
         } catch(Exception e) {
         } finally {
            if (ds != null) {
               ds.close();
               ds = null;
            }
         }
      }
   };
   thread.start();
}

这是UDP广播发送者的简短代码

packet = new DatagramPacket(buffer, buffer.length);
   socket = new DatagramSocket(port);
   socket.setBroadcast(true);

   @Override
   public void run() {
      try {
         while (alive) {
            try {
               packet.setLength(buffer.length);
               socket.receive(packet);
               String s = stringFromPacket(packet);
            } catch (java.io.InterruptedIOException e) {
            } catch (java.io.IOException ex) {
            } catch (Exception allException) {
            } finally {
               if (socket != null)
                  socket.close();
                  socket = null;
               }
            }
         }
      }
   }

有没有人遇到过这个问题并修复它?先谢谢你 .

1 回答

  • 0

    我遇到了与Pixel 2 XL相同的问题 . 我已经添加了一个Wifi Multicast锁,以便能够收听UDP广播的消息 .

    WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
    WifiManager.MulticastLock multicastLock = wm.createMulticastLock("mydebuginfo");
    multicastLock.acquire();
    

    并在Android Manifest中添加了此权限:

    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
    

    但Pixel 2(XL)上的UDP广播接收似乎只是偶尔使用 . 我还没有找到一个模式,似乎是随机的 . 我知道UDP并不是可靠的,但是同一个Wifi LAN上的所有其他设备都能完美地接收UDP广播数据包而不会丢失 .

相关问题