From 7927d2d8adb41605127af47060626f3f752a4f07 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 28 Jun 2015 11:03:08 +1200 Subject: Add MXT extra data decoding --- src/org/traccar/helper/BitUtil.java | 8 +++ src/org/traccar/protocol/MxtProtocolDecoder.java | 63 ++++++++++++++++++++---- 2 files changed, 62 insertions(+), 9 deletions(-) (limited to 'src/org/traccar') 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; } -- cgit v1.2.3