finished the first version of the communicator package
This commit is contained in:
parent
5407dc0f5b
commit
7936281924
@ -2,56 +2,148 @@ package com.example.aped.communication;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.android.volley.Request;
|
import com.android.volley.Request;
|
||||||
import com.android.volley.RequestQueue;
|
import com.android.volley.RequestQueue;
|
||||||
import com.android.volley.Response;
|
import com.android.volley.Response;
|
||||||
import com.android.volley.toolbox.JsonObjectRequest;
|
import com.android.volley.toolbox.JsonObjectRequest;
|
||||||
import com.android.volley.toolbox.Volley;
|
import com.android.volley.toolbox.Volley;
|
||||||
|
import com.example.aped.utils.ExternalStorageHandler;
|
||||||
|
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import kotlin.NotImplementedError;
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class that handles communication with the raspberry pi.
|
||||||
|
*/
|
||||||
public class Communicator {
|
public class Communicator {
|
||||||
private String address;
|
|
||||||
private int port;
|
|
||||||
private RequestQueue requestQueue;
|
|
||||||
|
|
||||||
public Communicator(String address, int port, Context context) {
|
/** Ipv4 address of the raspberry. **/
|
||||||
this.address = address;
|
private final String address;
|
||||||
this.port = port;
|
/** API port of the raspberry. **/
|
||||||
requestQueue = Volley.newRequestQueue(context);
|
private final int port;
|
||||||
|
/** Request queue used for asynchronous requests. **/
|
||||||
|
private final RequestQueue requestQueue;
|
||||||
|
/**The context of the application.**/
|
||||||
|
private final Context context;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor of the Communicator.
|
||||||
|
* @param pAddress the ipv4 address of the raspberry
|
||||||
|
* @param pPort the port of the raspberry
|
||||||
|
* @param pContext the context of the application
|
||||||
|
*/
|
||||||
|
public Communicator(final String pAddress,
|
||||||
|
final int pPort,
|
||||||
|
final Context pContext) {
|
||||||
|
this.address = pAddress;
|
||||||
|
this.port = pPort;
|
||||||
|
requestQueue = Volley.newRequestQueue(pContext);
|
||||||
|
this.context = pContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void read(String deviceName, Response.Listener<JSONObject> responseListener) {
|
/**
|
||||||
String requestString = "http://" + address + ":" + port + "/device/" + deviceName + "/";
|
* Reads the device state from the raspberry.
|
||||||
|
* @param deviceName the name of the device
|
||||||
|
* @param responseListener the {@link Response.Listener} for defining
|
||||||
|
* actions to be performed on response
|
||||||
|
*/
|
||||||
|
public void read(final String deviceName,
|
||||||
|
final Response.Listener<JSONObject> responseListener) {
|
||||||
|
String url = "http://" + address
|
||||||
|
+ ":" + port
|
||||||
|
+ "/device/" + deviceName + "/";
|
||||||
JsonObjectRequest request = new JsonObjectRequest(
|
JsonObjectRequest request = new JsonObjectRequest(
|
||||||
Request.Method.GET,
|
Request.Method.GET,
|
||||||
requestString,
|
url,
|
||||||
null,
|
null,
|
||||||
responseListener,
|
responseListener,
|
||||||
error -> Log.e("Communicator", "Error during READ: " + error.getMessage())
|
error -> Log.e("Communicator",
|
||||||
|
"Error during READ: " + error.getMessage())
|
||||||
);
|
);
|
||||||
requestQueue.add(request);
|
requestQueue.add(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void write(String deviceName, JSONObject message, Response.Listener<JSONObject> responseListener) {
|
/**
|
||||||
String requestString = "http://" + address + ":" + port + "/device/" + deviceName + "/";
|
* Writes an api call to the endpoint of a device.
|
||||||
|
* @param deviceName the name of the device
|
||||||
|
* @param message the JSON message
|
||||||
|
* @param responseListener the {@link Response.Listener} for defining
|
||||||
|
* actions to be performed on response
|
||||||
|
*/
|
||||||
|
public void write(final String deviceName,
|
||||||
|
final JSONObject message,
|
||||||
|
final Response.Listener<JSONObject> responseListener) {
|
||||||
|
String url = "http://" + address
|
||||||
|
+ ":" + port
|
||||||
|
+ "/device/" + deviceName + "/";
|
||||||
JsonObjectRequest request = new JsonObjectRequest(
|
JsonObjectRequest request = new JsonObjectRequest(
|
||||||
Request.Method.POST,
|
Request.Method.POST,
|
||||||
requestString,
|
url,
|
||||||
message,
|
message,
|
||||||
responseListener,
|
responseListener,
|
||||||
error -> {
|
error -> Log.e("Communicator",
|
||||||
Log.e("Communicator", "Error during WRITE: " + error.getMessage()); error.printStackTrace(); }
|
"Error during WRITE: " + error.getMessage())
|
||||||
);
|
);
|
||||||
requestQueue.add(request);
|
requestQueue.add(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void uploadXML(File xmlFile) {
|
/**
|
||||||
throw new NotImplementedError();
|
* Uploads the config.xml file to the raspberry.
|
||||||
|
*/
|
||||||
|
public void uploadXML() throws FileNotFoundException {
|
||||||
|
File xmlFile = new File(ExternalStorageHandler
|
||||||
|
.getExternalPrivateStorageDir(context), "config.xml");
|
||||||
|
String url = "http://" + address + ":" + port + "/XML/";
|
||||||
|
FileOutputVolleyRequest request = new FileOutputVolleyRequest(
|
||||||
|
Request.Method.POST,
|
||||||
|
url,
|
||||||
|
xmlFile,
|
||||||
|
response -> System.out.println(response.toString()),
|
||||||
|
error -> Log.e("Communicator",
|
||||||
|
"Error during XML UPLOAD" + error.getMessage())
|
||||||
|
);
|
||||||
|
requestQueue.add(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Downloads the config.xml file from the raspberry.
|
||||||
|
*/
|
||||||
public void downloadXML() {
|
public void downloadXML() {
|
||||||
throw new NotImplementedError();
|
String url = "http://" + address + ":" + port + "/XML/";
|
||||||
|
InputStreamVolleyRequest request = new InputStreamVolleyRequest(
|
||||||
|
Request.Method.GET,
|
||||||
|
url,
|
||||||
|
response -> {
|
||||||
|
try {
|
||||||
|
if (response != null) {
|
||||||
|
String xmlPath = ExternalStorageHandler
|
||||||
|
.getExternalPrivateStorageDir(context);
|
||||||
|
File xmlFile = new File(xmlPath, "config.xml");
|
||||||
|
/*create the default XML config by using the
|
||||||
|
default.xml from the assets folder*/
|
||||||
|
if (xmlFile.exists()) {
|
||||||
|
xmlFile.delete();
|
||||||
|
}
|
||||||
|
FileOutputStream fileOutputStream =
|
||||||
|
new FileOutputStream(xmlFile);
|
||||||
|
fileOutputStream.write(response);
|
||||||
|
fileOutputStream.close();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e("Communicator",
|
||||||
|
"Error while reading the XML DOWNLOAD "
|
||||||
|
+ "from the raspberry: "
|
||||||
|
+ e.getMessage());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error -> Log.e("Communicator",
|
||||||
|
"Error during XML DOWNLOAD: " + error.getMessage())
|
||||||
|
);
|
||||||
|
requestQueue.add(request);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,121 @@
|
|||||||
|
package com.example.aped.communication;
|
||||||
|
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.android.volley.AuthFailureError;
|
||||||
|
import com.android.volley.NetworkResponse;
|
||||||
|
import com.android.volley.Request;
|
||||||
|
import com.android.volley.Response;
|
||||||
|
import com.android.volley.toolbox.HttpHeaderParser;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom {@link Request} to send xml files to the raspberry pi.
|
||||||
|
*/
|
||||||
|
public class FileOutputVolleyRequest extends Request<JSONObject> {
|
||||||
|
|
||||||
|
/** Listener for response callback. **/
|
||||||
|
private final Response.Listener<JSONObject> listener;
|
||||||
|
|
||||||
|
/** File to be sent. **/
|
||||||
|
private final File file;
|
||||||
|
|
||||||
|
/** Headers of the response recieved from the raspberry. **/
|
||||||
|
private Map<String, String> responseHeaders;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* @param method {@link Request.Method}
|
||||||
|
* @param url url the request will be sent to
|
||||||
|
* @param pFile the file that will be sent
|
||||||
|
* @param pListener a listener for the response callback
|
||||||
|
* @param errorListener a listener for an error callback
|
||||||
|
*/
|
||||||
|
public FileOutputVolleyRequest(final int method,
|
||||||
|
final String url,
|
||||||
|
final File pFile,
|
||||||
|
final Response.Listener<JSONObject> pListener,
|
||||||
|
final Response.ErrorListener errorListener) {
|
||||||
|
super(method, url, errorListener);
|
||||||
|
setShouldCache(false);
|
||||||
|
this.listener = pListener;
|
||||||
|
this.file = pFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overrides for the body content type.
|
||||||
|
* @return xml body content type
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getBodyContentType() {
|
||||||
|
return "application/xml; charset = utf-8";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the body content.
|
||||||
|
* @return the body content
|
||||||
|
* @throws AuthFailureError
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public byte[] getBody() throws AuthFailureError {
|
||||||
|
try {
|
||||||
|
BufferedReader bufferedReader = new BufferedReader(
|
||||||
|
new FileReader(file)
|
||||||
|
);
|
||||||
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
|
String line;
|
||||||
|
while ((line = bufferedReader.readLine()) != null) {
|
||||||
|
stringBuilder.append(line);
|
||||||
|
stringBuilder.append("\n");
|
||||||
|
}
|
||||||
|
bufferedReader.close();
|
||||||
|
String requestBody = stringBuilder.toString();
|
||||||
|
return requestBody.getBytes("utf-8");
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the response into an {@link JSONObject}.
|
||||||
|
* @param response the response from the raspberry
|
||||||
|
* @return a {@link Response<JSONObject>}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected Response<JSONObject> parseNetworkResponse(
|
||||||
|
final NetworkResponse response) {
|
||||||
|
responseHeaders = response.headers;
|
||||||
|
|
||||||
|
JSONObject obj = null;
|
||||||
|
try {
|
||||||
|
obj = new JSONObject(new String(response.data));
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.e("FileOutputVolleyRequest",
|
||||||
|
"Failed parsing JSON:" + e.getMessage());
|
||||||
|
}
|
||||||
|
return Response.success(
|
||||||
|
obj, HttpHeaderParser.parseCacheHeaders(response)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deliveres the Response to the response listener.
|
||||||
|
* @param response the parsed response
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void deliverResponse(final JSONObject response) {
|
||||||
|
listener.onResponse(response);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
package com.example.aped.communication;
|
||||||
|
|
||||||
|
import com.android.volley.NetworkResponse;
|
||||||
|
import com.android.volley.Request;
|
||||||
|
import com.android.volley.Response;
|
||||||
|
import com.android.volley.toolbox.HttpHeaderParser;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom {@link Request} to enable recieving files from the raspberry pi.
|
||||||
|
* Credit: https://mobikul.com/downloading-files-using-volley/
|
||||||
|
*/
|
||||||
|
public class InputStreamVolleyRequest extends Request<byte[]> {
|
||||||
|
|
||||||
|
/** Listerner for response callback. **/
|
||||||
|
private final Response.Listener<byte[]> listener;
|
||||||
|
|
||||||
|
/** Headers of the response recieved from the raspberry.**/
|
||||||
|
private Map<String, String> responseHeaders;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* @param method {@link Request.Method}
|
||||||
|
* @param url the API url to send the request to
|
||||||
|
* @param pListener the listener for the response callback
|
||||||
|
* @param errorListener the listener for an error callback
|
||||||
|
*/
|
||||||
|
public InputStreamVolleyRequest(final int method,
|
||||||
|
final String url,
|
||||||
|
final Response.Listener<byte[]> pListener,
|
||||||
|
final Response.ErrorListener errorListener) {
|
||||||
|
super(method, url, errorListener);
|
||||||
|
setShouldCache(false);
|
||||||
|
this.listener = pListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the response into a byte array.
|
||||||
|
* @param response the response recieved from the raspberry
|
||||||
|
* @return the parsed response
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected Response<byte[]> parseNetworkResponse(
|
||||||
|
final NetworkResponse response) {
|
||||||
|
responseHeaders = response.headers;
|
||||||
|
return Response.success(
|
||||||
|
response.data, HttpHeaderParser.parseCacheHeaders(response)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delivers the recieved response to the listener.
|
||||||
|
* @param response the parsed response
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void deliverResponse(final byte[] response) {
|
||||||
|
listener.onResponse(response);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user