diff options
-rw-r--r-- | src/org/traccar/protocol/Gps103ProtocolDecoder.java | 26 | ||||
-rw-r--r-- | test/org/traccar/protocol/Gps103ProtocolDecoderTest.java | 3 |
2 files changed, 24 insertions, 5 deletions
diff --git a/src/org/traccar/protocol/Gps103ProtocolDecoder.java b/src/org/traccar/protocol/Gps103ProtocolDecoder.java index e79ae109f..8980c702f 100644 --- a/src/org/traccar/protocol/Gps103ProtocolDecoder.java +++ b/src/org/traccar/protocol/Gps103ProtocolDecoder.java @@ -45,10 +45,11 @@ public class Gps103ProtocolDecoder extends BaseProtocolDecoder { "imei:" + "(\\d+)," + // IMEI "([^,]+)," + // Alarm - "(\\d{2})(\\d{2})(\\d{2})\\d+," + // Date + "(\\d{2})(\\d{2})(\\d{2})" + // Local Date + "(\\d{2})(\\d{2})," + // Local Time "[^,]*," + "[FL]," + // F - full / L - low - "(\\d{2})(\\d{2})(\\d{2})\\.(\\d{3})," + // Time (HHMMSS.SSS) + "(\\d{2})(\\d{2})(\\d{2})\\.(\\d{3})," + // Time UTC (HHMMSS.SSS) "([AV])," + // Validity "(\\d{2})(\\d{2}\\.\\d{4})," + // Latitude (DDMM.MMMM) "([NS])," + @@ -106,19 +107,34 @@ public class Gps103ProtocolDecoder extends BaseProtocolDecoder { extendedInfo.append("<alarm>"); extendedInfo.append(parser.group(index++)); extendedInfo.append("</alarm>"); - + // Date Calendar time = Calendar.getInstance(TimeZone.getTimeZone("UTC")); time.clear(); time.set(Calendar.YEAR, 2000 + Integer.valueOf(parser.group(index++))); time.set(Calendar.MONTH, Integer.valueOf(parser.group(index++)) - 1); time.set(Calendar.DAY_OF_MONTH, Integer.valueOf(parser.group(index++))); + + int localHours = Integer.valueOf(parser.group(index++)); + int localMinutes = Integer.valueOf(parser.group(index++)); + + int utcHours = Integer.valueOf(parser.group(index++)); + int utcMinutes = Integer.valueOf(parser.group(index++)); // Time - time.set(Calendar.HOUR, Integer.valueOf(parser.group(index++))); - time.set(Calendar.MINUTE, Integer.valueOf(parser.group(index++))); + time.set(Calendar.HOUR, localHours); + time.set(Calendar.MINUTE, localMinutes); time.set(Calendar.SECOND, Integer.valueOf(parser.group(index++))); time.set(Calendar.MILLISECOND, Integer.valueOf(parser.group(index++))); + + // Timezone calculation + int deltaMinutes = (localHours - utcHours) * 60 + localMinutes - utcMinutes; + if (deltaMinutes <= -12 * 60) { + deltaMinutes += 24 * 60; + } else if (deltaMinutes > 12) { + deltaMinutes -= 24 * 60; + } + time.add(Calendar.MINUTE, deltaMinutes); position.setTime(time.getTime()); // Validity diff --git a/test/org/traccar/protocol/Gps103ProtocolDecoderTest.java b/test/org/traccar/protocol/Gps103ProtocolDecoderTest.java index 9c294d657..24289822a 100644 --- a/test/org/traccar/protocol/Gps103ProtocolDecoderTest.java +++ b/test/org/traccar/protocol/Gps103ProtocolDecoderTest.java @@ -20,6 +20,9 @@ public class Gps103ProtocolDecoderTest { // No GPS signal //assertNull(decoder.decode(null, null, "imei:359586015829802,tracker,000000000,13554900601,L,;")); + + assertNotNull(decoder.decode(null, null, + "imei:353451047570260,tracker,1302110948,,F,144807.000,A,0805.6615,S,07859.9763,W,0.00,,")); assertNotNull(decoder.decode(null, null, "imei:359587016817564,tracker,1301251602,,F,080251.000,A,3223.5832,N,11058.9449,W,0.03,")); |