aboutsummaryrefslogtreecommitdiff
path: root/src/org/traccar
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2015-06-28 11:03:08 +1200
committerAnton Tananaev <anton.tananaev@gmail.com>2015-06-28 11:03:08 +1200
commit7927d2d8adb41605127af47060626f3f752a4f07 (patch)
treefe36b8264abbccbdf9c11d17eb5551e629c95597 /src/org/traccar
parent8ee694af98493830380e5faf96d43752002ca634 (diff)
downloadtrackermap-server-7927d2d8adb41605127af47060626f3f752a4f07.tar.gz
trackermap-server-7927d2d8adb41605127af47060626f3f752a4f07.tar.bz2
trackermap-server-7927d2d8adb41605127af47060626f3f752a4f07.zip
Add MXT extra data decoding
Diffstat (limited to 'src/org/traccar')
-rw-r--r--src/org/traccar/helper/BitUtil.java8
-rw-r--r--src/org/traccar/protocol/MxtProtocolDecoder.java63
2 files changed, 62 insertions, 9 deletions
diff --git a/src/org/traccar/helper/BitUtil.java b/src/org/traccar/helper/BitUtil.java
index 6e03e6d2a..193b12cda 100644
--- a/src/org/traccar/helper/BitUtil.java
+++ b/src/org/traccar/helper/BitUtil.java
@@ -24,10 +24,18 @@ public class BitUtil {
return (number & (1 << index)) != 0;
}
+ public static int range(int number, int index) {
+ return (number >> index);
+ }
+
public static int range(int number, int index, int length) {
return (number >> index) & ((1 << length) - 1);
}
+ public static long range(long number, int index) {
+ return (number >> index);
+ }
+
public static long range(long number, int index, int length) {
return (number >> index) & ((1l << length) - 1);
}
diff --git a/src/org/traccar/protocol/MxtProtocolDecoder.java b/src/org/traccar/protocol/MxtProtocolDecoder.java
index ca3013db6..32aa5a4ba 100644
--- a/src/org/traccar/protocol/MxtProtocolDecoder.java
+++ b/src/org/traccar/protocol/MxtProtocolDecoder.java
@@ -15,19 +15,18 @@
*/
package org.traccar.protocol;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.traccar.BaseProtocolDecoder;
-import org.traccar.helper.ChannelBufferTools;
+import org.traccar.helper.BitUtil;
import org.traccar.helper.UnitsConverter;
import org.traccar.model.Event;
import org.traccar.model.Position;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.TimeZone;
-
public class MxtProtocolDecoder extends BaseProtocolDecoder {
public MxtProtocolDecoder(String protocol) {
@@ -74,10 +73,10 @@ public class MxtProtocolDecoder extends BaseProtocolDecoder {
long date = buf.readUnsignedInt();
- long days = date >> (5 + 6 + 6);
- long hours = (date >> (6 + 6)) & 0x1f;
- long minutes = (date >> 6) & 0x3f;
- long seconds = date & 0x3f;
+ long days = BitUtil.range(date, 6 + 6 + 5);
+ long hours = BitUtil.range(date, 6 + 6, 5);
+ long minutes = BitUtil.range(date, 6, 6);
+ long seconds = BitUtil.range(date, 0, 6);
long millis = time.getTimeInMillis();
millis += (((days * 24 + hours) * 60 + minutes) * 60 + seconds) * 1000;
@@ -90,10 +89,56 @@ public class MxtProtocolDecoder extends BaseProtocolDecoder {
position.setLongitude(buf.readInt() / 1000000.0);
long flags = buf.readUnsignedInt();
+ position.set(Event.KEY_IGNITION, BitUtil.check(flags, 0));
+ position.set(Event.KEY_ALARM, BitUtil.check(flags, 1));
+ position.set(Event.KEY_INPUT, BitUtil.range(flags, 2, 5));
+ position.set(Event.KEY_OUTPUT, BitUtil.range(flags, 7, 3));
+ position.setCourse(BitUtil.range(flags, 10, 3) * 45);
+ //position.setValid(BitUtil.check(flags, 15));
+ position.set(Event.KEY_CHARGE, BitUtil.check(flags, 20));
position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte()));
int inputMask = buf.readUnsignedByte();
+
+ if (BitUtil.check(infoGroups, 0)) {
+ buf.skipBytes(8); // waypoints
+ }
+
+ if (BitUtil.check(infoGroups, 1)) {
+ buf.skipBytes(8); // wireless accessory
+ }
+
+ if (BitUtil.check(infoGroups, 2)) {
+ position.set(Event.KEY_SATELLITES, buf.readUnsignedByte());
+ position.set(Event.KEY_HDOP, buf.readUnsignedByte());
+ buf.readUnsignedByte(); // GPS accuracy
+ position.set(Event.KEY_GSM, buf.readUnsignedByte());
+ buf.readUnsignedShort(); // time since boot
+ buf.readUnsignedByte(); // input voltage
+ position.set(Event.PREFIX_TEMP + 1, buf.readByte());
+ }
+
+ if (BitUtil.check(infoGroups, 3)) {
+ position.set(Event.KEY_ODOMETER, buf.readUnsignedInt());
+ }
+
+ if (BitUtil.check(infoGroups, 4)) {
+ buf.readUnsignedInt(); // hours
+ }
+
+ if (BitUtil.check(infoGroups, 5)) {
+ buf.readUnsignedInt(); // reason
+ }
+
+ if (BitUtil.check(infoGroups, 6)) {
+ position.set(Event.KEY_POWER, buf.readUnsignedShort() * 0.001);
+ position.set(Event.KEY_BATTERY, buf.readUnsignedShort());
+ }
+
+ if (BitUtil.check(infoGroups, 7)) {
+ position.set(Event.KEY_RFID, buf.readUnsignedInt());
+ }
return position;
}