Browse Source

Added WiFi Communication to project

DoNotMerge_Runnable_Test_Branch
Christian Tinz 11 months ago
parent
commit
792c650400

+ 2
- 3
app/src/main/AndroidManifest.xml View File

@@ -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"
@@ -9,9 +11,6 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.GreenWatch">
<activity
android:name=".ConnectionActivity"
android:exported="false" />
<activity
android:name=".VideodetectionAndAccelerometerActivity"
android:exported="false" />

+ 0
- 27
app/src/main/java/com/example/greenwatch/ConnectionActivity.java View File

@@ -1,27 +0,0 @@
package com.example.greenwatch;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class ConnectionActivity extends AppCompatActivity {

private Button backToMainActivity;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_connection);

backToMainActivity = (Button) findViewById(R.id.connectionBackToMainActivity);

backToMainActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}

+ 10
- 4
app/src/main/java/com/example/greenwatch/MainActivity.java View File

@@ -3,6 +3,8 @@ package com.example.greenwatch;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
@@ -11,6 +13,7 @@ import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.example.greenwatch.adapters.DeviceListAdapter;
import com.example.greenwatch.models.Device;
import com.example.greenwatch.viewmodels.MainActivityViewModel;

@@ -52,6 +55,7 @@ public class MainActivity extends AppCompatActivity {
mMainActivityViewModel.getConnectedDeviceList().observe(this, new Observer<List<Device>>() {
@Override
public void onChanged(List<Device> devices) {
deviceListAdapter.setDevices(devices);
StringBuilder sb = new StringBuilder();
sb.append("Time Stamp: ");
sb.append(mMainActivityViewModel.getTimeStamp(mMainActivityViewModel.getLocalDeviceUUID()));
@@ -134,12 +138,14 @@ public class MainActivity extends AppCompatActivity {
startActivity(intent);
}
public void openVideodetectionAndAccelerometerActivity(){
Intent intent = new Intent(this, VideodetectionAndAccelerometerActivity.class);
startActivity(intent);
//Intent intent = new Intent(this, VideodetectionAndAccelerometerActivity.class);
//startActivity(intent);
mMainActivityViewModel.setDevice(mMainActivityViewModel.getLocalDeviceUUID(), "24:00", false, "Video", 0);
}
public void openConnectionActivity(){
Intent intent = new Intent(this, ConnectionActivity.class);
startActivity(intent);
//Intent intent = new Intent(this, ConnectionActivity.class);
//startActivity(intent);
mMainActivityViewModel.setDevice(mMainActivityViewModel.getLocalDeviceUUID(), "10:51", true, "Audio", 10);
}

}

+ 133
- 0
app/src/main/java/com/example/greenwatch/communication/WiFiCommunication.java View File

@@ -0,0 +1,133 @@
package com.example.greenwatch.communication;

import com.example.greenwatch.repositories.DeviceRepository;

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 InetAddress address;
private final DatagramSocket socket;
private final int port;
private String rxString;
private String sendMessage;
//private String sendMsg = "default";
private boolean isNewMessage;
volatile private boolean running;
private static WiFiCommunication wifiCommunicationInstance;
private DeviceRepository mDeviceRepository;

private WiFiCommunication() {
port = 1234;
try {
socket = new DatagramSocket(port);
socket.setBroadcast(true);
address = InetAddress.getByName("255.255.255.255");
running = true;
isNewMessage = false;
new ReceiveThread().start();
new SendThread().start();
} catch (SocketException | UnknownHostException e) {
throw new RuntimeException(e);
}
}

public static synchronized WiFiCommunication getInstance() {
if (wifiCommunicationInstance == null){
wifiCommunicationInstance = new WiFiCommunication();
}
return wifiCommunicationInstance;
}

public void setDeviceRepository(DeviceRepository deviceRepository) {
this.mDeviceRepository = deviceRepository;
}

public void setNewMessage(String newMessage, boolean isNewMessage){
this.sendMessage = newMessage;
this.isNewMessage = isNewMessage;
}

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();
}

private class SendThread extends Thread {
private int tmpCnt = 0;
@Override
public void run() {
try {
do {

if(isNewMessage)
{
isNewMessage = false;
//todo: adapt send String
String txString = getLocalIpAddress() + " sends. #" + tmpCnt++ + sendMessage;
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();
}
}
}

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)){
mDeviceRepository.getNewReceivedMessage(rxString);

}
previousRxString = rxString;

} while (running);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}

