diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e6408bb..daf2c2a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + Gegen finale Textview in der Anzeige austauschen + //ToDo: Falls finale Textview zum Anzeigen der Nachricht anders heißt, muss das in der Klasse WifiCommunication.java angepasst werden! + // Wo anpassen: Receive Thread, Zeile 58 + private EditText etSendMessage; //Test Edittext um eine Nachricht zu senden -> gegen Nachricht von den Sensoren austauschen + private Button btnSend; //Test Sendebutton + private String sendmsg = "default"; + + @SuppressLint("MissingInflatedId") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + + xmlToJava(); //Funktionsaufruf, wo die Testbuttons etc angelegt sind + } + + public void xmlToJava(){ + tvReceivedData = findViewById(R.id.tvRecTxt); //Test Textview + etSendMessage = findViewById(R.id.sendMessage); //Test Nachricht + btnSend = findViewById(R.id.btnSend); //Test Sendebefehl + } + + public void onClickSend(View view) throws SocketException{ //ToDo: Sendebefehl mit boolscher Variable lösen --> wo setzen? + sendmsg = etSendMessage.getText().toString(); //ToDo: hier String von Sensoren übergeben + communication.setMessage(sendmsg, true); //übergibt zu sendenden String und setzt die entscheidende Boolsche Variable fürs Senden + } + + @Override + protected void onResume() { + super.onResume(); + //Erstellen des Members + communication = new WifiCommunication(MainActivity.this, MainActivity.this, 1234); + } + + @Override + protected void onPause() { + super.onPause(); + //schließt socket + communication.stopCommunication(); } } \ No newline at end of file diff --git a/app/src/main/java/com/example/greenwatch/WifiCommunication.java b/app/src/main/java/com/example/greenwatch/WifiCommunication.java new file mode 100644 index 0000000..0520333 --- /dev/null +++ b/app/src/main/java/com/example/greenwatch/WifiCommunication.java @@ -0,0 +1,124 @@ +package com.example.greenwatch; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.widget.Toast; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.Inet4Address; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.util.Enumeration; + +public class WifiCommunication { + private final MainActivity mainActivity; + private final InetAddress address; + private final int port; + private final Context context; + private boolean newMsg; + private String rxString; + private String sendMsg; + //private String sendMsg = "default"; + private final DatagramSocket socket; + volatile private boolean running; + @SuppressLint("SetTextI18n") + public WifiCommunication(MainActivity mainActivity, Context context, int port) { + this.mainActivity = mainActivity; + this.port = port; + this.context = context; + try { + socket = new DatagramSocket(this.port); + socket.setBroadcast(true); + address = InetAddress.getByName("255.255.255.255"); + running = true; + new ReceiveThread().start(); + new SendThread().start(); + } catch (SocketException | UnknownHostException e) { + throw new RuntimeException(e); + } + mainActivity.runOnUiThread(() -> Toast.makeText(context,"Communication running", Toast.LENGTH_SHORT).show()); + } + private class ReceiveThread extends Thread { + private String rxString = ""; + private String previousRxString = ""; + @Override + public void run() { + try { + do { + + byte[] rxBuffer = new byte[1024]; + DatagramPacket packet = new DatagramPacket(rxBuffer, rxBuffer.length); + socket.receive(packet); + rxString = new String(packet.getData(), 0, packet.getLength()); + + if(!previousRxString.equals(rxString)) + mainActivity.runOnUiThread(() -> mainActivity.tvReceivedData.setText(rxString)); + + previousRxString = rxString; + + } while (running); + } + catch (IOException e) { + e.printStackTrace(); + } + } + } + + public String showMessage(){ + return rxString; + } + public void setMessage(String message, boolean newMsg){ + this.sendMsg=message; + this.newMsg = newMsg; + } + private class SendThread extends Thread { + private int tmpCnt = 0; + @Override + public void run() { + try { + do { + + if(newMsg == true) + { + newMsg = false; + + String txString = getLocalIpAddress() + " sends. #" + tmpCnt++ + sendMsg; + byte[] txBuffer = txString.getBytes(); + + DatagramPacket txPacket = new DatagramPacket(txBuffer, txBuffer.length, address, port); + + for(int i = 0; i < 20; i++) { + socket.send(txPacket); + } + } + } while (running); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + public static String getLocalIpAddress() { + try { + for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { + NetworkInterface networkInterface = (NetworkInterface) ((Enumeration) en).nextElement(); + for (Enumeration addresses = networkInterface.getInetAddresses(); addresses.hasMoreElements();) { + InetAddress inetAddress = addresses.nextElement(); + if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) { + return inetAddress.getHostAddress(); + } + } + } + } catch (SocketException ex) { + ex.printStackTrace(); + } + return null; + } + public void stopCommunication() { + running = false; + socket.close(); + } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4fc2444..55d40f3 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -7,12 +7,30 @@ tools:context=".MainActivity"> + android:text="Received Message" + app:layout_constraintTop_toBottomOf="@id/sendMessage" + app:layout_constraintStart_toStartOf="parent"/> + + + +