首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Pixel 2和Pixel 2 XL接收UDP广播数据包

在Pixel 2和Pixel 2 XL接收UDP广播数据包
EN

Stack Overflow用户
提问于 2018-03-05 10:44:12
回答 2查看 1.1K关注 0票数 5

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

为了找出原因,我制作了两个测试应用程序:一个是UDP广播发送器( 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也运行得很好。

我试着搜索类似的问题,我发现了一些,比如在Android8.0( https://bugreports.qt.io/browse/QTBUG-64233 )上没有接收到UDP广播数据包。我认为这可能是由同样的问题造成的,尽管它是用QT编写的。

以下是关于UDP广播发送器的简要代码

代码语言:javascript
运行
复制
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广播发送器的简要代码

代码语言:javascript
运行
复制
   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;
               }
            }
         }
      }
   }

有没有人遇到过这个问题并解决了它?感谢您的支持。

EN

回答 2

Stack Overflow用户

发布于 2019-09-07 07:49:12

尝试Ruud van Reenen的解决方案,我得到的结果好坏参半。然而,在添加了一些额外的权限,并启用了引用计数后,它对我来说更可靠了。下面是我的代码:

代码语言:javascript
运行
复制
WifiManager wm = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wm.createMulticastLock("RavnApplication");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();

...

// don't forget to release when you're done...
if (multicastLock != null) {
    multicastLock.release();
    multicastLock = null;
}

以及附加的清单权限。

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
票数 3
EN

Stack Overflow用户

发布于 2018-04-03 16:02:10

我在Pixel2XL上也遇到过同样的问题。我添加了获取Wifi组播锁,以便能够收听UDP广播的消息。

代码语言:javascript
运行
复制
WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wm.createMulticastLock("mydebuginfo");
multicastLock.acquire();

并在Android Manifest中添加了以下权限:

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49102743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档