aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/org/traccar/protocol/OwnTracksProtocolDecoder.java155
1 files changed, 134 insertions, 21 deletions
diff --git a/src/org/traccar/protocol/OwnTracksProtocolDecoder.java b/src/org/traccar/protocol/OwnTracksProtocolDecoder.java
index f38c8ef25..4ce880316 100644
--- a/src/org/traccar/protocol/OwnTracksProtocolDecoder.java
+++ b/src/org/traccar/protocol/OwnTracksProtocolDecoder.java
@@ -46,12 +46,51 @@ public class OwnTracksProtocolDecoder extends BaseHttpProtocolDecoder {
JsonObject root = Json.createReader(
new StringReader(request.content().toString(StandardCharsets.US_ASCII))).readObject();
- if (!root.containsKey("_type") || !root.getString("_type").equals("location")) {
+ if (!root.containsKey("_type")) {
sendResponse(channel, HttpResponseStatus.OK);
return null;
}
+ if (!root.getString("_type").equals("location")
+ && !root.getString("_type").equals("lwt")) {
+ sendResponse(channel, HttpResponseStatus.BAD_REQUEST);
+ return null;
+ }
+
+ Position position = new Position();
+ String uniqueId;
+
+ if (root.containsKey("topic")) {
+ uniqueId = root.getString("topic");
+ if (root.containsKey("tid")) {
+ position.set("tid", root.getString("tid"));
+ }
+ } else {
+ uniqueId = root.getString("tid");
+ }
+ DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, uniqueId);
+ if (deviceSession == null) {
+ sendResponse(channel, HttpResponseStatus.BAD_REQUEST);
+ return null;
+ }
+
+ if (root.getString("_type").equals("lwt")) {
+ sendResponse(channel, HttpResponseStatus.OK);
+ return null;
+ }
+
+ if (root.containsKey("t") && root.getString("t").equals("p")) {
+ sendResponse(channel, HttpResponseStatus.OK);
+ return null;
+ }
+
+ position.setDeviceId(deviceSession.getDeviceId());
+ position.setProtocol(getProtocolName());
+
+ position.setTime(new Date(root.getJsonNumber("tst").longValue() * 1000));
+ if (root.containsKey("sent")) {
+ position.setDeviceTime(new Date(root.getJsonNumber("sent").longValue() * 1000));
+ }
- Position position = new Position(getProtocolName());
position.setValid(true);
position.setLatitude(root.getJsonNumber("lat").doubleValue());
@@ -70,34 +109,108 @@ public class OwnTracksProtocolDecoder extends BaseHttpProtocolDecoder {
position.setAccuracy(root.getInt("acc"));
}
if (root.containsKey("t")) {
- position.set("t", root.getString("t"));
+ String trigger = root.getString("t");
+ position.set("t", trigger);
+ Integer reportType = -1;
+ if (root.containsKey("rty")) {
+ reportType = root.getInt("rty");
+ }
+ setEventOrAlarm(position, trigger, reportType);
}
if (root.containsKey("batt")) {
- position.set(Position.KEY_BATTERY, root.getInt("batt"));
+ position.set(Position.KEY_BATTERY_LEVEL, root.getInt("batt"));
}
-
- position.setTime(new Date(root.getJsonNumber("tst").longValue() * 1000));
-
- String uniqueId;
-
- if (root.containsKey("topic")) {
- uniqueId = root.getString("topic");
- if (root.containsKey("tid")) {
- position.set("tid", root.getString("tid"));
- }
- } else {
- uniqueId = root.getString("tid");
+ if (root.containsKey("uext")) {
+ position.set(Position.KEY_POWER, root.getJsonNumber("uext").doubleValue());
+ }
+ if (root.containsKey("ubatt")) {
+ position.set(Position.KEY_BATTERY, root.getJsonNumber("ubatt").doubleValue());
+ }
+ if (root.containsKey("vin")) {
+ position.set(Position.KEY_VIN, root.getString("vin"));
+ }
+ if (root.containsKey("name")) {
+ position.set(Position.KEY_VIN, root.getString("name"));
+ }
+ if (root.containsKey("rpm")) {
+ position.set(Position.KEY_RPM, root.getInt("rpm"));
+ }
+ if (root.containsKey("ign")) {
+ position.set(Position.KEY_IGNITION, root.getBoolean("ign"));
+ }
+ if (root.containsKey("motion")) {
+ position.set(Position.KEY_MOTION, root.getBoolean("motion"));
+ }
+ if (root.containsKey("odometer")) {
+ position.set(Position.KEY_ODOMETER, root.getJsonNumber("odometer").doubleValue() * 1000.0);
+ }
+ if (root.containsKey("hmc")) {
+ position.set(Position.KEY_HOURS, root.getJsonNumber("hmc").doubleValue() / 3600.0);
}
- DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, uniqueId);
- if (deviceSession == null) {
- sendResponse(channel, HttpResponseStatus.BAD_REQUEST);
- return null;
+ if (root.containsKey("anum")) {
+ Integer numberOfAnalogueInputs = root.getInt("anum");
+ for (Integer i = 0; i < numberOfAnalogueInputs; i++) {
+ String indexString = String.format("%02d", i);
+ if (root.containsKey("adda-" + indexString)) {
+ position.set(Position.PREFIX_ADC + (i + 1), root.getString("adda-" + indexString));
+ }
+ if (root.containsKey("temp_c-" + indexString)) {
+ position.set(Position.PREFIX_TEMP + (i + 1),
+ root.getJsonNumber("temp_c-" + indexString).doubleValue());
+ }
+ }
}
- position.setDeviceId(deviceSession.getDeviceId());
sendResponse(channel, HttpResponseStatus.OK);
return position;
}
+ private void setEventOrAlarm(Position position, String trigger, Integer reportType) {
+ switch (trigger) {
+ case "9":
+ position.set(Position.KEY_ALARM, Position.ALARM_LOW_BATTERY);
+ break;
+ case "1":
+ position.set(Position.KEY_ALARM, Position.ALARM_POWER_ON);
+ break;
+ case "i":
+ position.set(Position.KEY_IGNITION, true);
+ break;
+ case "I":
+ position.set(Position.KEY_IGNITION, false);
+ break;
+ case "E":
+ position.set(Position.KEY_ALARM, Position.ALARM_POWER_RESTORED);
+ break;
+ case "e":
+ position.set(Position.KEY_ALARM, Position.ALARM_POWER_CUT);
+ break;
+ case "!":
+ position.set(Position.KEY_ALARM, Position.ALARM_TOW);
+ break;
+ case "s":
+ position.set(Position.KEY_ALARM, Position.ALARM_OVERSPEED);
+ break;
+ case "h":
+ switch (reportType) {
+ case 0:
+ case 3:
+ position.set(Position.KEY_ALARM, Position.ALARM_BRAKING);
+ break;
+ case 1:
+ case 4:
+ position.set(Position.KEY_ALARM, Position.ALARM_ACCELERATION);
+ break;
+ case 2:
+ case 5:
+ default:
+ position.set(Position.KEY_ALARM, Position.ALARM_CORNERING);
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ }
}