From 3c1366bd1075103819fdd31d102e75ac966301f2 Mon Sep 17 00:00:00 2001 From: Miguel Siebenhaar Date: Thu, 8 Jun 2023 17:40:21 +0200 Subject: [PATCH] Kommunikation Version 1 UDP Socket --- app/build.gradle | 4 + app/src/main/AndroidManifest.xml | 8 +- .../ueberwachungssystem/MainActivity.java | 69 +++++++++- .../WifiCommunication.java | 119 ++++++++++++++++++ app/src/main/res/layout/activity_main.xml | 41 +++--- settings.gradle | 1 + 6 files changed, 221 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/com/example/ueberwachungssystem/WifiCommunication.java diff --git a/app/build.gradle b/app/build.gradle index 631248a..1e4e000 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,6 +26,9 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + buildFeatures { + viewBinding true + } } dependencies { @@ -33,6 +36,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.8.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'com.google.android.gms:play-services-nearby:18.0.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cef8f3d..857fcad 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,18 +2,24 @@ + + + + + android:exported="true" + android:label="Server"> diff --git a/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java b/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java index 483716e..db6dac7 100644 --- a/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java +++ b/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java @@ -1,15 +1,74 @@ package com.example.ueberwachungssystem; - -import androidx.appcompat.app.AppCompatActivity; - +import android.annotation.SuppressLint; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.UnknownHostException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +@SuppressLint("SetTextI18n") public class MainActivity extends AppCompatActivity { + TextView tvMessages; + TextView tvConnectionInfos; + + WifiCommunication communication; + public static String SERVER_IP = ""; + public static final int SERVER_PORT = 2222; + int i=0; + + boolean sending = false; + + String message; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - // + tvMessages = findViewById(R.id.tvMessages); + tvConnectionInfos = findViewById(R.id.tvConnectionInfos); + try { + SERVER_IP = getLocalIpAddress(); + tvConnectionInfos.setText("Connection Infos: \n Own IP-Adress: " + SERVER_IP+ " Port: " + SERVER_PORT); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + Button btnSend = findViewById(R.id.btnSend); + btnSend.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + i++; + communication.sendTrue("Test" +i); + } + }); } -} \ No newline at end of file + protected void onResume() { + super.onResume(); + communication = new WifiCommunication(MainActivity.this, SERVER_PORT); + + } + @Override + protected void onPause() { + super.onPause(); + communication.stopCommunication(); + } + private String getLocalIpAddress() throws UnknownHostException { + WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE); + assert wifiManager != null; + WifiInfo wifiInfo = wifiManager.getConnectionInfo(); + int ipInt = wifiInfo.getIpAddress(); + return InetAddress.getByAddress(ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(ipInt).array()).getHostAddress(); + } +} diff --git a/app/src/main/java/com/example/ueberwachungssystem/WifiCommunication.java b/app/src/main/java/com/example/ueberwachungssystem/WifiCommunication.java new file mode 100644 index 0000000..d0aad05 --- /dev/null +++ b/app/src/main/java/com/example/ueberwachungssystem/WifiCommunication.java @@ -0,0 +1,119 @@ +package com.example.ueberwachungssystem; +import android.annotation.SuppressLint; + +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 String messageToSend; + volatile private boolean send; + private final DatagramSocket socket; + volatile private boolean running; + @SuppressLint("SetTextI18n") + public WifiCommunication(MainActivity mainActivity, int port) { + this.mainActivity = mainActivity; + this.port = port; + try { + socket = new DatagramSocket(this.port); + socket.setBroadcast(true); + address = InetAddress.getByName("255.255.255.255"); + running = true; + send = false; + new ReceiveThread().start(); + new SendThread().start(); + } catch (SocketException | UnknownHostException e) { + throw new RuntimeException(e); + } + mainActivity.runOnUiThread(() -> mainActivity.tvMessages.setText("Communication running")); + } + private class ReceiveThread extends Thread { + private StringBuffer rxStringBuffer = new StringBuffer(); + private String rxString; + private String previousRxString = ""; + @Override + public void run() { + try { + do { + byte[] rxBuffer = new byte[512]; + InetAddress fromAdress; + int fromPort; + DatagramPacket rxPacket = new DatagramPacket(rxBuffer, rxBuffer.length); + socket.receive(rxPacket); + fromAdress = rxPacket.getAddress(); + fromPort = rxPacket.getPort(); + rxString = new String(rxBuffer, 0, rxPacket.getLength()); + if(!previousRxString.equals(rxString)) { + mainActivity.runOnUiThread(() -> mainActivity.tvMessages.setText(rxStringBuffer)); + rxStringBuffer.append("Adress: " + fromAdress).append(" Port: " + fromPort).append(" Message " +rxString).append("\n"); + } + previousRxString = rxString; + + } while (running); + } + catch (IOException e) { + e.printStackTrace(); + } + } + } + private class SendThread extends Thread { + private int tmpCnt = 0; + @Override + public void run() { + try { + do { + if(send) + { + send = false; + + String txString = getLocalIpAddress() + " sends:" +messageToSend+ " Count: " + tmpCnt++; + 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 sendTrue(String message){ + send = true; + messageToSend = message; + } + 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 17eab17..fd91a97 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,18 +1,29 @@ - - - + + + + +