diff --git a/pom.xml b/pom.xml index bbd4063..794c537 100644 --- a/pom.xml +++ b/pom.xml @@ -5,17 +5,19 @@ com.ivanfm ivanfm-traccar-mqtt jar - 2.2.3 + 2.2.7 ivanfm-traccar-mqtt http://maven.apache.org UTF-8 - 1.7.26 - 4.13.1 + 1.7.31 + 4.13.2 1.7 - 3.5.1 - 1.2.1 + 1.2.5 + 4.15-ifm + + 3.8.1 @@ -34,12 +36,14 @@ maven-assembly-plugin - 2.6 + 3.2.0 jar-with-dependencies + ${project.artifactId}-${project.version}-traccar-${traccar.version} + @@ -93,7 +97,7 @@ org.traccar traccar - 4.5-SNAPSHOT + ${traccar.version} provided diff --git a/src/main/java/com/ivanfm/mqtt/MQTTPublisher.java b/src/main/java/com/ivanfm/mqtt/MQTTPublisher.java index b066244..1b89764 100644 --- a/src/main/java/com/ivanfm/mqtt/MQTTPublisher.java +++ b/src/main/java/com/ivanfm/mqtt/MQTTPublisher.java @@ -86,6 +86,10 @@ public void messageArrived(String arg0, MqttMessage arg1) throws Exception { + public void publish(String topic, String msg) { + publishOnRoot(rootTopic + topic, msg.getBytes(), AT_LEAST_ONCE, false); + } + public void publish(String topic, byte[] msg) { publishOnRoot(rootTopic + topic, msg, AT_LEAST_ONCE, false); } diff --git a/src/main/java/com/ivanfm/traccar/mqtt/MQTTHandler.java b/src/main/java/com/ivanfm/traccar/mqtt/MQTTHandler.java index fbbc373..d6280bd 100644 --- a/src/main/java/com/ivanfm/traccar/mqtt/MQTTHandler.java +++ b/src/main/java/com/ivanfm/traccar/mqtt/MQTTHandler.java @@ -27,7 +27,7 @@ private synchronized MQTTPublisher getPublisher() { config.getString("mqtt.clientid", "traccar.mqtt.handler"), config.getString("mqtt.topicRoot", "/traccar/")); - globalPublisher.publish("start", (new Date()).toString().getBytes()); + globalPublisher.publish("start", (new Date()).toString()); } catch (Exception e) { log.error("", e); } diff --git a/src/main/java/com/ivanfm/traccar/mqtt/ProcessPosition.java b/src/main/java/com/ivanfm/traccar/mqtt/ProcessPosition.java index 18df83c..e945ac4 100644 --- a/src/main/java/com/ivanfm/traccar/mqtt/ProcessPosition.java +++ b/src/main/java/com/ivanfm/traccar/mqtt/ProcessPosition.java @@ -13,6 +13,7 @@ import java.util.TimeZone; import org.apache.commons.lang.StringUtils; +import org.apache.velocity.exception.ResourceNotFoundException; import org.apache.velocity.VelocityContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,6 +28,8 @@ import org.traccar.model.Position; import org.traccar.model.User; import org.traccar.notification.NotificationFormatter; +import org.traccar.notification.NotificationMessage; +import org.traccar.notification.TextTemplateFormatter; import com.ivanfm.mqtt.MQTTPublisher; @@ -56,11 +59,11 @@ public ProcessPosition(MQTTPublisher publisher, Position position) { final Set users = dm.getUserItems(device.getId()); user = Context.getPermissionsManager().getUser( users.isEmpty() ? 1 : users.iterator().next() ); - devAlias = nameCleanUp(dm.lookupAttributeString(position.getDeviceId(), "mqtt.alias", device.getName(), false)); + devAlias = nameCleanUp(dm.lookupAttributeString(position.getDeviceId(), "mqtt.alias", device.getName(), true, false)); // Current configuration should use alarmTopics instead of alarmTopic - alarmTopics = splitTopics(dm.lookupAttributeString(position.getDeviceId(), "mqtt.alarmTopics", dm.lookupAttributeString(position.getDeviceId(), "mqtt.alarmTopic", "", true), true)); + alarmTopics = splitTopics(dm.lookupAttributeString(position.getDeviceId(), "mqtt.alarmTopics", dm.lookupAttributeString(position.getDeviceId(), "mqtt.alarmTopic", "", true, true), true, true)); - event = new Event("MQTTX", position.getDeviceId(), position.getId()); + event = new Event("MQTTX", position); } @@ -83,18 +86,18 @@ private static List splitTopics(String topics) { } void publish(String path, String value) { - publisher.publish("device/" + devAlias + "/" + path , value.getBytes()); + publisher.publish("device/" + devAlias + "/" + path , value); } private void publishIfNotBlank(String path, String value) { if (StringUtils.isNotBlank(value)) { - publisher.publish("device/" + devAlias + "/" + path , value.getBytes()); + publisher.publish("device/" + devAlias + "/" + path , value); } } private void publishIfNotZero(String path, long value) { if (value > 0) { - publisher.publish("device/" + devAlias + "/" + path , Long.toString(value).getBytes()); + publisher.publish("device/" + devAlias + "/" + path , Long.toString(value)); } } @@ -108,7 +111,7 @@ private void publishIfNotNull(String path, Object value) { void publish() { final Map attrs = position.getAttributes(); - if (dm.lookupAttributeBoolean(device.getId(), "mqtt.position.process.enabled", true, true)) { + if (dm.lookupAttributeBoolean(device.getId(), "mqtt.position.process.enabled", true, true, true)) { final SimpleDateFormat ISO_8601_Z = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); ISO_8601_Z.setTimeZone(TimeZone.getTimeZone("UTC")); /** @@ -139,7 +142,7 @@ void publish() { processGeofences(); } - if (dm.lookupAttributeBoolean(device.getId(), "mqtt.position.process.alarms.enabled", true, true)) { + if (dm.lookupAttributeBoolean(device.getId(), "mqtt.position.process.alarms.enabled", true, true, true)) { if (!alarmTopics.isEmpty()) { publishAlarm(attrs); } @@ -153,8 +156,8 @@ private void processGeofences() { final String geofenceAlias = nameCleanUp(g.getName()); final GeofenceGeometry geometry = g.getGeometry(); // if running with the changes to support accuracy in geometry use this line -// final boolean inside = geometry.containsPoint(position.getLatitude(), position.getLongitude(), position.getAccuracy()); - final boolean inside = geometry.containsPoint(position.getLatitude(), position.getLongitude()); + final boolean inside = geometry.containsPoint(position.getLatitude(), position.getLongitude(), position.getAccuracy()); +// final boolean inside = geometry.containsPoint(position.getLatitude(), position.getLongitude()); stateChanged = processGeofence(g, geofenceAlias, inside) || stateChanged; } if (stateChanged) { @@ -167,7 +170,7 @@ private void processGeofences() { } private boolean processGeofence(Geofence geofence, String geofenceAlias, boolean inside) { - final String topicsSt = dm.lookupAttributeString(position.getDeviceId(), "mqtt.geofence." + geofenceAlias + ".topics", "", false); + final String topicsSt = dm.lookupAttributeString(position.getDeviceId(), "mqtt.geofence." + geofenceAlias + ".topics", "", true, false); final List topics = splitTopics(topicsSt); final String insideSt = inside ? "1" : "0"; @@ -181,7 +184,8 @@ private boolean processGeofence(Geofence geofence, String geofenceAlias, boolean if (!insideSt.equalsIgnoreCase(prevInside)) { device.set(insideKey, insideSt); for (String topic : topics) { - final VelocityContext velocityContext = prepareContext(); + try { + final VelocityContext velocityContext = prepareContext(); velocityContext.put("geofence", geofence); velocityContext.put("areaName", geofence.getName()); velocityContext.put("in_out", inside ? "IN" : "OUT"); @@ -190,6 +194,9 @@ private boolean processGeofence(Geofence geofence, String geofenceAlias, boolean publisher.publishOnRoot(topic, format(velocityContext, "mqtt-moved/").getBytes(), MQTTPublisher.AT_LEAST_ONCE, false); + } catch (org.apache.velocity.exception.ResourceNotFoundException e) { + log.debug("{}", e.getMessage()); + } } return true; } else { @@ -215,12 +222,16 @@ public void publishAlarm(final Map attrs) { if (alarm.length() > 0) { if (!"tracker".equalsIgnoreCase(alarm) && !"et".equalsIgnoreCase(alarm)) { - final VelocityContext velocityContext = prepareContext(); + try { + final VelocityContext velocityContext = prepareContext(); - for (String alarmTopic : alarmTopics) { - publisher.publishOnRoot(alarmTopic, + for (String alarmTopic : alarmTopics) { + publisher.publishOnRoot(alarmTopic, format(velocityContext, "mqtt-alarm/").getBytes(), MQTTPublisher.AT_LEAST_ONCE, false); + } + } catch (ResourceNotFoundException e) { + log.debug("{}", e.getMessage()); } } } @@ -234,9 +245,8 @@ VelocityContext prepareContext() { } String format(VelocityContext velocityContext, String path) { - final StringWriter writer = new StringWriter(); - NotificationFormatter.getTemplate(event, path).merge(velocityContext, writer); - return writer.toString(); + NotificationMessage message = TextTemplateFormatter.formatMessage(velocityContext, event.getType(), path); + return message.getBody(); }