gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:01:17 27 4
gpt4 key购买 nike

我正在开发一个从 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)。

我在一些安卓设备上测试过,发现 Google Pixel 2/Pixel 2 XL 无法接收 UDP 广播数据包。除 Pixel 2/Pixel 2 XL 外的 Android 设备运行良好。 Android 8.1 上的 Nexus 也运行良好。

我试图搜索类似的问题,我发现了一些诸如
在 Android 8.0 上未收到 UDP 广播数据包 ( https://bugreports.qt.io/browse/QTBUG-64233 )。
我认为尽管它是用 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;
}
}
}
}
}

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

最佳答案

尝试 [Ruud van Reenen] 的解决方案,结果喜忧参半。但是,在添加了一些额外的权限并启用引用计数后,它对我来说工作得更可靠了。这是我的代码:

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;
}

以及额外的 list 权限。
<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"/>

关于udp - 在 Pixel 2 和 Pixel 2 XL 接收 UDP 广播数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49102743/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com