<manifest xmlns:android="http://schemas.android.com/apk/res/android" | <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
package="com.example.greenwatch"> | package="com.example.greenwatch"> | ||||
<uses-permission android:name="android.permission.INTERNET" /> | |||||
<application | <application | ||||
android:allowBackup="true" | android:allowBackup="true" | ||||
android:icon="@mipmap/ic_launcher" | android:icon="@mipmap/ic_launcher" |
import androidx.appcompat.app.AppCompatActivity; | import androidx.appcompat.app.AppCompatActivity; | ||||
import android.annotation.SuppressLint; | |||||
import android.os.Bundle; | import android.os.Bundle; | ||||
import android.view.View; | |||||
import android.widget.Button; | |||||
import android.widget.EditText; | |||||
import android.widget.TextView; | |||||
import java.net.SocketException; | |||||
public class MainActivity extends AppCompatActivity { | public class MainActivity extends AppCompatActivity { | ||||
WifiCommunication communication; //Member WifiCommunication | |||||
TextView tvReceivedData; //Test Textview um empfangene Daten anzuzeigen -> 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 | @Override | ||||
protected void onCreate(Bundle savedInstanceState) { | protected void onCreate(Bundle savedInstanceState) { | ||||
super.onCreate(savedInstanceState); | super.onCreate(savedInstanceState); | ||||
setContentView(R.layout.activity_main); | 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(); | |||||
} | } | ||||
} | } |
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<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { | |||||
NetworkInterface networkInterface = (NetworkInterface) ((Enumeration<?>) en).nextElement(); | |||||
for (Enumeration<InetAddress> 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(); | |||||
} | |||||
} |
tools:context=".MainActivity"> | tools:context=".MainActivity"> | ||||
<TextView | <TextView | ||||
android:id="@+id/tvRecTxt" | |||||
android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
android:text="Hello World!" | |||||
app:layout_constraintBottom_toBottomOf="parent" | |||||
app:layout_constraintLeft_toLeftOf="parent" | |||||
app:layout_constraintRight_toRightOf="parent" | |||||
app:layout_constraintTop_toTopOf="parent" /> | |||||
android:text="Received Message" | |||||
app:layout_constraintTop_toBottomOf="@id/sendMessage" | |||||
app:layout_constraintStart_toStartOf="parent"/> | |||||
<EditText | |||||
android:id="@+id/sendMessage" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="50dp" | |||||
android:ems="10" | |||||
android:inputType="textPersonName" | |||||
android:text="Send Message" | |||||
app:layout_constraintTop_toTopOf="parent" | |||||
app:layout_constraintStart_toStartOf="parent"/> | |||||
<Button | |||||
android:id="@+id/btnSend" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="Send" | |||||
android:onClick="onClickSend" | |||||
app:layout_constraintTop_toTopOf="parent" | |||||
app:layout_constraintStart_toEndOf="@id/sendMessage"/> | |||||
</androidx.constraintlayout.widget.ConstraintLayout> | </androidx.constraintlayout.widget.ConstraintLayout> |