aboutsummaryrefslogtreecommitdiff
path: root/src/org/traccar/protocol/MxtProtocolDecoder.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/traccar/protocol/MxtProtocolDecoder.java')
-rw-r--r--src/org/traccar/protocol/MxtProtocolDecoder.java96
1 files changed, 53 insertions, 43 deletions
diff --git a/src/org/traccar/protocol/MxtProtocolDecoder.java b/src/org/traccar/protocol/MxtProtocolDecoder.java
index 014033be4..07a5737c0 100644
--- a/src/org/traccar/protocol/MxtProtocolDecoder.java
+++ b/src/org/traccar/protocol/MxtProtocolDecoder.java
@@ -24,7 +24,9 @@ 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 {
@@ -32,6 +34,10 @@ public class MxtProtocolDecoder extends BaseProtocolDecoder {
super(protocol);
}
+ private static final int MSG_ACK = 0x02;
+ private static final int MSG_NACK = 0x03;
+ private static final int MSG_POSITION = 0x31;
+
@Override
protected Object decode(
ChannelHandlerContext ctx, Channel channel, Object msg)
@@ -39,54 +45,58 @@ public class MxtProtocolDecoder extends BaseProtocolDecoder {
ChannelBuffer buf = (ChannelBuffer) msg;
- /*buf.readByte(); // header
- buf.readUnsignedByte(); // version
- buf.readUnsignedByte(); // type
-
- // Create new position
- Position position = new Position();
- position.setProtocol(getProtocol());
+ buf.readUnsignedByte(); // start
+ buf.readUnsignedByte(); // device descriptor
+ int type = buf.readUnsignedByte();
- // Get device id
- String imei = ChannelBufferTools.readHexString(buf, 16).substring(1);
- if (!identify(imei)) {
+ String id = String.valueOf(buf.readUnsignedInt());
+ if (!identify(id)) {
return null;
}
- position.setDeviceId(getDeviceId());
-
- // Time
- long seconds = buf.readUnsignedInt() & 0x7fffffffl;
- seconds += 946684800l; // 2000-01-01 00:00
- position.setTime(new Date(seconds * 1000));
-
- boolean hasLocation = false;
-
- while (buf.readableBytes() > 3) {
-
- short type = buf.readUnsignedByte();
- short length = buf.readUnsignedByte();
-
- switch (type) {
-
- case DATA_GPS:
- hasLocation = true;
- position.setValid(true);
- position.setLatitude(buf.readInt() / 1000000.0);
- position.setLongitude(buf.readInt() / 1000000.0);
- position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedShort()));
- position.setCourse(buf.readUnsignedShort());
- position.set(Event.KEY_HDOP, buf.readUnsignedShort());
- break;
-
- default:
- buf.skipBytes(length);
- break;
- }
- }
- if (hasLocation) {
+ if (type == MSG_POSITION) {
+
+ Position position = new Position();
+ position.setProtocol(getProtocol());
+ position.setDeviceId(getDeviceId());
+
+ buf.readUnsignedByte(); // protocol
+ int infoGroups = buf.readUnsignedByte();
+
+ position.set(Event.KEY_INDEX, buf.readUnsignedShort());
+
+ // Date and time
+ Calendar time = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ time.clear();
+ time.set(Calendar.YEAR, 2000);
+ time.set(Calendar.MONTH, 0);
+ time.set(Calendar.DAY_OF_MONTH, 1);
+
+ 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 millis = time.getTimeInMillis();
+ millis += (((days * 24 + hours) * 60 + minutes) * 60 + seconds) * 1000;
+
+ position.setTime(new Date(millis));
+
+ // Location
+ position.setLatitude(buf.readInt() / 1000000.0);
+ position.setLongitude(buf.readInt() / 1000000.0);
+
+ long flags = buf.readUnsignedInt();
+
+ position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte()));
+
+ int inputMask = buf.readUnsignedByte();
+
return position;
- }*/
+ }
+
return null;
}