Es gibt ein physisches Gerät, mit dem ein Telefon über das UDP-Protokoll verbunden werden kann. Das Problem ist: Der Elektronikingenieur, der das Gerät programmiert hat, hat ein Desktop-Programm geschrieben, das mit diesem Gerät interagiert (auch mit UDP), und alles läuft reibungslos: Das Gerät empfängt Befehle und sendet die Antworten ohne Probleme und Ausnahmen.Android UDP-Kommunikation. Kann keine Daten vom Gerät empfangen
Aber mit dem Telefon - das Problem ... Das Telefon verbindet sich mit dem Gerät über WiFi ohne Probleme, sendet auch Befehle ohne Probleme (keine Zeitauflösung), aber es gibt ein Problem mit dem Empfang - sobald die Antwort kommt, der andere kommt nicht. Im Allgemeinen socket.receive funktioniert nicht so stabil wie auf dem Desktop-Programm sehr oft Timeout erscheint ...
ich alle Berechtigungen für sie gebraucht haben:
<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" />
ich einen Befehl innerhalb eines AsyncTask auszuführen:
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);
}
}
}
}
Hier ist die 'sendcommand' Funktion, die mit der Vorrichtung in Verbindung steht:
01.235.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;
}
Hier ist die Timeout I erhalten:
> 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) > at > 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) > at > com.andreyserdyuk.gaash.helpers.UdpHelper.access$1400(UdpHelper.java:27) > at > com.andreyserdyuk.gaash.helpers.UdpHelper$SetRtc.doInBackground(UdpHelper.java:371) > at > 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) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) > at java.lang.Thread.run(Thread.java:818) Caused by: > 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)* > at > 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)* > at > com.andreyserdyuk.gaash.helpers.UdpHelper.access$1400(UdpHelper.java:27)* > at > com.andreyserdyuk.gaash.helpers.UdpHelper$SetRtc.doInBackground(UdpHelper.java:371)* > at > 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)* > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)* > at java.lang.Thread.run(Thread.java:818)*
vielleicht sollten Sie beginnen, auf einem Thread zu empfangen und dann aus einem anderen Thread auch senden, wenn aus irgendeinem Grund die gesendeten Daten nicht ankommen, sendet das Gerät nie die Antwort – lelloman
Welche Portnummer verwenden Sie ?, nur Root-System-Anwendungen kann an Ports abhören <1024 –
ipAddress - 192.168.1.1, Port - 8010 –