UDP [C#]/[Android]

L3xXuS

Lt. Junior Grade
Registriert
März 2009
Beiträge
472
Guten Abend!

Ich habe ein Problem, bei dem ich schon seit einigen Tagen nicht so recht weiterkomme.

Ich habe in C# eine Konsolenanwendung, die lediglich dauerhaft per UDP Client Daten im lokalen Netzwerk an eine einzelne IP versendet. Diese IP ist ein Android Geraet, das die Daten dauerhaft empfangen und anzeigen soll.

Grundsaetzlich funktioniert mein System auch, allerding hab ich das Problem, das ca alle 55 Sekunden ein Lag auftritt, der die Datenaktualisierung auf dem Androidgeraet vollstaendig lahmlegt. Es laggt und dauert dann ein paar Sekunden, bis sich das ganze beruhigt und nach wieder ca 55 Sekunden wiederholt.

Die C# Anwendungen besteht nur aus einer while Schleife in der eben die Daten berechnet und versendet werden. Bei der Anzeige in der Konsole konnte ich hier auch noch keine Programmverzoegerungen feststellen.

In Android hab ich einen Hintergrundthread mit Datagramsocket, der ebenfalls dauerhaft die Daten empfangen soll.
Dort verarbeite ich die Daten durch einen Bytebuffer, weil das byte array zwar eine fest Struktur hat, aber nicht geordnet ist. Im Handler wird dann die UI entsprechend angepasst.


Ich habe bereits ausprobiert:
- Thread Sleeps in C# ( verringern die Intensitaet des Lags, verhindern ihn aber nicht)
- Thread Sleep in Android (Keine wirkliche Veraenderung)
- Anderes Netzwerksetup (Fritzbox statt IPFire als DHCP Server -> Keine Veaenderung)
- Den Empfang im Android als AsyncTast (Keine Veraenderung)
- Geringere Datenmenge (keine Veraenderung)

Ich verzweifel langsam und deswegen ueberseh ich einen einfachen Fehler eventuell.
Falls mir also jemand Tips geben koennt waere ich sehr erfreut.

Gruss

Code:
        Object[] data = new Object[64];
	@Override
		public void run() {
			Looper.prepare();
//			Looper.loop();
			try {
				socket = new DatagramSocket(2302);
			} catch (SocketException e1) {
				// TODO Auto-generated catch block
				System.err.println("Socket Error!");
			}
			
			bb = ByteBuffer.wrap(input_buffer);
			packet = new DatagramPacket(input_buffer, input_buffer.length);
			
			while (true) {				
				try {										
					socket.receive(packet);
				}  catch (IOException e) {
					System.err.println("Paket Error!");
				} 			

				// Counter
				int i = 0;
				// while loop to insert data to the ouput array

				while (bb.hasRemaining()) {
					if (i == 9 || i == 10 || i == 16 || i == 14 || i == 15) {
						data[i] = bb.getInt();
					} else {
						data[i] = bb.getFloat();
					}
					i++;
				}

				bb.clear();
				
//				receiveTelemtry();
				mHandler.post(updateUI);
			}
		}
	};

So dann noch die C# Komponente:
Code:
   private static void sendTestData()
        {

            using (UdpClient udp = new UdpClient())
            {
                Int32 x = 0;
                while (true)
                {
                    Console.Clear();
                    if (x > 7000)
                    {
                        x = 0;
                    }

                    byte[] sendData = new byte[4];

                    sendData = Encoding.ASCII.GetBytes(x.ToString());

                    udp.Send(sendData, sendData.Length, ip4);

                    Console.WriteLine(x);
                    x++;
                    //Thread.Sleep(100); optional
                }
            }

        }
 
Das erste was ich probieren würde, wäre einen anderen Empfänger. Auf diese Weise schließt du den Sender als Ursache aus oder eben nicht.

Tritt das Problem bei verschiedenen Geräten auf, oder hast du nur ein Handy probiert?
 
Ich hab ein Desire Z, dessen Leistung insgesamt etwas schwach ist probiert, da ruckelts eh ein wenig.
Aber sowohl ein SGIII und mein Thinkpad Tablet zeigen es eigentlich sehr schoen fluessig an.

Das ist noch ein guter Punkt, der Lag tritt bei beiden Geraeten wirklich zur identischen Zeit auf, zumindest war das so, wo ich an beide gesendet hab. Ich probier das Senden an beide nochmal aus und schau ob der Lag wieder synchron auftritt.

EDIT:
Also beim Senden an zwei verschiedene IP Adressen wird das ganze ohne Thread Sleep mit min 100ms komplett lahmgelegt, da geht so gut wie gar nix mehr. Erst bei 100ms beruhigt sich das ganze dann, wird aber natuerlich nicht mehr wirklich in Echtzeit dargestellt, was ich aber gerne haette.

Bei 100ms tritt der Lag effekt anscheinend auch nur bei der als zweites angegebenen IP auf und nicht so wirklich bei der ersten.
 
Zuletzt bearbeitet:
Aufgrund der gestrigen Uhrzeit hab ich nicht gesagt, dass ich mit anderer Empfänger evtl auch einfach mal nen anderes C#-Programm meinte ;-)
Das würde ich auf jeden Fall auch noch probieren...
 
Joa hab ich auch schon probiert, da gibts keine Probleme. Allerdings koennte ich wirklich das Problem in Form meines S3 gefunden haben. Ich hatte bisher immer das Handy als Hauptquelle benutzt weil ich dachte ich versuchs erst mit dem leistungsstaerksten Geraet. Der Lag tritt aber am Tablet nicht auf. Dazu kam, dass sich das WLAN vom Handy inzwischen manchmal einfach so trennt ohne Grund und bei Google gibts ja genug zu finden zu WLAN Problemen mit dem S3.

Ich werde das mal weiter beobachten, aber ich hab den Uebeltaeter eventuell doch gefunden.
 
Zurück
Oben