+ 60
- 24
app/src/main/java/com/example/greenwatch/repositories/DeviceRepository.java View File

@@ -4,6 +4,7 @@ package com.example.greenwatch.repositories;
import androidx.lifecycle.MutableLiveData;

import com.example.greenwatch.models.Device;
import com.example.greenwatch.communication.WiFiCommunication;

import java.util.ArrayList;
import java.util.HashMap;
@@ -12,21 +13,30 @@ import java.util.UUID;

public class DeviceRepository {

private String delimiter = ", ";
private String deviceUUID;
private final String delimiter = ", ";
private final String SensorStatusKey = "An";
private String localDeviceUUID;
private static DeviceRepository deviceRepositoryInstance;
private WiFiCommunication mWiFiCommunication;
private MutableLiveData<List<Device>> deviceList = new MutableLiveData<>();
private HashMap<String, Device> connectedDevicesList = new HashMap<>();
private HashMap<String, String> deviceIDMapper = new HashMap<>();

private DeviceRepository() {
setLocalDeviceUUID();
}

public static synchronized DeviceRepository getInstance() {
if (deviceRepositoryInstance == null){
deviceRepositoryInstance = new DeviceRepository();
deviceRepositoryInstance.setDeviceUUID();
}
return deviceRepositoryInstance;
}

public void setWiFiCommunication(WiFiCommunication wiFiCommunication) {
this.mWiFiCommunication = wiFiCommunication;
}

public MutableLiveData<List<Device>> getConnectedDeviceList() {
setMutableLiveDataValue();
return deviceList;
@@ -34,24 +44,12 @@ public class DeviceRepository {

public void createNewDevice(String timeStamp, String deviceID, boolean sensorStatus, String sensorType, int sensorMassage){
Device newDevice = new Device(timeStamp, deviceID, sensorStatus, sensorType, sensorMassage);
setDeviceIDMapper(deviceID);
addToConnectedDeviceList(newDevice.getDeviceID(), newDevice);
setMutableLiveDataValue();
}

public void createNewRemoteDevice(String message) {
String[] messageString = messageStringSplitter(message);
String timeStamp = messageString[0];
String deviceID = messageString[1];
boolean sensorStatus = Boolean.valueOf(messageString[1]);
String sensorType = messageString[3];
int sensorMassage = Integer.valueOf(messageString[4]);

if(!connectedDevicesList.containsKey(deviceID)) {
createNewDevice(timeStamp, deviceID, sensorStatus, sensorType, sensorMassage);
}
}

public String messageStringBuilder(String deviceID) {
private String messageStringBuilder(String deviceID) {
StringBuilder message = new StringBuilder();
Device device = connectedDevicesList.get(deviceID);
if(device != null) {
@@ -66,14 +64,25 @@ public class DeviceRepository {
.append(device.getSensorMassage());
return message.toString();
}
return message.toString();
else {
message.append("")
.append(delimiter)
.append("")
.append(delimiter)
.append("")
.append(delimiter)
.append("")
.append(delimiter)
.append("");
return message.toString();
}
}

public String getLocalDeviceUUID() {
return deviceUUID;
return localDeviceUUID;
}

public void setDevice(String deviceID, String timeStamp, boolean sensorStatus, String sensorType, int sensorMassage) {
public void updateDevice(String deviceID, String timeStamp, boolean sensorStatus, String sensorType, int sensorMassage) {
String checkedDeviceID = checkDeviceID(deviceID);
Device device = connectedDevicesList.get(checkedDeviceID);
if(device != null) {
@@ -190,24 +199,51 @@ public class DeviceRepository {

private void addToConnectedDeviceList(String key, Device device) {
connectedDevicesList.put(key, device);
if (key.equals(checkDeviceID(localDeviceUUID))) {
mWiFiCommunication.setNewMessage(messageStringBuilder(device.getDeviceID()),true);
}
}

private String checkDeviceID(String deviceID) {
if(!deviceIDMapper.isEmpty() && deviceID.equals(deviceUUID)) {
if(!deviceIDMapper.isEmpty() && deviceID.equals(localDeviceUUID)) {
return deviceIDMapper.get(deviceID);
}
return deviceID;
}

private void setDeviceIDMapper(String deviceID) {
deviceIDMapper.put(deviceUUID, deviceID);
deviceIDMapper.put(localDeviceUUID, deviceID);
}

private void setDeviceUUID(){
this.deviceUUID = UUID.randomUUID().toString();
private void setLocalDeviceUUID(){
this.localDeviceUUID = UUID.randomUUID().toString();
}

private String[] messageStringSplitter(String message) {
return message.split(delimiter);
}

public void getNewReceivedMessage(String newMessage) {
String[] messageString = messageStringSplitter(newMessage);
String timeStamp = messageString[0];
String deviceID = messageString[1];
boolean sensorStatus = convertSensorStatus(messageString[2]);
String sensorType = messageString[3];
int sensorMassage = Integer.valueOf(messageString[4]);

if (deviceID.equals(checkDeviceID(localDeviceUUID))) {
return;
}

if(!connectedDevicesList.containsKey(deviceID)) {
createNewDevice(timeStamp, deviceID, sensorStatus, sensorType, sensorMassage);
}
else {
updateDevice(deviceID, timeStamp, sensorStatus, sensorType, sensorMassage);
}
}

private boolean convertSensorStatus(String status) {
return status.equals(SensorStatusKey);
}
}

+ 1
- 1
app/src/main/java/com/example/greenwatch/viewmodels/AccelerometerViewModel.java View File

@@ -94,7 +94,7 @@ public class AccelerometerViewModel extends ViewModel {
}

public void setDevice(String deviceID, String timeStamp, boolean sensorStatus, String sensorType, int sensorMassage) {
mDeviceRepository.setDevice(deviceID, timeStamp, sensorStatus, sensorType, sensorMassage);
mDeviceRepository.updateDevice(deviceID, timeStamp, sensorStatus, sensorType, sensorMassage);
}

public void setTimeStamp(String deviceID, String timeStamp) {

+ 9
- 2
app/src/main/java/com/example/greenwatch/viewmodels/MainActivityViewModel.java View File

@@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

import com.example.greenwatch.communication.WiFiCommunication;
import com.example.greenwatch.models.Device;
import com.example.greenwatch.repositories.DeviceRepository;

@@ -14,12 +15,18 @@ public class MainActivityViewModel extends ViewModel {
private MutableLiveData<List<Device>> mDeviceList;
private DeviceRepository mDeviceRepository;


public void init() {
WiFiCommunication mWiFiCommunication;
if(mDeviceList != null) {
return;
}
//todo: check if WiFi instanz can be hold only by the repository
mDeviceRepository = DeviceRepository.getInstance();
mDeviceRepository.createNewDevice("", mDeviceRepository.getLocalDeviceUUID(), false, "", 0);
mWiFiCommunication = WiFiCommunication.getInstance();
mDeviceRepository.setWiFiCommunication(mWiFiCommunication);
mWiFiCommunication.setDeviceRepository(mDeviceRepository);
mDeviceRepository.createNewDevice("", mDeviceRepository.getLocalDeviceUUID(), false, "No Sensor selected", 0);
mDeviceList = mDeviceRepository.getConnectedDeviceList();
}

@@ -28,7 +35,7 @@ public class MainActivityViewModel extends ViewModel {
}

public void setDevice(String deviceID, String timeStamp, boolean sensorStatus, String sensorType, int sensorMassage) {
mDeviceRepository.setDevice(deviceID, timeStamp, sensorStatus, sensorType, sensorMassage);
mDeviceRepository.updateDevice(deviceID, timeStamp, sensorStatus, sensorType, sensorMassage);
}

public void setTimeStamp(String deviceID, String timeStamp) {

+ 0
- 25
app/src/main/res/layout/activity_connection.xml View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp"
tools:context=".ConnectionActivity">

<TextView
android:id="@+id/tvConnectionStatusmessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Connection Activity">
</TextView>

<Button
android:id="@+id/connectionBackToMainActivity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Back to MainActivity">
</Button>

</LinearLayout>

Loading…
Cancel
Save