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();
}