aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/org/traccar/protocol/Jt600ProtocolDecoder.java63
-rw-r--r--test/org/traccar/protocol/Jt600ProtocolDecoderTest.java3
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())));