diff --git a/java/src/boarderGateway/CoAPClient.java b/java/src/boarderGateway/CoAPClient.java index 8d4adf4ff4a054e1429d669deaac2e712b445d20..b9a067820ee60813ba770a0f288fc04fa7b5d9e9 100644 --- a/java/src/boarderGateway/CoAPClient.java +++ b/java/src/boarderGateway/CoAPClient.java @@ -4,10 +4,14 @@ import java.io.ByteArrayOutputStream; import org.eclipse.californium.core.CoapClient; import co.nstant.in.cbor.CborBuilder; +import co.nstant.in.cbor.CborDecoder; import co.nstant.in.cbor.CborEncoder; import co.nstant.in.cbor.CborException; import boarderGateway.CoAPRessources.*; +import org.apache.commons.codec.binary.Hex; + +import com.sun.xml.internal.fastinfoset.algorithm.HexadecimalEncodingAlgorithm; public class CoAPClient { @@ -17,28 +21,34 @@ public class CoAPClient { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { new CborEncoder(baos).encode(new CborBuilder() - // .add("MyClient Name") - // .addArray() // add array - // .add("Para11") - // .add("string") - // .end() - // .addArray() - // .add("Para22") - // .add("integer") - // .end() - - .add("My String value") - .add(1234) + .addArray() + /*.add("Neuer Test") + .addArray() // add array + .add("Parameter 1") + .add("float") + .end() + .addArray() + .add("String Parmeter 2") + .add("string") + .end() + */ + + + .add("1") + .add(2300) + + .end() .build()); } catch (CborException e) { // TODO Auto-generated catch block e.printStackTrace(); } - + //System.out.println("String: "+baos.toString()); + System.out.println("Byte: "+Hex.encodeHexString(baos.toByteArray())); byte[] encodedBytes = baos.toByteArray(); CoapClient client = new CoapClient("coap://localhost/data"); - client.post(encodedBytes, 0); + client.put(encodedBytes, 0); } diff --git a/java/src/boarderGateway/CoAPRessources.java b/java/src/boarderGateway/CoAPRessources.java index 9986d2be17b6f713998f8f76b79aa6a939f069da..6439e8e8e2f34d986c5ec82acfb21de6119a0bb0 100644 --- a/java/src/boarderGateway/CoAPRessources.java +++ b/java/src/boarderGateway/CoAPRessources.java @@ -57,7 +57,10 @@ public class CoAPRessources { List<String> paras = new ArrayList<String>(); List<String> types = new ArrayList<String>(); + // Gehe zum ersten Token. Überspringe erstes "[" myCborParser.nextToken(); + myCborParser.nextToken(); + String name = myCborParser.getText(); System.out.println("Name: "+name); @@ -85,6 +88,8 @@ public class CoAPRessources { if (!myCborParser.getText().equals("]")){ errorOccurred = true; } + }else if (myCborParser.getText().equals("]")) { + // CBOR Ende }else{ // Kein (korrektes) Array in CBOR gefunden errorOccurred = true; @@ -113,6 +118,8 @@ public class CoAPRessources { } }else{ + // Client nicht erlaubt - Speichere in tbl_unregistered + database.storeUnregisteredClient(source_address); exchange.respond(ResponseCode.UNAUTHORIZED); } } @@ -145,6 +152,9 @@ public class CoAPRessources { byte payload[] = exchange.getRequestPayload(); CBORParser myCborParser = f.createParser(payload); + //Springe zum ersten Token + myCborParser.nextToken(); + // Erhalte Reihenfolge von String & Integer List<String> types = database.getClientParamsTypeList(source_address); for (int i = 0; i < types.size();i++){ diff --git a/java/src/boarderGateway/CoAPServer.java b/java/src/boarderGateway/CoAPServer.java index 6cfc692444b82e861d4c206904668538e1808467..116d779694e6cabb01e642439137ac979da0e74b 100644 --- a/java/src/boarderGateway/CoAPServer.java +++ b/java/src/boarderGateway/CoAPServer.java @@ -3,6 +3,8 @@ package boarderGateway; import org.eclipse.californium.core.CoapServer; import boarderGateway.CoAPRessources.*; +import boarderGateway.CoAPTestRessources.*; + public class CoAPServer { @@ -10,9 +12,20 @@ public class CoAPServer { // TODO Auto-generated method stub CoapServer server = new CoapServer(); - - server.add(new RegisterRessource()); - server.add(new DataRessource()); + + if (args.length > 0){ + if (args[0].equals("test")){ + server.add(new RegisterRessourceTest()); + server.add(new DataRessourceTest()); + }else{ + server.add(new RegisterRessource()); + server.add(new DataRessource()); + } + }else{ + server.add(new RegisterRessource()); + server.add(new DataRessource()); + } + server.start(); } diff --git a/java/src/boarderGateway/CoAPTestRessources.java b/java/src/boarderGateway/CoAPTestRessources.java new file mode 100644 index 0000000000000000000000000000000000000000..a6c42f9614827d0dc9f3e5d80449cc253f533acf --- /dev/null +++ b/java/src/boarderGateway/CoAPTestRessources.java @@ -0,0 +1,160 @@ +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; +import org.eclipse.californium.core.coap.CoAP.ResponseCode; +import org.eclipse.californium.core.server.resources.CoapExchange; +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 CoAPTestRessources { + + + public static class RegisterRessourceTest extends CoapResource{ + + public RegisterRessourceTest(){ + super("register"); + getAttributes().setTitle("Client Registrierung"); + } + + + @Override + public void handlePOST(CoapExchange exchange) { + List<String> allowedTypes = Arrays.asList("string", "integer", "float"); + boolean errorOccurred = false; + + // TODO Auto-generated method stub + CBORFactory f = new CBORFactory(); + String source_address = exchange.getSourceAddress().getHostAddress(); + System.out.println("Received POST on /register from "+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(); + 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); + System.out.println("Added Para "+para+" of Type "+type); + }else{ + errorOccurred = true; + } + + // Nächstes Token muss Array schließen, ansonsten Fehler. + myCborParser.nextToken(); + if (!myCborParser.getText().equals("]")){ + errorOccurred = true; + } + }else if (myCborParser.getText().equals("]")) { + // CBOR Ende + }else{ + // Kein (korrektes) Array in CBOR gefunden + errorOccurred = true; + } + } + + if (!errorOccurred){ + exchange.respond(ResponseCode.CREATED); + }else{ + exchange.respond(ResponseCode.BAD_REQUEST); + } + + } catch (JsonParseException e) { + // TODO Auto-generated catch block + exchange.respond(ResponseCode.BAD_REQUEST); + e.printStackTrace(); + } catch (JsonMappingException e) { + // TODO Auto-generated catch block + exchange.respond(ResponseCode.BAD_REQUEST); + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + exchange.respond(ResponseCode.BAD_REQUEST); + e.printStackTrace(); + } + } + } + + public static class DataRessourceTest extends CoapResource{ + public DataRessourceTest(){ + super("data"); + + getAttributes().setTitle("Datenuebertragung"); + } + + + + @Override + public void handlePUT(CoapExchange exchange) { + // TODO Auto-generated method stub + + // Ermittle letzte registrierte ID zur Source Address + CBORFactory f = new CBORFactory(); + String source_address = exchange.getSourceAddress().getHostAddress(); + System.out.println("Received PUT on /data from "+source_address); + boolean errorOccurred = false; + + List<String> values = new ArrayList<String>(); + + try { + byte payload[] = exchange.getRequestPayload(); + CBORParser myCborParser = f.createParser(payload); + + // Erhalte Reihenfolge von String & Integer + + while (myCborParser.nextToken() != null){ + System.out.println(myCborParser.getValueAsString("")); + } + + + exchange.respond(ResponseCode.CHANGED); + + + } catch (IOException e) { + // TODO Auto-generated catch block + exchange.respond(ResponseCode.INTERNAL_SERVER_ERROR); + } + } + + } +} diff --git a/java/src/boarderGateway/MySQL.java b/java/src/boarderGateway/MySQL.java index 9dda1d20cfa3c7f5da6d6993bec735d18a5b1237..06c7b35db7c40dd2a9d260143b330ed0e75b3995 100644 --- a/java/src/boarderGateway/MySQL.java +++ b/java/src/boarderGateway/MySQL.java @@ -20,6 +20,7 @@ public class MySQL { public static final String TBL_PARAMS = "tbl_parameter"; public static final String TBL_DATA = "tbl_data"; public static final String TBL_ADDRESSES = "tbl_addresses"; + public static final String TBL_UNREGISTERED = "tbl_unregistered"; private Connection conn = null; private Statement statement = null; @@ -96,6 +97,7 @@ public class MySQL { System.out.println(query); this.statement.executeUpdate(query, Statement.RETURN_GENERATED_KEYS); int lastID = this.getLastInsertedID(this.statement.getGeneratedKeys()); + System.out.println("Last ID: "+lastID); if (lastID > 0){ 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)+"')"; @@ -194,6 +196,22 @@ public class MySQL { return parameters; } + public void storeUnregisteredClient(String clientAddress){ + String query = "SELECT * FROM "+MySQL.TBL_UNREGISTERED+" WHERE clientAddress = '"+clientAddress+"'"; + try { + ResultSet rs = this.statement.executeQuery(query); + // True if not empty + if (!rs.next()){ + query = "INSERT INTO "+MySQL.TBL_UNREGISTERED+"(clientAddress) VALUES('"+clientAddress+"')"; + this.statement.executeUpdate(query); + } + } catch (SQLException e) { + // TODO Auto-generated catch block + // Do Nothing + } + + } + private int getLastInsertedID(ResultSet keys){ try { keys.next();