@@ -2,6 +2,8 @@ | |||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" | |||
package="com.example.greenwatch"> | |||
<uses-permission android:name="android.permission.INTERNET" /> | |||
<application | |||
android:allowBackup="true" | |||
android:icon="@mipmap/ic_launcher" |
@@ -2,13 +2,55 @@ package com.example.greenwatch; | |||
import androidx.appcompat.app.AppCompatActivity; | |||
import android.annotation.SuppressLint; | |||
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 { | |||
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 | |||
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(); | |||
} | |||
} |
@@ -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<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(); | |||
} | |||
} |
@@ -7,12 +7,30 @@ | |||
tools:context=".MainActivity"> | |||
<TextView | |||
android:id="@+id/tvRecTxt" | |||
android:layout_width="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> |