2017-05-16 4 views
1

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)* 

+0

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

+0

Welche Portnummer verwenden Sie ?, nur Root-System-Anwendungen kann an Ports abhören <1024 –

+0

ipAddress - 192.168.1.1, Port - 8010 –

Antwort

0

Ich kann nur vermuten, dass Ihre Timeout Tritte in, bevor das Paket gesendet wird. Dies bedeutet, dass das Paket, das Sie senden möchten, zu groß ist.

Wenn Sie sagen: Sobald die Antwort kommt, kommt der andere nicht. Es ist mir nicht klar. Meine Vermutung ist, dass Sie ein Paket erhalten, aber das andere wird nicht empfangen. Ein schneller Test besteht darin, das Zeitlimit zu erhöhen. Dies würde bestätigen, dass das zu empfangende Paket zu groß ist. Meine Empfehlung wäre, zu versuchen, kleinere Pakete zu senden. Haben Sie einige Debug-Punkte in Ihrer Android-App eingefügt, um nach dem Problem zu suchen?

+0

BUFFER_SIZE ist immer 38 Bytes. Es hat sich nie geändert. 38-Byte-Array - Dies ist die feste Datengröße, die das Gerät senden und empfangen kann. –

+0

Haben Sie versucht, die Zeitüberschreitung zu erhöhen? –

Verwandte Themen