安卓UDP通信.无法从设备接收数据

  • 本文关键字:数据 UDP 通信 安卓 android
  • 更新时间 :
  • 英文 :


有一个物理设备,可以使用UDP协议连接电话。 问题是这样的:对设备进行编程的电子工程师编写了一个与该设备交互的桌面程序(也使用 UDP),并且在那里一切运行顺利:设备接收命令并发送响应,没有任何问题和异常。

但是有了电话 - 麻烦...手机通过WiFi连接到设备没有问题,发送命令也没有任何问题(没有超时例外),但是接收有问题-一旦答案来了,另一个就没有来了。一般来说,socket.receive不像在桌面程序上那样稳定,经常弹出超时异常...

我提供了它所需的所有权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />

我在异步任务中运行一个命令:

private class GetStatus extends AsyncTask<byte[], Void, UdpResult> {
@Override
protected void onPreExecute() {
super.onPreExecute();
isPinging = true;
if (udpSettingsListener != null) {
udpSettingsListener.onPreGetStatus();
}
}
@Override
protected UdpResult doInBackground(byte[]... params) {
UdpResult udpResult = sendCommand(params[0]);
udpResult.opName = "GetStatus";
udpResult.odDate = System.currentTimeMillis();
udpResults.add(udpResult);
return udpResult;
}
@Override
protected void onPostExecute(UdpResult result) {
super.onPostExecute(result);
isPinging = false;
if (udpSettingsListener != null) {
if (result.succeed) {
udpSettingsListener.onGotStatus(new DeviceStatus(result.response));
} else {
udpSettingsListener.onFailedToGetStatus(result.exception);
}
}
}

}

这是与设备通信的"sendCommand"功能:

private UdpResult sendCommand(byte[] command) {
UdpResult udpResponse = new UdpResult();
try {
Thread.sleep(sleepFor);
} catch (InterruptedException e) {
e.printStackTrace();
}
do {
udpResponse.command = command;
udpResponse.response = new byte[BUFFER_SIZE];
DatagramSocket socket = null;
try {
socket = new DatagramSocket();
socket.setSendBufferSize(BUFFER_SIZE);
socket.setReceiveBufferSize(BUFFER_SIZE);
socket.setSoTimeout(timeout);
InetAddress inetAddress = InetAddress.getByName(ipAddress);
DatagramPacket sendPacket = new DatagramPacket(udpResponse.command, BUFFER_SIZE, inetAddress, port);
DatagramPacket receivePacket = new DatagramPacket(udpResponse.response, BUFFER_SIZE, inetAddress, port);
socket.send(sendPacket);
socket.receive(receivePacket);
udpResponse.succeed = true;
} catch (Exception e) {
Log.e(TAG, "sendCommand: ", e);
udpResponse.succeed = false;
} finally {
if (socket != null) {
socket.close();
}
}
udpResponse.attempts++;
} while (udpResponse.attempts < maxAttempts && !udpResponse.succeed);
return udpResponse;

}

这是我收到的超时异常:

> java.net.SocketTimeoutException at> libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:598) at> libcore.io.IoBridge.recvfrom(IoBridge.java:556) at> java.net.PlainDatagramSocketImpl.doRecv(PlainDatagramSocketImpl.java:163)>> java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:171)> at java.net.DatagramSocket.receive(DatagramSocket.java:274) at> com.andreyserdyuk.gaash.helpers.UdpHelper.sendCommand(UdpHelper.java:326)>> com.andreyserdyuk.gaash.helpers.UdpHelper.access$1400(UdpHelper.java:27)>> com.andreyserdyuk.gaash.helpers.UdpHelper$SetRtc.doInBackground(UdpHelper.java:371)>> com.andreyserdyuk.gaash.helpers.UdpHelper$SetRtc.doInBackground(UdpHelper.java:357)> at android.os.AsyncTask$2.call(AsyncTask.java) at> java.util.concurrent.FutureTask.run(FutureTask.java:237) at> android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java) at> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)> at java.lang.Thread.run(Thread.java:818) 由以下原因引起:> android.system.ErrnoException: recvfrom failed: EAGAIN (Try Again) at> libcore.io.Posix.recvfromBytes(Native Method) at> libcore.io.Posix.recvfrom(Posix.java:185) at> libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:250) at> libcore.io.IoBridge.recvfrom(IoBridge.java:553) at> java.net.PlainDatagramSocketImpl.doRecv(PlainDatagramSocketImpl.java:163)*>> java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:171)*> at java.net.DatagramSocket.receive(DatagramSocket.java:274)* at> com.andreyserdyuk.gaash.helpers.UdpHelper.sendCommand(UdpHelper.java:326)*>> com.andreyserdyuk.gaash.helpers.UdpHelper.access$1400(UdpHelper.java:27)*>> com.andreyserdyuk.gaash.helpers.UdpHelper$SetRtc.doInBackground(UdpHelper.java:371)*>> com.andreyserdyuk.gaash.helpers.UdpHelper$SetRtc.doInBackground(UdpHelper.java:357)*> at android.os.AsyncTask$2.call(AsyncTask.java)* at> java.util.concurrent.FutureTask.run(FutureTask.java:237)* at> android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java)* at> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)*>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)*> at java.lang.Thread.run(Thread.java:818)*

我只能猜测您的超时在发送数据包之前开始。这意味着您尝试发送的数据包太大。

当你说:一旦答案来了,另一个就不来了。我不清楚。我的猜测是你收到一个数据包,但另一个没有收到。 一个快速测试是增加超时。这将确认要接收的数据包太大。 我的建议是尝试发送较小的数据包。在您的安卓应用程序中插入了一些调试点来查找问题?

最新更新