UDP Packet empfangen/TextView Aktualisieren

L

LusoDelect

Neues Mitglied
0
Hallo Leute,

habe mich ewig nicht mehr mit Programmierung beschäftigt und mit Android Apps bin ich schon damals gescheitert.

Trotzdem habe ich es hinbekommen mit dem Mikrocontroller ESP32 jede Sekunde über UDP einen String zu verschicken. Mit einem Programm auf meinem PC konnte ich diesen auch empfangen, mit meiner App schaffe ich es aber leider nicht. Vielleicht ist auch der ganze Code/die Verbindung grundlegend falsch, kompilieren und starten lässt sich die App jedenfalls. Könntet ihr einen Blick drauf werden und mit sagen was falsch sein könnte? In der App wird nur der im Loyout festgelegte String angezeigt aber nicht der über den Code aktualisierter.

Code:
package com.lusodelect.mtc;

import android.app.*;
import android.os.*;
import android.widget.*;
import java.io.IOException;
import java.net.*;


public class MainActivity extends Activity 
{
	//String server_Adress;
	
	//float get_Temperatur = 27;
	
	TextView max_Temperatur;
	TextView min_Temperatur;
	
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout2);
		
		// set a change listener on the SeekBar_max 
		SeekBar seekBar_Max = findViewById(R.id.seekBar_max);
		seekBar_Max.setOnSeekBarChangeListener(seekBarChangeListener_Max);
		// set a change listener on the SeekBar_min 
		SeekBar seekBar_Min = findViewById(R.id.seekBar_min);
		seekBar_Min.setOnSeekBarChangeListener(seekBarChangeListener_Min);
		
		max_Temperatur = findViewById(R.id.textView_max);
		int progress_max = seekBar_Max.getProgress();
		max_Temperatur.setText(String.valueOf(progress_max) + "°C");
		
		int progress_min = seekBar_Min.getProgress();
		min_Temperatur = findViewById(R.id.textView_min);
		min_Temperatur.setText(String.valueOf(progress_min) + "°C");
		
		
		Thread UpdateTemp = new Thread() {
			@Override
			public void run() 
			{
				try 
				{
                		while (!isInterrupted()) 
					{
						Thread.sleep(1000);
                    		runOnUiThread(new Runnable() 
						{
                        		@Override
                       		public void run() 
							{
								TextView current_Temperatur = findViewById(R.id.textView_current);
								String cTemp;
									
								try
								{
									cTemp = client();
									current_Temperatur.setText(cTemp + "°C");
								}
								catch(IOException e) 
								{
									e.printStackTrace(); 
								}
                        		}
						});
                		}
				} 
				catch (InterruptedException e) 
				{
					
				}
        }
    };

    UpdateTemp.start();
		
    }
	
	SeekBar.OnSeekBarChangeListener seekBarChangeListener_Max = new SeekBar.OnSeekBarChangeListener() 
	{
		@Override
		public void onProgressChanged(SeekBar seekBar_Max, int progress_max, boolean fromUser) 
		{
			// updated continuously as the user slides the thumb
			max_Temperatur.setText(String.valueOf(progress_max) + "°C");
		}
		
		@Override
		public void onStartTrackingTouch(SeekBar seekBar_Max)
		{
			
		}
		
		@Override 
		public void onStopTrackingTouch(SeekBar seekBar_Max)
		{
			// called after the user finishes moving the SeekBar 
			SeekBar seekBar_Min = findViewById(R.id.seekBar_min);
			if(seekBar_Max.getProgress() < seekBar_Min.getProgress())
			{
				seekBar_Min.setProgress(seekBar_Max.getProgress()-5);
			}
		} 
	};
	
	SeekBar.OnSeekBarChangeListener seekBarChangeListener_Min = new SeekBar.OnSeekBarChangeListener() 
	{
		@Override
		public void onProgressChanged(SeekBar seekBar_min, int progress_min, boolean fromUser) 
		{
			// updated continuously as the user slides the thumb
			min_Temperatur.setText(String.valueOf(progress_min) + "°C");
		}
		
		@Override
		public void onStartTrackingTouch(SeekBar seekBar_Min)
		{
			
		}

		@Override 
		public void onStopTrackingTouch(SeekBar seekBar_Min)
		{
			// called after the user finishes moving the SeekBar 
			SeekBar seekBar_Max = findViewById(R.id.seekBar_max);
			if(seekBar_Min.getProgress()> seekBar_Max.getProgress())
			{
				seekBar_Max.setProgress(seekBar_Min.getProgress()+5);
			}
		} 
	};
	
	public String client() throws IOException
	{
		InetAddress IPAddress = InetAddress.getByName("192.168.0.158");
		int Port = 60732;
		DatagramSocket client_socket = new DatagramSocket(Port, IPAddress);
		
		byte[] buf = new byte[1024];
		DatagramPacket client_packet = new DatagramPacket(buf, 1024);
		
		client_socket.receive(client_packet);
		
		String str = new String(client_packet.getData(), 0, client_packet.getLength());
		client_socket.close();
		return str;
	}
}
 
