diff --git a/src/boarderGateway/CoAPRessources.java b/src/boarderGateway/CoAPRessources.java index 8605f54f044b0a412d4c01b6ea3f9c298c0d995b..78ca4e1db225362397f61a966b68b3a736db3782 100644 --- a/src/boarderGateway/CoAPRessources.java +++ b/src/boarderGateway/CoAPRessources.java @@ -1,6 +1,9 @@ package boarderGateway; +import java.io.ByteArrayInputStream; +import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import org.eclipse.californium.core.CoapResource; @@ -10,6 +13,18 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.cbor.CBORConstants; +import com.fasterxml.jackson.dataformat.cbor.CBORFactory; +import com.fasterxml.jackson.dataformat.cbor.CBORParser; + +import co.nstant.in.cbor.*; +import co.nstant.in.cbor.decoder.UnicodeStringDecoder; +import co.nstant.in.cbor.model.*; + public class CoAPRessources { @@ -22,34 +37,86 @@ public class CoAPRessources { getAttributes().setTitle("Client Registrierung"); } + @Override public void handlePOST(CoapExchange exchange) { - try { - // Parse empfangenen String als JSON. Bei Fehler: BAD_REQUEST - JSONObject json = new JSONObject(exchange.getRequestText()); - - String name = json.getString("name"); - int clientID = json.getInt("id"); - - // Parse JSONArray in Java List - JSONArray params = json.getJSONArray("parameter"); - List<String> list = new ArrayList<String>(); - for(int i = 0; i < params.length(); i++){ - list.add(params.get(i).toString()); + List<String> allowedTypes = Arrays.asList("string", "integer"); + boolean errorOccurred = false; + + // TODO Auto-generated method stub + CBORFactory f = new CBORFactory(); + String source_address = exchange.getSourceAddress().getHostAddress(); + System.out.println("GOT A PUT from "+source_address); + // Check, if source IP is allowed to + if (database.isClientAllowed(source_address)){ + try { + // Lade erhaltenen Bytecode in CBOR Parser + byte payload[] = exchange.getRequestPayload(); + CBORParser myCborParser = f.createParser(payload); + + List<String> paras = new ArrayList<String>(); + List<String> types = new ArrayList<String>(); + + myCborParser.nextToken(); + String name = myCborParser.getText(); + System.out.println("Name: "+name); + + // Lese Arrays aus: [ "Parameter Name" , "Datentyp"] + String para = ""; + String type = ""; + + // While Schleife, bis zum Ende der CBOR Nachricht + while (myCborParser.nextToken() != null){ + // Array Beginn + if (myCborParser.getText().equals("[")){ + para = myCborParser.nextTextValue(); + type = myCborParser.nextTextValue(); + + // Prüfe ob Typ supported wird. + if (allowedTypes.contains(type)){ + paras.add(para); + types.add(type); + }else{ + errorOccurred = true; + } + + // Nächstes Token muss Array schließen, ansonsten Fehler. + myCborParser.nextToken(); + if (!myCborParser.getText().equals("]")){ + errorOccurred = true; + } + }else{ + // Kein (korrektes) Array in CBOR gefunden + errorOccurred = true; + } + } + + if (!errorOccurred){ + if (database.registerClient(name, source_address, paras, types)){ + exchange.respond(ResponseCode.CREATED); + }else{ + exchange.respond(ResponseCode.INTERNAL_SERVER_ERROR); + } + }else{ + exchange.respond(ResponseCode.BAD_REQUEST); + } + + } catch (JsonParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (JsonMappingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); } - // Füge Client in Datenbank hinzu. Bei Fehler: INTERNAL_SERVER_ERROR - if (database.registerClient(name, clientID, list)){ - exchange.respond(ResponseCode.CREATED); - }else{ - exchange.respond(ResponseCode.INTERNAL_SERVER_ERROR); - } - }catch(JSONException e){ - exchange.respond(ResponseCode.BAD_REQUEST); - } - } - + }else{ + exchange.respond(ResponseCode.UNAUTHORIZED); + } + } } public static class DataRessource extends CoapResource{ @@ -60,8 +127,74 @@ public class CoAPRessources { getAttributes().setTitle("Datenuebertragung"); } + + @Override + public void handlePOST(CoapExchange exchange) { + // TODO Auto-generated method stub + System.out.println("DATA POST!"); + + // Ermittle letzte registrierte ID zur Source Address + CBORFactory f = new CBORFactory(); + String source_address = exchange.getSourceAddress().getHostAddress(); + List<String> values = new ArrayList<String>(); + if (database.doesClientAddressExist(source_address)){ + try { + byte payload[] = exchange.getRequestPayload(); + CBORParser myCborParser = f.createParser(payload); + + // Erhalte Reihenfolge von String & Integer + List<String> types = database.getClientParamsTypeList(source_address); + System.out.println("#Types: "+types.size()); + for (int i = 0; i < types.size();i++){ + System.out.println(types.get(i)); + } + for (String type : types) { + switch (type){ + case "string": + String paraString = myCborParser.nextTextValue(); + System.out.println("String! : "+paraString); + values.add(paraString); + break; + case "integer": + int paraInt = myCborParser.nextIntValue(0); + System.out.println("Int! : "+paraInt); + values.add(Integer.toString(paraInt)); + break; + case "float": + myCborParser.nextToken(); + float paraFloat = myCborParser.getFloatValue(); + Float.toString(paraFloat); + values.add(Float.toString(paraFloat)); + break; + default: + // Error + } + } + + + // Füge Daten in Datenbank hinzu. Bei Fehler: INTERNAL_SERVER_ERROR + if (database.addData(source_address, values)){ + exchange.respond(ResponseCode.CHANGED); + }else{ + exchange.respond(ResponseCode.INTERNAL_SERVER_ERROR); + } + + + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + }else{ + exchange.respond(ResponseCode.UNAUTHORIZED); + } + } + + + + /*@Override public void handlePUT(CoapExchange exchange) { try { @@ -93,7 +226,7 @@ public class CoAPRessources { }catch(JSONException e){ exchange.respond(ResponseCode.BAD_REQUEST); } - } + }*/ } } diff --git a/src/boarderGateway/MySQL.java b/src/boarderGateway/MySQL.java index a4e55545d3a04f0c50d13f3e8b1672f9b97ecb70..9dda1d20cfa3c7f5da6d6993bec735d18a5b1237 100644 --- a/src/boarderGateway/MySQL.java +++ b/src/boarderGateway/MySQL.java @@ -19,6 +19,7 @@ public class MySQL { public static final String TBL_REGISTER = "tbl_register"; public static final String TBL_PARAMS = "tbl_parameter"; public static final String TBL_DATA = "tbl_data"; + public static final String TBL_ADDRESSES = "tbl_addresses"; private Connection conn = null; private Statement statement = null; @@ -73,17 +74,31 @@ public class MySQL { } } - public boolean registerClient(String name, int clientID, List<String> params){ + public boolean isClientAllowed(String source_address){ + String query = ""; + query = "SELECT * FROM "+MySQL.TBL_ADDRESSES+" WHERE address = '"+source_address+"'"; + ResultSet rs; + try { + rs = this.statement.executeQuery(query); + return rs.next(); + } catch (SQLException e) { + // TODO Auto-generated catch block + return false; + } + + } + + public boolean registerClient(String name, String clientAddress, List<String> params, List<String> types){ // TODO: Prüfe ob Client bereits registriert? String query = ""; try { - query = "INSERT INTO "+MySQL.TBL_REGISTER+"(clientID, name) VALUES("+clientID+", '"+name+"')"; + query = "INSERT INTO "+MySQL.TBL_REGISTER+"(clientAddress, name) VALUES('"+clientAddress+"', '"+name+"')"; System.out.println(query); this.statement.executeUpdate(query, Statement.RETURN_GENERATED_KEYS); int lastID = this.getLastInsertedID(this.statement.getGeneratedKeys()); if (lastID > 0){ - for ( String para : params){ - query = "INSERT INTO "+MySQL.TBL_PARAMS+"(fid_register, param) VALUES("+lastID+", '"+para+"')"; + for ( int i = 0; i<params.size(); i++){ + query = "INSERT INTO "+MySQL.TBL_PARAMS+"(fid_register, param, type) VALUES("+lastID+", '"+params.get(i)+"', '"+types.get(i)+"')"; System.out.println(query); this.statement.executeUpdate(query); } @@ -101,13 +116,13 @@ public class MySQL { } } - public boolean addData(int clientID, List<String> values){ + public boolean addData(String clientAddress, List<String> values){ String query = ""; try { // Erhalte aktuellsten Primary Key der entsprechenden clientID - query = "SELECT * FROM "+MySQL.TBL_REGISTER+" WHERE clientID = "+clientID+" ORDER BY ID DESC LIMIT 1"; + query = "SELECT * FROM "+MySQL.TBL_REGISTER+" WHERE clientAddress = '"+clientAddress+"' ORDER BY ID DESC LIMIT 1"; ResultSet rs = this.statement.executeQuery(query); rs.next(); int id = rs.getInt(1); @@ -142,8 +157,8 @@ public class MySQL { return true; } - public boolean doesClientIDExist(int clientID){ - String query = "SELECT * FROM "+MySQL.TBL_REGISTER+" WHERE clientID = "+clientID; + public boolean doesClientAddressExist(String clientAddress){ + String query = "SELECT * FROM "+MySQL.TBL_REGISTER+" WHERE clientAddress = '"+clientAddress+"'"; try { ResultSet rs = this.statement.executeQuery(query); // True if not empty @@ -155,6 +170,30 @@ public class MySQL { } + public List<String> getClientParamsTypeList(String clientAddress){ + List<String> parameters = new ArrayList<String>(); + String query = "SELECT * FROM "+MySQL.TBL_REGISTER+" WHERE clientAddress = '"+clientAddress+"' ORDER BY id DESC LIMIT 1"; + ResultSet rs; + String clientID = ""; + try { + rs = this.statement.executeQuery(query); + while (rs.next()){ + clientID = Integer.toString(rs.getInt("id")); + } + + query = "SELECT * FROM "+MySQL.TBL_PARAMS+" WHERE fid_register = "+clientID; + rs = this.statement.executeQuery(query); + while (rs.next()){ + parameters.add(rs.getString("type")); + } + + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return parameters; + } + private int getLastInsertedID(ResultSet keys){ try { keys.next();