aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/org/traccar/protocol/GlobalSatProtocolDecoder.java114
-rw-r--r--test/org/traccar/protocol/GlobalSatProtocolDecoderTest.java10
2 files changed, 112 insertions, 12 deletions
diff --git a/src/org/traccar/protocol/GlobalSatProtocolDecoder.java b/src/org/traccar/protocol/GlobalSatProtocolDecoder.java
index ee94158be..2cef212d1 100644
--- a/src/org/traccar/protocol/GlobalSatProtocolDecoder.java
+++ b/src/org/traccar/protocol/GlobalSatProtocolDecoder.java
@@ -15,7 +15,6 @@
*/
package org.traccar.protocol;
-import java.sql.ResultSet;
import java.util.Calendar;
import java.util.Properties;
import java.util.TimeZone;
@@ -25,9 +24,7 @@ import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.traccar.BaseProtocolDecoder;
import org.traccar.ServerManager;
-import org.traccar.helper.AdvancedConnection;
import org.traccar.helper.Log;
-import org.traccar.helper.NamedParameterStatement;
import org.traccar.model.ExtendedInfoFormatter;
import org.traccar.model.Position;
@@ -52,14 +49,9 @@ public class GlobalSatProtocolDecoder extends BaseProtocolDecoder {
}
}
}
+
+ private Position decodeOriginal(Channel channel, String sentence) {
- @Override
- protected Object decode(
- ChannelHandlerContext ctx, Channel channel, Object msg)
- throws Exception {
-
- String sentence = (String) msg;
-
// Send acknowledgement
if (channel != null) {
channel.write("ACK\r");
@@ -181,5 +173,107 @@ public class GlobalSatProtocolDecoder extends BaseProtocolDecoder {
position.setExtendedInfo(extendedInfo.toString());
return position;
}
+
+ static private Pattern pattern = Pattern.compile(
+ "\\$" +
+ "(\\d+)," + // IMEI
+ "\\d+," + // mode
+ "(\\d)," + // Fix
+ "(\\d{2})(\\d{2})(\\d{2})," + // Date (DDMMYY)
+ "(\\d{2})(\\d{2})(\\d{2})," + // Time (HHMMSS)
+ "([EW])" +
+ "(\\d{3})(\\d{2}\\.\\d+)," + // Longitude (DDDMM.MMMM)
+ "([NS])" +
+ "(\\d{2})(\\d{2}\\.\\d+)," + // Latitude (DDMM.MMMM)
+ "(\\d+\\.?\\d*)," + // Altitude
+ "(\\d+\\.?\\d*)," + // Speed
+ "(\\d+)," + // Course
+ "(\\d+)," + // Satellites
+ "(\\d+\\.?\\d*)"); // HDOP
+
+ private Position decodeAlternative(Channel channel, String sentence) {
+
+ // Parse message
+ Matcher parser = pattern.matcher(sentence);
+ if (!parser.matches()) {
+ return null;
+ }
+
+ // Create new position
+ Position position = new Position();
+ ExtendedInfoFormatter extendedInfo = new ExtendedInfoFormatter("globalsat");
+ Integer index = 1;
+
+ // Identification
+ String imei = parser.group(index++);
+ try {
+ position.setDeviceId(getDataManager().getDeviceByImei(imei).getId());
+ } catch(Exception error) {
+ Log.warning("Unknown device - " + imei);
+ return null;
+ }
+
+ // Validity
+ position.setValid(parser.group(index++).compareTo("1") != 0 ? true : false);
+
+ // Time
+ Calendar time = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ time.clear();
+ time.set(Calendar.DAY_OF_MONTH, Integer.valueOf(parser.group(index++)));
+ time.set(Calendar.MONTH, Integer.valueOf(parser.group(index++)) - 1);
+ time.set(Calendar.YEAR, 2000 + Integer.valueOf(parser.group(index++)));
+ time.set(Calendar.HOUR, Integer.valueOf(parser.group(index++)));
+ time.set(Calendar.MINUTE, Integer.valueOf(parser.group(index++)));
+ time.set(Calendar.SECOND, Integer.valueOf(parser.group(index++)));
+ position.setTime(time.getTime());
+
+ // Longitude
+ String hemisphere = parser.group(index++);
+ Double lonlitude = Double.valueOf(parser.group(index++));
+ lonlitude += Double.valueOf(parser.group(index++)) / 60;
+ if (hemisphere.compareTo("W") == 0) lonlitude = -lonlitude;
+ position.setLongitude(lonlitude);
+
+ // Latitude
+ hemisphere = parser.group(index++);
+ Double latitude = Double.valueOf(parser.group(index++));
+ latitude += Double.valueOf(parser.group(index++)) / 60;
+ if (hemisphere.compareTo("S") == 0) latitude = -latitude;
+ position.setLatitude(latitude);
+
+ // Altitude
+ position.setAltitude(Double.valueOf(parser.group(index++)));
+
+ // Speed
+ position.setSpeed(Double.valueOf(parser.group(index++)));
+
+ // Course
+ position.setCourse(Double.valueOf(parser.group(index++)));
+
+ // Satellites
+ extendedInfo.set("satellites", Integer.valueOf(parser.group(index++)));
+
+ // HDOP
+ extendedInfo.set("hdop", parser.group(index++));
+
+ position.setExtendedInfo(extendedInfo.toString());
+ return position;
+ }
+
+ @Override
+ protected Object decode(
+ ChannelHandlerContext ctx, Channel channel, Object msg)
+ throws Exception {
+
+ String sentence = (String) msg;
+
+ if (sentence.startsWith("GS")) {
+ return decodeOriginal(channel, sentence);
+ } else if (sentence.startsWith("$")) {
+ return decodeAlternative(channel, sentence);
+ }
+
+ return null;
+ }
}
diff --git a/test/org/traccar/protocol/GlobalSatProtocolDecoderTest.java b/test/org/traccar/protocol/GlobalSatProtocolDecoderTest.java
index 6025560b0..664021ef7 100644
--- a/test/org/traccar/protocol/GlobalSatProtocolDecoderTest.java
+++ b/test/org/traccar/protocol/GlobalSatProtocolDecoderTest.java
@@ -12,11 +12,17 @@ public class GlobalSatProtocolDecoderTest {
GlobalSatProtocolDecoder decoder = new GlobalSatProtocolDecoder(null);
decoder.setDataManager(new TestDataManager());
- //assertNull(decoder.decode(null, null, "GSh,131826789036289,3,M,ea04*3d!"));
+ assertNull(decoder.decode(null, null, "GSh,131826789036289,3,M,ea04*3d"));
//TSPRXAB27GHKLMnaicz
assertNotNull(decoder.decode(null, null,
- "GSr,1,135785412249986,01,I,EA02,3,230410,153318,E12129.2839,N2459.8570,0,1.17,212,8,1.0,12.3V*55!"));
+ "GSr,1,135785412249986,01,I,EA02,3,230410,153318,E12129.2839,N2459.8570,0,1.17,212,8,1.0,12.3V*55"));
+
+ assertNotNull(decoder.decode(null, null,
+ "$355632004245866,1,1,040202,093633,E12129.2252,N2459.8891,00161,0.0100,147,07,2.4"));
+
+ assertNotNull(decoder.decode(null, null,
+ "$355632000959420,9,3,160413,230536,E03738.4906,N5546.3148,00000,0.3870,147,07,2.4"));
}