Hallo

und willkommen im Forum .

Grundsätzlich musst du von deinem Aufbau umdenken .

a) Das Ganze ist eher C/C++ like - das wird so nicht funktionieren und du musst ein wenig Objekt-Orientierter denken
, mehr in Klassen auslagern und mit Callbacks arbeiten.
b) UI Elemente sollten aus dem Layout auch nicht innerhalb eines Thread ermittelt werden.
c) Bei einer Sekunde Update würde ich eher TCP nehmen , als UDP - du verarbeitest ja keine Streams.
Zumal du dann den Lost mitbekommst und nicht pollen musst. Zur Not den Socket als Non_Blocked deklarieren.

d) Aber Grundsätzlich in einem UI Thread jede Sekunde den Socket auf und zu zu machen , kann nur schief gehen.
Dein Buffer ist dann eh noch leer und auf das Handshake wartest du dann auch nicht.

Baue in einer eignen Klasse einen stabilen TCP Socket zum Server auf , Accepte ihn dort und lass die Verbindung bestehen.
Dann stattest du diese Klasse mit einem Listener aus und reagierst dann in der Ausgabe Activity auf Diesen und verwendest dann erst
deinen UI Thread.
Mit einen Setter in dieser neuen Klasse , schickst du dann wiederum deine Werte an den TCP-Server .
 
Zuletzt bearbeitet:
Danke für die Antwort.

Ja, tatsächlich habe ich auch nur C/C++ gelernt, das erkennt man wohl auch sofort.

Das Problem ist, für den ESP32 muss noch recht viel selbst geschrieben werden und für UDP war schon was in der Bibliothek mit einem recht guten Beispiel, deswegen hatte ich mich dafür entschieden.
Viel Aufwand wollte ich auch nicht betreiben, da es nur ein kleines Projekt ist, aber gut, geht wohl nicht alles so einfach wie man es gerne hätte, muss mich wohl hin setzen und mal richtig Java lernen
 
Und warum nimmst du nicht MQTT , so wie es auch üblich in solch einem Falle ist ?

Genau dazu ( Messbereich) ist der Broker entwickelt worden
Gibt es für alle Plattformen
 
Zuletzt bearbeitet:
Kannte ich ehrlich gesagt gar nicht.
Wie gesagt, ich hatte schon länger nicht mehr Programmiert, IoT und Android Apps sind sowieso Neuland für mich, ich bin froh das ich es geschafft habe die Temperatur als String über UDP zu verschicken, allein die Typumwandlung in C hat mich in den Wahnsinn getrieben^^

Aber ich danke dir für die Tipps und werde es mir genauer anschauen
 
Wenn du von C++ kommst, und nur eine kleine App programmieren willst

Hast du da schon mal an QT gedacht? Das könnte in deinen Fall schneller gehen.
 

Ähnliche Themen

M
  • maksimilian
Antworten
2
Aufrufe
1.211
maksimilian
M
T
Antworten
1
Aufrufe
850
jogimuc
J
J
Antworten
4
Aufrufe
806
deek
D
Zurück
Oben Unten