aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Tananaev <anton@traccar.org>2024-03-30 07:19:43 -0700
committerAnton Tananaev <anton@traccar.org>2024-03-30 07:19:43 -0700
commit9e750264dd9a1cbfbd7e1aadfdeedbcdbb5d0a0d (patch)
tree93a2306c671c0cd80c7778505efe5cdd0c9c76fb
parentade3ae3d1693e7bb3b8a50339378e683333b7774 (diff)
downloadtrackermap-server-9e750264dd9a1cbfbd7e1aadfdeedbcdbb5d0a0d.tar.gz
trackermap-server-9e750264dd9a1cbfbd7e1aadfdeedbcdbb5d0a0d.tar.bz2
trackermap-server-9e750264dd9a1cbfbd7e1aadfdeedbcdbb5d0a0d.zip
Refactor and add more models
-rw-r--r--src/main/java/org/traccar/protocol/Gl200TextProtocolDecoder.java104
-rw-r--r--src/test/java/org/traccar/protocol/Gl200TextProtocolDecoderTest.java16
2 files changed, 65 insertions, 55 deletions
diff --git a/src/main/java/org/traccar/protocol/Gl200TextProtocolDecoder.java b/src/main/java/org/traccar/protocol/Gl200TextProtocolDecoder.java
index 623352106..5ac7b2417 100644
--- a/src/main/java/org/traccar/protocol/Gl200TextProtocolDecoder.java
+++ b/src/main/java/org/traccar/protocol/Gl200TextProtocolDecoder.java
@@ -41,45 +41,52 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
import java.util.TimeZone;
-import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Gl200TextProtocolDecoder extends BaseProtocolDecoder {
- private static final HashMap<String, String> DEVICE_MODELS = new HashMap<String, String>() {{
- put("02", "GL200");
- put("04", "GV200");
- put("06", "GV300");
- put("08", "GMT100");
- put("09", "GV50P");
- put("0F", "GV55");
- put("10", "GV55 LITE");
- put("11", "GL500");
- put("1A", "GL300");
- put("1F", "GV500");
- put("25", "GV300");
- put("27", "GV300W");
- put("2C", "GL300W");
- put("2F", "GV55");
- put("30", "GL300");
- put("35", "GV200");
- put("36", "GV500");
- put("3F", "GMT100");
- put("41", "GV75W");
- put("50", "GV55W");
- put("52", "GL50");
- put("55", "GL50B");
- put("5E", "GV500MAP");
- put("6E", "GV310LAU");
- put("C2", "GV600M");
- put("F1", "GV350M");
- put("F8", "GV800W");
- put("FC", "GV600W");
- put("802004", "GV58LAU");
- put("802005", "GV355CEU");
- }};
+ private static final Map<String, String> PROTOCOL_MODELS = Map.ofEntries(
+ Map.entry("02", "GL200"),
+ Map.entry("04", "GV200"),
+ Map.entry("06", "GV300"),
+ Map.entry("08", "GMT100"),
+ Map.entry("09", "GV50P"),
+ Map.entry("0F", "GV55"),
+ Map.entry("10", "GV55 LITE"),
+ Map.entry("11", "GL500"),
+ Map.entry("1A", "GL300"),
+ Map.entry("1F", "GV500"),
+ Map.entry("25", "GV300"),
+ Map.entry("27", "GV300W"),
+ Map.entry("28", "GL300VC"),
+ Map.entry("2C", "GL300W"),
+ Map.entry("2F", "GV55"),
+ Map.entry("30", "GL300"),
+ Map.entry("31", "GV65"),
+ Map.entry("35", "GV200"),
+ Map.entry("36", "GV500"),
+ Map.entry("3F", "GMT100"),
+ Map.entry("40", "GL500"),
+ Map.entry("41", "GV75W"),
+ Map.entry("42", "GT501"),
+ Map.entry("44", "GL530"),
+ Map.entry("45", "GB100"),
+ Map.entry("50", "GV55W"),
+ Map.entry("52", "GL50"),
+ Map.entry("55", "GL50B"),
+ Map.entry("5E", "GV500MAP"),
+ Map.entry("6E", "GV310LAU"),
+ Map.entry("C2", "GV600M"),
+ Map.entry("DC", "GV600MG"),
+ Map.entry("DE", "GL500M"),
+ Map.entry("F1", "GV350M"),
+ Map.entry("F8", "GV800W"),
+ Map.entry("FC", "GV600W"),
+ Map.entry("802004", "GV58LAU"),
+ Map.entry("802005", "GV355CEU"));
private boolean ignoreFixTime;
@@ -96,15 +103,18 @@ public class Gl200TextProtocolDecoder extends BaseProtocolDecoder {
ignoreFixTime = getConfig().getBoolean(Keys.PROTOCOL_IGNORE_FIX_TIME.withPrefix(getProtocolName()));
}
- private String getDeviceModel(DeviceSession deviceSession, String value, String protocolVersion) {
- if (DEVICE_MODELS.containsKey(protocolVersion.substring(0, 2))) {
- return DEVICE_MODELS.get(protocolVersion.substring(0, 2));
+ private String getDeviceModel(DeviceSession deviceSession, String protocolVersion) {
+ String declaredModel = getDeviceModel(deviceSession);
+ if (declaredModel != null) {
+ return declaredModel.toUpperCase();
}
- if (DEVICE_MODELS.containsKey(protocolVersion.substring(0, 6))) {
- return DEVICE_MODELS.get(protocolVersion.substring(0, 6));
+ if (PROTOCOL_MODELS.containsKey(protocolVersion.substring(0, 2))) {
+ return PROTOCOL_MODELS.get(protocolVersion.substring(0, 2));
}
- String model = value.isEmpty() ? getDeviceModel(deviceSession) : value;
- return model != null ? model.toUpperCase() : "";
+ if (PROTOCOL_MODELS.containsKey(protocolVersion.substring(0, 6))) {
+ return PROTOCOL_MODELS.get(protocolVersion.substring(0, 6));
+ }
+ return "";
}
private Position initPosition(Parser parser, Channel channel, SocketAddress remoteAddress) {
@@ -162,12 +172,12 @@ public class Gl200TextProtocolDecoder extends BaseProtocolDecoder {
private static final Pattern PATTERN_INF = new PatternBuilder()
.text("+").expression("(?:RESP|BUFF):GTINF,")
- .expression("(.{6}|.{10})?,") // protocol version
+ .expression("(.{6}|.{10})?,") // protocol version
.number("(d{15}|x{14}),") // imei
.expression("(?:[0-9A-Z]{17},)?") // vin
.expression("(?:[^,]+)?,") // device name
.number("(xx),") // state
- .expression("([0-9Ff]{20})?,") // iccid
+ .expression("([0-9Ff]{20})?,") // iccid
.number("(d{1,2}),") // rssi
.number("d{1,2},")
.expression("[01]{1,2},") // external power
@@ -248,9 +258,9 @@ public class Gl200TextProtocolDecoder extends BaseProtocolDecoder {
position.set(Position.KEY_ICCID, parser.next());
position.set(Position.KEY_RSSI, parser.nextInt());
- String model = getDeviceModel(deviceSession, "", protocolVersion);
+ String model = getDeviceModel(deviceSession, protocolVersion);
if (model.equals("GV310LAU")) {
- position.set(Position.KEY_POWER, parser.nextDouble() / 1000); // odometer or external power
+ position.set(Position.KEY_POWER, parser.nextDouble() / 1000);
} else {
parser.next(); // odometer or external power
}
@@ -521,7 +531,8 @@ public class Gl200TextProtocolDecoder extends BaseProtocolDecoder {
Position position = new Position(getProtocolName());
position.setDeviceId(deviceSession.getDeviceId());
- String model = getDeviceModel(deviceSession, v[index++], protocolVersion);
+ String model = getDeviceModel(deviceSession, protocolVersion);
+ index += 1; // device name
index += 1; // report type
index += 1; // can bus state
long reportMask = Long.parseLong(v[index++], 16);
@@ -935,7 +946,8 @@ public class Gl200TextProtocolDecoder extends BaseProtocolDecoder {
return null;
}
- String model = getDeviceModel(deviceSession, v[index++], protocolVersion);
+ String model = getDeviceModel(deviceSession, protocolVersion);
+ index += 1; // device name
long mask = Long.parseLong(v[index++], 16);
Double power = v[index++].isEmpty() ? null : Integer.parseInt(v[index - 1]) * 0.001;
index += 1; // report type
diff --git a/src/test/java/org/traccar/protocol/Gl200TextProtocolDecoderTest.java b/src/test/java/org/traccar/protocol/Gl200TextProtocolDecoderTest.java
index 768704b68..bc1bee229 100644
--- a/src/test/java/org/traccar/protocol/Gl200TextProtocolDecoderTest.java
+++ b/src/test/java/org/traccar/protocol/Gl200TextProtocolDecoderTest.java
@@ -52,14 +52,14 @@ public class Gl200TextProtocolDecoderTest extends ProtocolTest {
"+RESP:GTFRI,5E0100,862061048023666,,,12940,10,1,1,0.0,97,179.8,-90.366478,38.735379,20230616183231,0310,0410,6709,03ADF710,00,6223.7,,,,,110000,,,,202306161834$"));
verifyAttribute(decoder, buffer(
- "+BUFF:GTERI,410502,864802030794634,GV75W,00000001,,10,1,1,0.0,0,3027.8,-78.706612,-0.955699,20230418170736,0740,0002,A08C,2AB72D,00,0.0,,,,100,110000,1,0099,20230418171004,8B98$"),
+ "+BUFF:GTERI,410502,864802030794634,,00000001,,10,1,1,0.0,0,3027.8,-78.706612,-0.955699,20230418170736,0740,0002,A08C,2AB72D,00,0.0,,,,100,110000,1,0099,20230418171004,8B98$"),
Position.KEY_FUEL_LEVEL, 153);
verifyPositions(decoder, false, buffer(
"+BUFF:GTFRI,2E0503,861106050005423,,,0,1,,,,,,,,,,,,0,0,,98,1,0,,,20200101000001,0083$"));
verifyAttribute(decoder, buffer(
- "+RESP:GTERI,271002,863457051562823,GV300,00000002,,10,1,1,0.0,15,28.2,-58.695253,-34.625413,20230119193305,0722,0007,1168,16B3BB,00,0.0,,,,99,210100,2,1,28F8A149F69A3C25,1,0190,20230119193314,07C7$"),
+ "+RESP:GTERI,271002,863457051562823,,00000002,,10,1,1,0.0,15,28.2,-58.695253,-34.625413,20230119193305,0722,0007,1168,16B3BB,00,0.0,,,,99,210100,2,1,28F8A149F69A3C25,1,0190,20230119193314,07C7$"),
Position.PREFIX_TEMP + 1, 25.0);
verifyAttribute(decoder, buffer(
@@ -176,7 +176,7 @@ public class Gl200TextProtocolDecoderTest extends ProtocolTest {
"+RESP:GTERI,310603,863286023345490,,00000002,,10,1,2,0.3,0,155.7,8.000000,52.000000,20171215213040,0262,0002,1450,9F13,00,1130.3,00539:27:19,,,110000,2,1,28FFD5239115034E,1,,20171215213041,27C7$"));
verifyPositions(decoder, buffer(
- "+RESP:GTERI,250C02,868789023691057,GV300,00000019,,10,1,1,0.0,196,2258.0,-99.201807,19.559242,20180214002957,0334,0003,235B,7F8D,00,6786.7,,,,100,110000,1,0394,1,4,100.0,100.0,20180214003006,C72B$"));
+ "+RESP:GTERI,250C02,868789023691057,,00000019,,10,1,1,0.0,196,2258.0,-99.201807,19.559242,20180214002957,0334,0003,235B,7F8D,00,6786.7,,,,100,110000,1,0394,1,4,100.0,100.0,20180214003006,C72B$"));
verifyAttributes(decoder, buffer(
"+RESP:GTCAN,310603,863286023335723,gv65,00,1,C03FFFFF,,0,,719601.00,,,,,,,,274.99,179.02,95.98,84761.00,,,0,,0,,,0,0.0,216,29.8,-2.155296,51.899400,20180209172714,0234,0010,53F3,8D38,00,20180211002128,E94E$"));
@@ -203,7 +203,7 @@ public class Gl200TextProtocolDecoderTest extends ProtocolTest {
"+RESP:GTOBD,360701,864251020253807,LSGTC58UX7Y067312,GV500,0,70FFFF,LSGTC58UX7Y067312,1,12309,983A8140,0,0,33,nan,,0,0,0,,10,0,,0,4.4,0,83.7,36.235142,49.967324,20170829112348,0255,0001,2760,9017,00,690.1,20170829112400,3456$"));
verifyPositions(decoder, buffer(
- "+RESP:GTERI,060502,861074023620928,GV300,00000002,27822,10,1,1,0.0,84,2870.9,-78.531796,-0.277329,20170825045344,,,,,,0.0,01138:30:24,,,83,220104,2,1,28FF2776A2150308,1,FFAD,0,20170825045348,A88C$"));
+ "+RESP:GTERI,060502,861074023620928,,00000002,27822,10,1,1,0.0,84,2870.9,-78.531796,-0.277329,20170825045344,,,,,,0.0,01138:30:24,,,83,220104,2,1,28FF2776A2150308,1,FFAD,0,20170825045348,A88C$"));
verifyAttributes(decoder, buffer(
"+RESP:GTINF,280500,A1000043D20139,GL300VC,41,,31,0,0,,,3.87,0,1,1,,,20170802150751,70,,48.0,,,20170802112145,03AC$"));
@@ -218,7 +218,7 @@ public class Gl200TextProtocolDecoderTest extends ProtocolTest {
"+RESP:GTTRI,862370030005908,1,0,99,1,0.0,354,18.5,18.821100,-34.084002,20170607152024,0655,0001,00DD,1CAE,00,0103010100,20170607172115,3E7D$"));
verifyPositions(decoder, buffer(
- "+RESP:GTERI,060800,861074023677175,GV300,00000002,12351,10,1,1,0.0,0,2862.4,-78.467273,-0.164998,20170529181717,,,,,,0.0,00259:11:50,,,0,210104,2,1,28E17436060000E2,1,015F,0,20170529181723,2824$"));
+ "+RESP:GTERI,060800,861074023677175,,00000002,12351,10,1,1,0.0,0,2862.4,-78.467273,-0.164998,20170529181717,,,,,,0.0,00259:11:50,,,0,210104,2,1,28E17436060000E2,1,015F,0,20170529181723,2824$"));
verifyPosition(decoder, buffer(
"+RESP:GTSWG,110100,358688000000158,,1,0,2.1,0,27.1,121.390717,31.164424,20110901073917,0460,0000,1878,0873,,20110901154653,0015$"));
@@ -239,7 +239,7 @@ public class Gl200TextProtocolDecoderTest extends ProtocolTest {
"+RESP:GTFRI,060228,862894020180553,,14827,10,1,1,3.4,199,409.6,-63.174466,-17.739317,20170407121823,0000,0000,0000,0000,00,15989.5,01070:43:13,13,180,0,220101,,,,20170407081824,9607$"));
verifyPositions(decoder, buffer(
- "+RESP:GTERI,060502,861074023376992,GV300,00000002,27239,10,1,1,0.2,312,183.3,-79.320820,-2.499110,20170401212005,0740,0000,EE4E,C98F,00,0.0,02114:36:35,,,90,220504,2,0,0,20170401212007,9E3D$"));
+ "+RESP:GTERI,060502,861074023376992,,00000002,27239,10,1,1,0.2,312,183.3,-79.320820,-2.499110,20170401212005,0740,0000,EE4E,C98F,00,0.0,02114:36:35,,,90,220504,2,0,0,20170401212007,9E3D$"));
verifyPositions(decoder, buffer(
"+RESP:GTFRI,060502,861074023689626,,25202,10,1,1,0.0,0,2744.1,-78.261047,0.023452,20170401211940,,,,,,0.0,00079:19:15,,,51,110000,,,,20170401212003,4DA7$"));
@@ -251,7 +251,7 @@ public class Gl200TextProtocolDecoderTest extends ProtocolTest {
"+RESP:GTERI,06020B,862170010196747,,00000000,,10,1,2,1.8,0,-2.5,117.198440,31.845219,20120802061037,0460,0000,5663,0358,00,0.0,,,,0,410000,20120802061040,0012$"));
verifyPositions(decoder, buffer(
- "+RESP:GTERI,060502,861074023692562,GV300,00000002,14197,10,1,1,0.2,220,491.8,-79.064212,-2.159754,20170401212007,0740,0000,EE49,CE25,00,0.0,01509:10:58,,,87,220104,2,0,0,20170401212010,D14D$"));
+ "+RESP:GTERI,060502,861074023692562,,00000002,14197,10,1,1,0.2,220,491.8,-79.064212,-2.159754,20170401212007,0740,0000,EE49,CE25,00,0.0,01509:10:58,,,87,220104,2,0,0,20170401212010,D14D$"));
verifyPositions(decoder, buffer(
"+RESP:GTFRI,210102,354524044925825,,1,1,1,29,2.8,0,133.7,-90.203063,32.265473,20170318005208,,,,,10800,4,20170318005208,0002$"));
@@ -498,8 +498,6 @@ public class Gl200TextProtocolDecoderTest extends ProtocolTest {
"+RESP:GTINF,6E0202,868589060187625,RA82,11,89883030000091225018,41,0,1,12349,,4.15,0,1,0,0,20240328231013,0,0,0,0,00,00,+0000,0,20240328231015,7D4F"),
Position.PREFIX_ADC + 3, "0");
- decoder.setModelOverride("GV355CEU");
-
verifyAttributes(decoder, buffer(
"+RESP:GTCAN,8020050605,867488060270575,,00,1,FFFFFFFF,8LBETF3W4N0001613,,,22.54,0,,,,,,,7.84,4.61,3.24,3.33,,8080,,,00,0.00,0.00,1,14,14,2371,0,001FFFFF,,,,,,,,,7158,9998,0,7.84,0.00,0.00,558,,,,,,,C0,,,,,0,0.0,346,2848.5,-78.592371,-0.968132,20240202083437,0740,0002,526C,00AE7907,00,20240202083440,3F6D$"));