我正在开发一个从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();
}
Run Code Online (Sandbox Code Playgroud)
这是有关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;
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
是否有人遇到此问题并解决?在此先感谢您。
小智 0
我在使用 Pixel 2 XL 时也遇到了同样的问题。我添加了获取 Wifi 多播锁,以便能够侦听 UDP 广播消息。
WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wm.createMulticastLock("mydebuginfo");
multicastLock.acquire();
Run Code Online (Sandbox Code Playgroud)
并在 Android Manifest 中添加了此权限:
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
Run Code Online (Sandbox Code Playgroud)
但 Pixel 2 (XL) 上的 UDP 广播接收似乎只能偶尔工作。我还没找到规律,看来是随机的。我知道 UDP 并不意味着可靠,但同一 Wifi LAN 上的所有其他设备都能完美接收 UDP 广播数据包,不会丢失。