From 39392a5202ecdaaaba157c206d4a71f643bb0b45 Mon Sep 17 00:00:00 2001 From: Frank Rohde <frank.rohde@tu-dresden.de> Date: Thu, 23 Sep 2021 22:13:55 +0200 Subject: [PATCH] GenericSensorValueProcessor receives JSON-SensorPositionEvent and transforms it into Protobuf-SensorPositionEvent and Internal-PositionEvent fixed IndexOutOfBounds-Exception in PositionMonitoringController-Initcode eventFilter verification-code uses correct return-values --- .../eventfilter/eventFilter.java | 5 +- src/main/java/ipos/project/MainApp.java | 2 +- .../GenericSensorValueProcessor.java | 28 ++++++ .../Service/GenericSensorTransformer.java | 98 +++++++++++++++++++ .../api/MqttPositionHandler.java | 19 +++- .../UseCaseController/PositionMonitoring.java | 22 ++--- 6 files changed, 155 insertions(+), 19 deletions(-) create mode 100644 src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java create mode 100644 src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java diff --git a/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java b/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java index 653c24b..164eb42 100644 --- a/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java +++ b/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java @@ -107,15 +107,16 @@ public class eventFilter { boolean flag = false; //false for pass, true for block if (null == event.getPlacing() || null == event.getPlacing().getPosition() || null == event.getPlacing().getPosition().getPoint()){ System.out.println("EventFilter: Warning: Received event with unknown Position. Sensor-id: " + event.getSensorId()); - return false; + return true; } if (null == lObject){ System.out.println("EventFilter: Warning: Received event from sensor with unknown sensor-id: " + event.getSensorId()); - return false; + return true; } Agent agent = lObject.getAgent(); if (null == agent){ System.out.println("EventFilter: Warning: Received event for sensor-id with unknown agent. Sensor-id: " + lObject.getId()); + return true; } System.out.println("Filter structure: " + filterStructure[0] + ", " + filterStructure[1] + ", " + filterStructure[2] + ", " + filterStructure[3] + ", " + filterStructure[4] + ", " + filterStructure[5] + ", " + filterStructure[6] + ", " + filterStructure[7]); diff --git a/src/main/java/ipos/project/MainApp.java b/src/main/java/ipos/project/MainApp.java index 62704a8..9de63c5 100644 --- a/src/main/java/ipos/project/MainApp.java +++ b/src/main/java/ipos/project/MainApp.java @@ -14,7 +14,7 @@ import java.text.ParseException; @EnableJpaRepositories("ipos.project.DataModellntegration.iPos_Datamodel.impl") public class MainApp { public static void main(String[] args) throws ParseException { - TestEventFilter.test(); + // TestEventFilter.test(); SpringApplication.run(MainApp.class, args); } } diff --git a/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java b/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java new file mode 100644 index 0000000..36fd606 --- /dev/null +++ b/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java @@ -0,0 +1,28 @@ +package ipos.project.SensorValueIntegration; + +import ipos.models.SimpleScene.IposPosition; +import ipos.project.DataModellntegration.SimpleSceneIntegration.service.impl.ExternalPubServiceImpl; +import ipos.project.mapper.ProtoJsonMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jms.annotation.JmsListener; +import org.springframework.stereotype.Component; + +@Component +public class GenericSensorValueProcessor { + private final Logger LOG = LoggerFactory.getLogger(getClass()); + + @Autowired + private ExternalPubServiceImpl mqttService; + + @JmsListener(destination = "/positions", containerFactory = "jmsListenFactory") + public void receiveMessage(IposPosition pos) { + LOG.trace("Data integration get: " + pos); + // we can translate a class into a string using several methods: 1) `.toString()` 2) `JsonFormat` in `ProtoJsonMap` + String jsonPos = ProtoJsonMap.toJson(pos); + if (jsonPos != null) { + this.mqttService.publish("test51/subscribe/positions", jsonPos, 0, false); + } + } +} diff --git a/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java b/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java new file mode 100644 index 0000000..f3c87c9 --- /dev/null +++ b/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java @@ -0,0 +1,98 @@ +package ipos.project.SensorValueIntegration.Service; + +import com.google.protobuf.ProtocolStringList; +import ipos.models.GenericSensor; +import ipos.models.SimpleScene; +import ipos.project.DataModellntegration.iPos_Datamodel.*; + +import java.util.ArrayList; +import java.util.List; + +public class GenericSensorTransformer { + + private static IPos_DatamodelFactory modelFactory = IPos_DatamodelFactory.eINSTANCE; + + private static List<String> toJavaStringList(ProtocolStringList protoList){ + List<String> javaList = new ArrayList<String>(); + for(int i = 0; i < protoList.size(); i++ ){ + javaList.set(i, protoList.get(i)); + } + return javaList; + } + + public static SimpleScene.IposMonitoringRequest monReq_Internal2SScene(){ + return null; + } + + public static PositionEvent posEvent_GSensor2Internal(GenericSensor.SensorPositionEvent protoSensPosEvent) { + PositionEvent positionEvent = modelFactory.createPositionEvent(); + positionEvent.setTimeStamp(protoSensPosEvent.getLastPosUpdate()); + positionEvent.setSensorId(protoSensPosEvent.getSensorId()); + + // TODO: Zugriff auf Weltmodell ermöglichen um Bezugssystem-Objekt beschaffen zu können + positionEvent.setPlacing( + createPlacing( + createPosition( + createPoint3D( + protoSensPosEvent.getPosition().getPoint().getX(), + protoSensPosEvent.getPosition().getPoint().getY(), + protoSensPosEvent.getPosition().getPoint().getZ() + ), + protoSensPosEvent.getPosition().getAccuracy(), + createReferenceSystem("ROOT", "ROOT", null) + ), + createOrientation( + protoSensPosEvent.getOrientation().getX(), + protoSensPosEvent.getOrientation().getY(), + protoSensPosEvent.getOrientation().getZ(), + protoSensPosEvent.getOrientation().getW() + ) + )); + return positionEvent; + } + + private static ReferenceSystem createReferenceSystem(String name, String id, Placing origin){ + ReferenceSystem refSystem = modelFactory.createReferenceSystem(); + refSystem.setName(name); + refSystem.setId(id); + refSystem.setOrigin(origin); + return refSystem; + } + + private static Placing createPlacing(Position position, Orientation orientation){ + Placing placing = modelFactory.createPlacing(); + placing.setPosition(position); + placing.setOrientation(orientation); + return placing; + } + + private static Position createPosition(Point3D point3D, Float accuracy, ReferenceSystem refSystem){ + Position position = modelFactory.createPosition(); + position.setPoint(point3D); + Gaussian accrcy = modelFactory.createGaussian(); + accrcy.setConfidenceInterval(accuracy); + position.setAccuracy(accrcy); + position.setReferenceSystem(refSystem); + return position; + } + + private static Point3D createPoint3D(float x, float y, float z){ + Point3D point3D = modelFactory.createPoint3D(); + point3D.setX(x); + point3D.setY(y); + point3D.setZ(z); + return point3D; + } + + private static Quaternion createOrientation(float x, float y, float z, float w){ + Quaternion quaternion = modelFactory.createQuaternion(); + quaternion.setX(x); + quaternion.setY(y); + quaternion.setZ(z); + quaternion.setW(w); + return quaternion; + } + +} + + diff --git a/src/main/java/ipos/project/SensorValueIntegration/api/MqttPositionHandler.java b/src/main/java/ipos/project/SensorValueIntegration/api/MqttPositionHandler.java index 900e8bd..f680e20 100644 --- a/src/main/java/ipos/project/SensorValueIntegration/api/MqttPositionHandler.java +++ b/src/main/java/ipos/project/SensorValueIntegration/api/MqttPositionHandler.java @@ -1,7 +1,11 @@ package ipos.project.SensorValueIntegration.api; import com.google.protobuf.InvalidProtocolBufferException; +import ipos.models.GenericSensor.SensorPositionEvent; import ipos.models.SimpleScene.IposPosition; +import ipos.models.GenericSensor.SensorEventWrapper; +import ipos.project.DataModellntegration.iPos_Datamodel.PositionEvent; +import ipos.project.SensorValueIntegration.Service.GenericSensorTransformer; import ipos.project.config.mqtt.Handler; import ipos.project.config.mqtt.MqttListener; import ipos.project.mapper.ProtoJsonMap; @@ -13,7 +17,7 @@ import org.springframework.jms.core.JmsTemplate; // subscribe to the topic -@MqttListener("test51/publish/positions") +@MqttListener("usertopic/SensorPositionEvent") public class MqttPositionHandler implements Handler { private final Logger LOG = LoggerFactory.getLogger(getClass()); @@ -27,12 +31,17 @@ public class MqttPositionHandler implements Handler { // method that handle new message from the topic public void handle(MqttMessage message) { try { - IposPosition pos = ProtoJsonMap.fromJson(message.toString(), IposPosition.class); + System.out.println("Received MQTT-message: " + message.toString()); + SensorPositionEvent protoSensPosEvent = ProtoJsonMap.fromJson(message.toString(), SensorPositionEvent.class); + // example-JSON: {"sensorId": "UWB_1", "position": {"refSystemId": "ROOT", "point": {"x": 3.0,"y": 2.0,"z": 3.0}, "accuracy": 1.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "lastPosUpdate": "2021-09-14T09:41:20+00:00"} //IposPosition pos = IposPosition.parseFrom(message.toString().getBytes()); - assert pos != null; - LOG.info("IposPosition received: \n" + pos); + assert protoSensPosEvent != null; + LOG.info("SensorPositionEvent received: \n" + protoSensPosEvent); + PositionEvent positionEvent = GenericSensorTransformer.posEvent_GSensor2Internal(protoSensPosEvent); + System.out.println("Transformed Protobuf-SensorPositionEvent into Internal-PositionEvent: " + positionEvent.toString() + ", " + positionEvent.getPlacing().getPosition().getPoint().toString() + ", " + positionEvent.getPlacing().getOrientation().toString()); - this.jmsTemplate.convertAndSend("/positions", pos); // submit position to the internal broker + // ggf. anstatt JMS einfach den PositionMonitoringController per Funktionsaufruf aufrufen + this.jmsTemplate.convertAndSend("/PositionEvent", protoSensPosEvent); // submit position to the internal broker //TODO: fix message converter for the internal broker } catch (InvalidProtocolBufferException e) { LOG.error("Invalid mqtt message:", e); diff --git a/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java b/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java index c79d743..b08953f 100644 --- a/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java +++ b/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java @@ -22,17 +22,17 @@ public class PositionMonitoring { List<eventFilter> eventFilters = new ArrayList<eventFilter>(); private IPos_DatamodelFactory modelFactory = IPos_DatamodelFactory.eINSTANCE; - public void initialize(){ + public PositionMonitoring(){ wm = modelFactory.createWorldModel(); - wm.getReferenceSystem().set(0, createReferenceSystem("ROOT", "ROOT", null)); - wm.getPois().set(0, createPOI(createPosition(createPoint3D(1.4f, 2.0f, 0f), 1f, wm.getReferenceSystem().get(0)), "UWBToken1", new HashMap<String,String>())); - wm.getPois().set(1, createPOI(createPosition(createPoint3D(3.7f, -2.0f, 0f), 1f, wm.getReferenceSystem().get(0)), "UWBToken2", new HashMap<String,String>())); - wm.getPois().set(2, createPOI(createPosition(createPoint3D(-2.4f, -0.5f, 0f), 1f, wm.getReferenceSystem().get(0)), "UWBToken3", new HashMap<String,String>())); - wm.getZoneMap().set(0, modelFactory.createZoneMap()); + wm.getReferenceSystem().add(createReferenceSystem("ROOT", "ROOT", null)); + wm.getPois().add(createPOI(createPosition(createPoint3D(1.4f, 2.0f, 0f), 1f, wm.getReferenceSystem().get(0)), "UWBToken1", new HashMap<String,String>())); + wm.getPois().add(createPOI(createPosition(createPoint3D(3.7f, -2.0f, 0f), 1f, wm.getReferenceSystem().get(0)), "UWBToken2", new HashMap<String,String>())); + wm.getPois().add(createPOI(createPosition(createPoint3D(-2.4f, -0.5f, 0f), 1f, wm.getReferenceSystem().get(0)), "UWBToken3", new HashMap<String,String>())); + wm.getZoneMap().add(modelFactory.createZoneMap()); List<Space> spaces = Arrays.asList(createSpace(3.0f, 3.0f, 3.0f, createPlacing(createPosition(createPoint3D(1.1f, 0.9f, 0f), 1f, wm.getReferenceSystem().get(0)), createOrientation(0f, 0f, 0f, 0f)))); - wm.getZoneMap().get(0).getZone().set(0, createZone("cobot1_warning_zone", "cobot1_warning_zone", spaces)); - wm.getAgent().set(0, createAgent("Employee1", "HUMAN", null )); - wm.getAgent().get(0).getLObject().set(0, createLobject("UWB_1", "UWB", wm.getAgent().get(0), null)); + wm.getZoneMap().get(0).getZone().add(createZone("cobot1_warning_zone", "cobot1_warning_zone", spaces)); + wm.getAgent().add(createAgent("Employee1", "HUMAN")); + wm.getAgent().get(0).getLObject().add(createLobject("UWB_1", "UWB", wm.getAgent().get(0), null)); } private POI createPOI(Position position, String description, Map<String, String> data){ @@ -43,11 +43,10 @@ public class PositionMonitoring { return poi; } - private Agent createAgent(String id, String type, List<LocalizableObject> lobjects){ + private Agent createAgent(String id, String type){ Agent agent = modelFactory.createAgent(); agent.setId(id); agent.setAgentType(type); - agent.getLObject().addAll(lobjects); return agent; } @@ -135,6 +134,7 @@ public class PositionMonitoring { readConfig.setWM(wm); readConfig.readFilterConfigFromMonitoringRequest(monReq, config); filter.init(config); + eventFilters.add(filter); } @JmsListener(destination = "/PositionEvent", containerFactory = "jmsListenFactory") -- GitLab