package com.example.ueberwachungssystem; import android.annotation.SuppressLint; import android.widget.Toast; import androidx.annotation.NonNull; import com.example.ueberwachungssystem.Detection.DetectionReport; import com.example.ueberwachungssystem.Detection.Detector; import com.example.ueberwachungssystem.Detection.DetectorService; 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.text.SimpleDateFormat; import java.util.Date; 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; private OnConnectionListener listener; @SuppressLint("SetTextI18n") public WifiCommunication(int port) { //this.mainActivity = mainActivity; this.port = port; try { socket = new DatagramSocket(this.port); socket.setBroadcast(true); address = InetAddress.getByName("255.255.255.255"); //100.82.255.255 running = true; send = false; new ReceiveThread().start(); new SendThread().start(); } catch (SocketException | UnknownHostException e) { throw new RuntimeException(e); } //Toast.makeText(mainActivity.getApplicationContext(),"Communication running", Toast.LENGTH_SHORT).show(); //mainActivity.runOnUiThread(() -> mainActivity.tvMessages.setText("Communication running")); } public interface OnConnectionListener { void onConnection(StringBuffer data); } public void setOnConnectionListener(@NonNull OnConnectionListener listener) { this.listener = listener; } public void sendWifiData(StringBuffer wifiMessage) { if (listener != null) { listener.onConnection(wifiMessage); } } private class ReceiveThread extends Thread { private StringBuffer rxStringBuffer = new StringBuffer(); private String rxString=""; private String previousRxString = ""; @Override public void run() { try { do { byte[] receiveData = new byte[512]; DatagramPacket rxPacket = new DatagramPacket(receiveData, receiveData.length); socket.receive(rxPacket); rxString = new String(receiveData, 0, rxPacket.getLength()); String[] splitrxString = rxString.split(","); if(!previousRxString.equals(rxString) && splitrxString[0].equals("1") && splitrxString.length==7) { rxStringBuffer.append(rxString).append("\n"); sendWifiData(rxStringBuffer); //mainActivity.runOnUiThread(() -> mainActivity.tvMessages.setText(rxStringBuffer)); 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; SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); Date curDate = new Date(System.currentTimeMillis()); String str = formatter.format(curDate); byte[] send_Data = new byte[512]; String txString = ("1," +str+ ",Gruppe2," + getLocalIpAddress() + ",An,Video," +messageToSend); send_Data = txString.getBytes(); DatagramPacket txPacket = new DatagramPacket(send_Data, txString.length(), address, port); for(int i = 0; i < 300; 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(); } }