From 0d2428ff629728822adf5839a312a5ad3896e5e4 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 10 Aug 2013 23:59:42 +1200 Subject: Update jt600 decoder --- src/org/traccar/protocol/Jt600ProtocolDecoder.java | 63 ++++++++++++++-------- .../traccar/protocol/Jt600ProtocolDecoderTest.java | 3 ++ 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/src/org/traccar/protocol/Jt600ProtocolDecoder.java b/src/org/traccar/protocol/Jt600ProtocolDecoder.java index 86711a644..f7eccbfb5 100644 --- a/src/org/traccar/protocol/Jt600ProtocolDecoder.java +++ b/src/org/traccar/protocol/Jt600ProtocolDecoder.java @@ -27,6 +27,7 @@ import org.traccar.BaseProtocolDecoder; import org.traccar.ServerManager; import org.traccar.helper.ChannelBufferTools; import org.traccar.helper.Log; +import org.traccar.model.ExtendedInfoFormatter; import org.traccar.model.Position; public class Jt600ProtocolDecoder extends BaseProtocolDecoder { @@ -38,6 +39,7 @@ public class Jt600ProtocolDecoder extends BaseProtocolDecoder { private Position decodeNormalMessage(ChannelBuffer buf) throws Exception { Position position = new Position(); + ExtendedInfoFormatter extendedInfo = new ExtendedInfoFormatter("jt600"); buf.readByte(); // header @@ -50,19 +52,21 @@ public class Jt600ProtocolDecoder extends BaseProtocolDecoder { //return null; } - buf.readByte(); // protocol version + data type + // Protocol and type + int version = ChannelBufferTools.readHexInteger(buf, 1); + int type = buf.readUnsignedByte() & 0xf; buf.readBytes(2); // length // Time Calendar time = Calendar.getInstance(TimeZone.getTimeZone("UTC")); time.clear(); - time.set(Calendar.DAY_OF_MONTH, ChannelBufferTools.readHexInteger(buf, 2)); - time.set(Calendar.MONTH, ChannelBufferTools.readHexInteger(buf, 2) - 1); - time.set(Calendar.YEAR, 2000 + ChannelBufferTools.readHexInteger(buf, 2)); - time.set(Calendar.HOUR, ChannelBufferTools.readHexInteger(buf, 2)); - time.set(Calendar.MINUTE, ChannelBufferTools.readHexInteger(buf, 2)); - time.set(Calendar.SECOND, ChannelBufferTools.readHexInteger(buf, 2)); + time.set(Calendar.DAY_OF_MONTH, buf.readUnsignedByte()); + time.set(Calendar.MONTH, buf.readUnsignedByte() - 1); + time.set(Calendar.YEAR, 2000 + buf.readUnsignedByte()); + time.set(Calendar.HOUR, buf.readUnsignedByte()); + time.set(Calendar.MINUTE, buf.readUnsignedByte()); + time.set(Calendar.SECOND, buf.readUnsignedByte()); position.setTime(time.getTime()); // Coordinates @@ -84,32 +88,42 @@ public class Jt600ProtocolDecoder extends BaseProtocolDecoder { position.setLongitude(longitude); // Speed - double speed = ChannelBufferTools.readHexInteger(buf, 2); - position.setSpeed(speed); + position.setSpeed((double) buf.readUnsignedByte()); // Course - double course = buf.readUnsignedByte() * 2; - position.setCourse(course); + position.setCourse(buf.readUnsignedByte() * 2.0); + + if (version == 1) { + + extendedInfo.set("satellites", buf.readUnsignedByte()); - buf.readByte(); // number of satellites + // Power + position.setPower((double) buf.readUnsignedByte()); - // Course - double power = buf.readUnsignedByte(); - position.setPower(power); + buf.readByte(); // other flags and sensors + + // Altitude + position.setAltitude((double) buf.readUnsignedShort()); - buf.readByte(); // other flags and sensors + extendedInfo.set("cell", buf.readUnsignedShort()); + extendedInfo.set("lac", buf.readUnsignedShort()); + extendedInfo.set("gsm", buf.readUnsignedByte()); - // Altitude - double altitude = buf.readUnsignedShort(); - position.setAltitude(altitude); + } else if (version == 2) { - buf.readUnsignedShort(); // cell id - buf.readUnsignedShort(); // lac + position.setAltitude(0.0); - buf.readUnsignedByte(); // gsm signal + int fuel = buf.readUnsignedByte() << 8; - buf.readUnsignedByte(); // message number + extendedInfo.set("status", buf.readUnsignedInt()); + extendedInfo.set("milage", buf.readUnsignedInt()); + fuel += buf.readUnsignedByte(); + extendedInfo.set("fuel", fuel); + + } + + position.setExtendedInfo(extendedInfo.toString()); return position; } @@ -144,6 +158,8 @@ public class Jt600ProtocolDecoder extends BaseProtocolDecoder { // Create new position Position position = new Position(); + ExtendedInfoFormatter extendedInfo = new ExtendedInfoFormatter("jt600"); + extendedInfo.set("alert", "true"); Integer index = 1; // Get device by identifier @@ -190,6 +206,7 @@ public class Jt600ProtocolDecoder extends BaseProtocolDecoder { // Power position.setPower(Double.valueOf(parser.group(index++))); + position.setExtendedInfo(extendedInfo.toString()); return position; } diff --git a/test/org/traccar/protocol/Jt600ProtocolDecoderTest.java b/test/org/traccar/protocol/Jt600ProtocolDecoderTest.java index 93b31e908..a1c090cbb 100644 --- a/test/org/traccar/protocol/Jt600ProtocolDecoderTest.java +++ b/test/org/traccar/protocol/Jt600ProtocolDecoderTest.java @@ -22,6 +22,9 @@ public class Jt600ProtocolDecoderTest { byte[] buf3 = {0x24,0x31,0x20,(byte)0x82,0x00,0x29,0x11,0x00,0x1B,0x17,0x10,0x12,0x05,0x33,0x05,0x24,0x38,0x09,(byte)0x97,0x02,0x55,0x33,0x58,0x45,0x00,0x04,0x06,0x1E,0x00,0x03,(byte)0xEE,0x00,0x00,0x00,0x00,0x0C,0x00}; assertNotNull(decoder.decode(null, null, ChannelBuffers.wrappedBuffer(buf3))); + byte[] buf4 = {0x24,0x60,(byte)0x81,0x11,(byte)0x88,(byte)0x88,0x21,0x00,0x1B,0x09,0x06,0x09,0x08,0x04,0x53,0x22,0x56,0x40,0x25,0x11,0x32,0x42,0x32,(byte)0x9F,0x05,(byte)0x98,0x00,0x00,0x01,0x00,0x3F,0x00,0x00,0x00,0x2D,0x00,(byte)0xAB}; + assertNotNull(decoder.decode(null, null, ChannelBuffers.wrappedBuffer(buf4))); + assertNotNull(decoder.decode(null, null, ChannelBuffers.copiedBuffer("(3110312099,W01,11404.6204,E,2232.9961,N,A,040511,063736,4,7,100,4,17,1,1,company)", Charset.defaultCharset()))); -- cgit v1.2.3