Skip to content
Snippets Groups Projects
Commit 997aa9c8 authored by FrankR's avatar FrankR
Browse files

internal-positionEvents can be transformed into protobuf-positionEvents and can be sent via MQTT

Exchanged logger slf4j for log4j
small changes to internal data model (emf-project)
parent 4db2acf6
No related branches found
No related tags found
No related merge requests found
Showing
with 118 additions and 60 deletions
......@@ -5,7 +5,7 @@
<semanticResources>iPos_Datamodel.genmodel</semanticResources>
<ownedViews xmi:type="viewpoint:DView" uid="_EpwecAQNEey-kNQ7esRa_g">
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/>
<ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_Et4wgAQNEey-kNQ7esRa_g" name="iPos_Datamodel" repPath="#_Es-xkAQNEey-kNQ7esRa_g" changeId="de9b3043-b6a3-4d89-afc7-963d67701d45">
<ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_Et4wgAQNEey-kNQ7esRa_g" name="iPos_Datamodel" repPath="#_Es-xkAQNEey-kNQ7esRa_g" changeId="97e64d49-5157-4ee8-a1f0-01117933234c">
<description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
<target xmi:type="ecore:EPackage" href="iPos_Datamodel.ecore#/"/>
</ownedRepresentationDescriptors>
......@@ -2250,7 +2250,7 @@
<arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
<arrangeConstraints>KEEP_SIZE</arrangeConstraints>
<arrangeConstraints>KEEP_RATIO</arrangeConstraints>
<ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_qwXFihvcEeyPOIo-WqURQQ" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
<ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_ZchbXyBzEeyaJIyxidrtuQ" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
<description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
</ownedStyle>
<actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
......@@ -2262,9 +2262,9 @@
</ownedStyle>
<actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
</ownedElements>
<ownedElements xmi:type="diagram:DNodeListElement" uid="_onxBUBvcEeyPOIo-WqURQQ" name="sensorId : EString" tooltipText="">
<target xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//PositionEvent/sensorId"/>
<semanticElements xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//PositionEvent/sensorId"/>
<ownedElements xmi:type="diagram:DNodeListElement" uid="_onxBUBvcEeyPOIo-WqURQQ" name="lObjectId : EString" tooltipText="">
<target xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//PositionEvent/lObjectId"/>
<semanticElements xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//PositionEvent/lObjectId"/>
<ownedStyle xmi:type="diagram:BundledImage" uid="_qwZhwRvcEeyPOIo-WqURQQ" labelAlignment="LEFT">
<description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/>
</ownedStyle>
......@@ -2762,7 +2762,7 @@
<arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
<arrangeConstraints>KEEP_SIZE</arrangeConstraints>
<arrangeConstraints>KEEP_RATIO</arrangeConstraints>
<ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_NzPucRr2EeyPOIo-WqURQQ" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
<ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_GrDD1SB0EeyaJIyxidrtuQ" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
<description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
</ownedStyle>
<actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
......
......@@ -119,7 +119,7 @@
eType="#//Placing"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="timeStamp" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
transient="true"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="sensorId" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="lObjectId" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="RawdataEvent">
<eStructuralFeatures xsi:type="ecore:EReference" name="rawdata" lowerBound="1"
......
......@@ -110,7 +110,7 @@
<genClasses ecoreClass="iPos_Datamodel.ecore#//PositionEvent">
<genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference iPos_Datamodel.ecore#//PositionEvent/placing"/>
<genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//PositionEvent/timeStamp"/>
<genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//PositionEvent/sensorId"/>
<genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//PositionEvent/lObjectId"/>
</genClasses>
<genClasses ecoreClass="iPos_Datamodel.ecore#//RawdataEvent">
<genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference iPos_Datamodel.ecore#//RawdataEvent/rawdata"/>
......
package ipos.project.DataModellntegration.SimpleSceneIntegration;
import ipos.models.SimpleScene.IposPosition;
import ipos.models.SimpleScene;
import ipos.project.DataModellntegration.SimpleSceneIntegration.service.SimpleSceneTransformer;
import ipos.project.DataModellntegration.SimpleSceneIntegration.service.impl.ExternalPubServiceImpl;
import ipos.project.DataModellntegration.iPos_Datamodel.PositionEvent;
import ipos.project.mapper.ProtoJsonMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.logging.log4j.LogManager;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
@Component
public class SimpleSceneIntegration {
private final Logger LOG = LoggerFactory.getLogger(getClass());
// private static final Logger LOG = LoggerFactory.getLogger(SimpleSceneIntegration.class);
private static org.apache.logging.log4j.Logger LOG = LogManager.getLogger();
//@Autowired
public static ExternalPubServiceImpl mqttService;
......@@ -34,22 +34,17 @@ public class SimpleSceneIntegration {
}*/
public static void receiveMessage(PositionEvent positionEvent, String monitoringTaskId) {
// LOG.trace("Data integration get: " + pos);
System.out.println("SimpleSceneIntegration: Data integration get: " + positionEvent);
// we can translate a class into a string using several methods: 1) `.toString()` 2) `JsonFormat` in `ProtoJsonMap`
//String jsonPos = ProtoJsonMap.toJson(positionEvent);
// TODO: Transform Internal-PositionEvent to Protobuf-SensorPositionEvent
LOG.info("receiveMessage get: " + positionEvent);
//String jsonPos = ProtoJsonMap.toJson(positionEvent); // we can translate a class into a string using several methods: 1) `.toString()` 2) `JsonFormat` in `ProtoJsonMap`
if (positionEvent != null) {
System.out.println("SimpleSceneIntegration: mqtt-message will be published: monitoringTaskId: " + monitoringTaskId + " positionEvent: " + positionEvent.toString());
if (null == mqttService) {
System.out.println("Warning: SimpleSceneIntegration: mqttService is null");
}
// getsensorId, load sensor-type, agent-type, agent-id and create IposPositionEvent
// SimpleSceneTransformer.posEvent_internal2Proto();
mqttService.publish(monitoringTaskId, positionEvent.toString(), 0, false);
LOG.info("received internal-positionEvent: monitoringTaskId: " + monitoringTaskId + " positionEvent: " + positionEvent.toString());
SimpleScene.IposPositionEvent posEvent_proto = SimpleSceneTransformer.posEvent_internal2Proto(positionEvent);
LOG.info("obtained protobuf-positionEvent:" + posEvent_proto.toString());
MqttMessage mqttMessage = mqttService.createMqttMsg(posEvent_proto, 0, false);
LOG.info("publishing mqttMessage:" + mqttMessage.toString() + " on topic: " + monitoringTaskId);
mqttService.publish(monitoringTaskId, mqttMessage);
}else{
System.out.println("Warning: SimpleScene: Received empty PositionEvent");
LOG.debug("Warning: SimpleScene: Received empty PositionEvent");
}
}
......
package ipos.project.DataModellntegration.SimpleSceneIntegration.service;
import com.google.protobuf.AbstractMessageLite;
import org.eclipse.paho.client.mqttv3.MqttMessage;
public interface ExternalPubService {
void publish(final String topic, final String msg , int qos, boolean retained);
MqttMessage createMqttMsg(AbstractMessageLite message, int qos, boolean retained);
}
package ipos.project.DataModellntegration.SimpleSceneIntegration.service;
import ipos.models.SimpleScene;
import ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelFactory;
import ipos.project.DataModellntegration.iPos_Datamodel.MonitoringRequest;
import ipos.project.DataModellntegration.iPos_Datamodel.*;
import com.google.protobuf.ProtocolStringList;
import ipos.project.UseCaseController.PositionMonitoring;
import org.apache.logging.log4j.LogManager;
import java.util.ArrayList;
import java.util.List;
public class SimpleSceneTransformer {
private static org.apache.logging.log4j.Logger LOG = LogManager.getLogger();
private static IPos_DatamodelFactory modelFactory = IPos_DatamodelFactory.eINSTANCE;
public static MonitoringRequest monReq_SScene2Internal(SimpleScene.IposMonitoringRequest monReqProto){
......@@ -39,4 +40,45 @@ public class SimpleSceneTransformer {
return null;
}
public static SimpleScene.IposPositionEvent posEvent_internal2Proto(PositionEvent internalPosEvent){
LocalizableObject lObject = PositionMonitoring.getLObjectByIdOrNull(internalPosEvent.getSensorId());
if (null == lObject || null == lObject.getAgent()) {
LOG.error("Internal-PositionEvent could not be transformed into protobuf-format. " +
"No LocalizableObject with the provided sensor-id could be found, or no agent " +
"is associated to the LocalizableObject that has been found.");
return null;
}
SimpleScene.IposPoint3D.Builder protoPoint3D = transformIntoProtoPoint3D(internalPosEvent);
SimpleScene.IposPosition.Builder protoIposPosition = transformIntoProtoIposPosition(internalPosEvent, protoPoint3D);
SimpleScene.IposSimpleOrientation.Builder protoOrientation = transformIntoProtoOrientation(internalPosEvent);
SimpleScene.IposObject.Builder protoIposObject = SimpleScene.IposObject.newBuilder();
protoIposObject.setSensorId(lObject.getId()).setSensorType(lObject.getSensorType()).setId(lObject.getAgent().getId()).setType(lObject.getAgent().getAgentType()).setOrientation(protoOrientation).setPosition(protoIposPosition).setLastPosUpdate(internalPosEvent.getTimeStamp());
SimpleScene.IposPositionEvent.Builder protoIPosEvent = SimpleScene.IposPositionEvent.newBuilder();
protoIPosEvent.addObject(protoIposObject);
return protoIPosEvent.build();
}
private static SimpleScene.IposSimpleOrientation.Builder transformIntoProtoOrientation(PositionEvent internalPosEvent) {
SimpleScene.IposSimpleOrientation.Builder protoOrientation = SimpleScene.IposSimpleOrientation.newBuilder();
Quaternion internalOrientation = (Quaternion) internalPosEvent.getPlacing().getOrientation();
protoOrientation.setX(internalOrientation.getX()).setY(internalOrientation.getY()).setZ(internalOrientation.getZ());
return protoOrientation;
}
private static SimpleScene.IposPosition.Builder transformIntoProtoIposPosition(PositionEvent internalPosEvent, SimpleScene.IposPoint3D.Builder protoPoint3D) {
float internalAccuracy = ((Gaussian) internalPosEvent.getPlacing().getPosition().getAccuracy()).getConfidenceInterval();
String internalRefSystemId = internalPosEvent.getPlacing().getPosition().getReferenceSystem().getId();
SimpleScene.IposPosition.Builder protoIposPosition = SimpleScene.IposPosition.newBuilder();
protoIposPosition.setAccuracy(internalAccuracy).setRefSystemId(internalRefSystemId).setPoint(protoPoint3D);
return protoIposPosition;
}
private static SimpleScene.IposPoint3D.Builder transformIntoProtoPoint3D(PositionEvent internalPosEvent) {
SimpleScene.IposPoint3D.Builder protoPoint3D = SimpleScene.IposPoint3D.newBuilder();
Point3D internalPoint3D = (Point3D) internalPosEvent.getPlacing().getPosition().getPoint();
protoPoint3D.setX(internalPoint3D.getX()).setY(internalPoint3D.getY()).setZ(internalPoint3D.getZ());
return protoPoint3D;
}
}
package ipos.project.DataModellntegration.SimpleSceneIntegration.service.impl;
import com.google.protobuf.AbstractMessageLite;
import ipos.project.DataModellntegration.SimpleSceneIntegration.service.ExternalPubService;
import org.eclipse.paho.client.mqttv3.MqttAsyncClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@Service
public class ExternalPubServiceImpl implements ExternalPubService {
private final Logger LOG = LoggerFactory.getLogger(getClass());
private final MqttAsyncClient mqttClient;
@Autowired
......@@ -22,11 +29,30 @@ public class ExternalPubServiceImpl implements ExternalPubService {
mqttMessage.setPayload(msg.getBytes());
mqttMessage.setQos(qos);
mqttMessage.setRetained(retained);
publish(topic, mqttMessage);
}
public void publish(final String topic, final MqttMessage mqttMessage){
try {
mqttClient.publish(topic, mqttMessage);
} catch (MqttException e) {
LOG.error("MQTT-message could not be published");
e.printStackTrace();
}
}
@Override
public MqttMessage createMqttMsg(AbstractMessageLite protoMessage, int qos, boolean retained) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
protoMessage.writeTo(baos);
} catch (IOException e) {
LOG.error("Protobuf-message could not be serialized");
e.printStackTrace();
}
MqttMessage mqttMessage = new MqttMessage(baos.toByteArray());
mqttMessage.setQos(qos);
mqttMessage.setRetained(retained);
return mqttMessage;
}
}
......@@ -3,15 +3,14 @@ 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.apache.logging.log4j.LogManager;
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());
private static org.apache.logging.log4j.Logger LOG = LogManager.getLogger();
@Autowired
private ExternalPubServiceImpl mqttService;
......
......@@ -11,9 +11,8 @@ import ipos.project.UseCaseController.PositionMonitoring;
import ipos.project.config.mqtt.Handler;
import ipos.project.config.mqtt.MqttListener;
import ipos.project.mapper.ProtoJsonMap;
import org.apache.logging.log4j.LogManager;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
......@@ -22,7 +21,7 @@ import org.springframework.jms.core.JmsTemplate;
@MqttListener("usertopic/SensorPositionEvent")
public class MqttPositionHandler implements Handler {
private final Logger LOG = LoggerFactory.getLogger(getClass());
private static org.apache.logging.log4j.Logger LOG = LogManager.getLogger();
JmsTemplate jmsTemplate;
@Autowired
......@@ -36,25 +35,12 @@ public class MqttPositionHandler implements Handler {
// method that handle new message from the topic
public void handle(MqttMessage message) {
try {
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 protoSensPosEvent != null;
LOG.info("SensorPositionEvent received: \n" + protoSensPosEvent);
System.out.println("SimpleSceneIntegration: Proto-Point: " + protoSensPosEvent.getPosition().getPoint().toString());
PositionEvent positionEvent = GenericSensorTransformer.posEvent_GSensor2Internal(protoSensPosEvent);
System.out.println("SimpleSceneIntegration: Internal-Point: " + positionEvent.getPlacing().getPosition().getPoint().toString());
LOG.info("SensorValueIntegration: Transformed Protobuf-SensorPositionEvent into Internal-PositionEvent: " + positionEvent.toString() + ", " + positionEvent.getPlacing().getPosition().getPoint().toString() + ", " + positionEvent.getPlacing().getOrientation().toString());
System.out.println("SensorValueIntegration: Transformed Protobuf-SensorPositionEvent into Internal-PositionEvent: " + positionEvent.toString() + ", " + positionEvent.getPlacing().getPosition().getPoint().toString() + ", " + positionEvent.getPlacing().getOrientation().toString());
/* System.out.println("Sending Internal-PositionEvent using mqttService");
if (null == mqttService)
System.out.println("SimpleSceneIntegration: mqttService is null");
else
System.out.println("SimpleSceneIntegration: mqttService is not null");
mqttService.publish("Human_at_Window_Side", positionEvent.toString(), 0, false);
*/
// ggf. anstatt JMS einfach den PositionMonitoringController per Funktionsaufruf aufrufen
PositionMonitoring.receiveMessage(positionEvent);
// this.jmsTemplate.convertAndSend("/PositionEvent", protoSensPosEvent); // submit position to the internal broker
......
......@@ -4,22 +4,18 @@ import ipos.project.DataModellntegration.SimpleSceneIntegration.SimpleSceneInteg
import ipos.project.DataModellntegration.iPos_Datamodel.*;
import ipos.project.Functionality.eventfilter.eventFilter;
import ipos.project.Functionality.eventfilter.readConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.logging.log4j.LogManager;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
import ipos.models.SimpleScene.IposPosition;
import java.lang.ref.Reference;
import java.text.ParseException;
import java.util.*;
@Component
public class PositionMonitoring {
private final Logger LOG = LoggerFactory.getLogger(getClass());
private static org.apache.logging.log4j.Logger LOG = LogManager.getLogger();
public WorldModel wm;
private static WorldModel wm;
private static List<eventFilter> eventFilters = new ArrayList<eventFilter>();
private IPos_DatamodelFactory modelFactory = IPos_DatamodelFactory.eINSTANCE;
......@@ -37,6 +33,17 @@ public class PositionMonitoring {
initEventFiltersForDemo();
}
public static LocalizableObject getLObjectByIdOrNull(String lObjectId){
for (Agent agent : wm.getAgent()){
for (LocalizableObject lObject : agent.getLObject()){
if (lObject.getId().equals(lObjectId)){
return lObject;
}
}
}
return null;
}
private void initEventFiltersForDemo(){
String taskIdWindow = "Human_at_Window_Side";
String taskIdDoor = "Human_at_Door_Side";
......@@ -176,8 +183,7 @@ public class PositionMonitoring {
// @JmsListener(destination = "/PositionEvent", containerFactory = "jmsListenFactory")
public static void receiveMessage(PositionEvent posEvent) {
// LOG.info("Received <" + posEvent + ">");
System.out.println("MonitoringController: Received <" + posEvent.toString() + ">");
LOG.info("Received <" + posEvent + ">");
String taskIdWindow = "Human_at_Window_Side";
String taskIdDoor = "Human_at_Door_Side";
float y_coordinate = ((Point3D) posEvent.getPlacing().getPosition().getPoint()).getY();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment