From faaf63abdd81d1d4b6e7c7a8ef36e049fdc8000a Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 17 Jul 2015 22:41:03 +1200 Subject: Finish with GPS103 commands --- src/org/traccar/BaseProtocol.java | 2 +- src/org/traccar/model/Command.java | 1 + .../traccar/protocol/Gps103ProtocolEncoder.java | 41 +++++++++++----------- test/org/traccar/helper/TestIdentityManager.java | 13 ++++--- .../protocol/Gps103ProtocolEncoderTest.java | 29 +++++++++++++++ 5 files changed, 61 insertions(+), 25 deletions(-) create mode 100644 test/org/traccar/protocol/Gps103ProtocolEncoderTest.java diff --git a/src/org/traccar/BaseProtocol.java b/src/org/traccar/BaseProtocol.java index 31f278739..aa98d776c 100644 --- a/src/org/traccar/BaseProtocol.java +++ b/src/org/traccar/BaseProtocol.java @@ -42,7 +42,7 @@ public abstract class BaseProtocol implements Protocol { @Override public void sendCommand(ActiveDevice activeDevice, Command command) { if (!supportedCommands.contains(command.getType())) { - throw new RuntimeException("Command " + command + " is not supported in protocol " + this.getName()); + throw new RuntimeException("Command " + command + " is not supported in protocol " + getName()); } activeDevice.write(command); } diff --git a/src/org/traccar/model/Command.java b/src/org/traccar/model/Command.java index 58aa61a7d..f7702dbd0 100644 --- a/src/org/traccar/model/Command.java +++ b/src/org/traccar/model/Command.java @@ -27,6 +27,7 @@ public class Command implements Factory { public static final String TYPE_ENGINE_STOP = "engineStop"; public static final String TYPE_ENGINE_RESUME = "engineResume"; + public static final String KEY_UNIQUE_ID = "uniqueId"; public static final String KEY_FREQUENCY = "frequency"; } diff --git a/src/org/traccar/protocol/Gps103ProtocolEncoder.java b/src/org/traccar/protocol/Gps103ProtocolEncoder.java index d7cddd1ba..27fea8237 100644 --- a/src/org/traccar/protocol/Gps103ProtocolEncoder.java +++ b/src/org/traccar/protocol/Gps103ProtocolEncoder.java @@ -21,42 +21,43 @@ import org.traccar.model.Command; public class Gps103ProtocolEncoder extends BaseProtocolEncoder { - /*@Override - protected void initCommandsTemplates(Map templates) { - templates.put(CommandType.FIX_POSITIONING, new StringCommandTemplate("**,imei:[%s],C,[%s]", Command.UNIQUE_ID, FixPositioningCommand.FREQUENCY) - .addConverter(Duration.class, new CommandValueConversion() { - @Override - public String convert(Duration value) { - return String.format("%02d%s", value.getValue(), value.getUnit().getCommandFormat()); - } - })); - }*/ - - private String formatCommand(String format, Command command) { + private String formatCommand(Command command, String format, String... keys) { - String result = format; + String result = String.format(format, (Object[]) keys); - result = result.replaceAll("\\{uniqueId}", getUniqueId(command.getDeviceId())); + result = result.replaceAll("\\{" + Command.KEY_UNIQUE_ID + "}", getUniqueId(command.getDeviceId())); for (Map.Entry entry : command.getOther().entrySet()) { - result = result.replaceAll("\\{" + entry.getKey() + "}", entry.getValue().toString()); + String value; + if (entry.getKey().equals(Command.KEY_FREQUENCY)) { + long frequency = (Long) entry.getValue(); + if (frequency / 60 / 60 > 0) { + value = String.format("%02dh", frequency / 60 / 60); + } else if (frequency / 60 > 0) { + value = String.format("%02dm", frequency / 60); + } else { + value = String.format("%02ds", frequency); + } + } else { + value = entry.getValue().toString(); + } + result = result.replaceAll("\\{" + entry.getKey() + "}", value); } return result; } - @Override protected Object encodeCommand(Command command) { switch (command.getType()) { case Command.TYPE_POSITION_STOP: - return formatCommand("**,imei:{uniqueId},A", command); + return formatCommand(command, "**,imei:{%s},A", Command.KEY_UNIQUE_ID); case Command.TYPE_POSITION_FIX: - return formatCommand("**,imei:{uniqueId},C,{time}", command); // TODO + return formatCommand(command, "**,imei:{%s},C,{%s}", Command.KEY_UNIQUE_ID, Command.KEY_FREQUENCY); case Command.TYPE_ENGINE_STOP: - return formatCommand("**,imei:{uniqueId},K", command); + return formatCommand(command, "**,imei:{%s},K", Command.KEY_UNIQUE_ID); case Command.TYPE_ENGINE_RESUME: - return formatCommand("**,imei:{uniqueId},J", command); + return formatCommand(command, "**,imei:{%s},J", Command.KEY_UNIQUE_ID); } return null; diff --git a/test/org/traccar/helper/TestIdentityManager.java b/test/org/traccar/helper/TestIdentityManager.java index a4ddeeb09..d279241e4 100644 --- a/test/org/traccar/helper/TestIdentityManager.java +++ b/test/org/traccar/helper/TestIdentityManager.java @@ -4,17 +4,22 @@ import org.traccar.database.IdentityManager; import org.traccar.model.Device; public class TestIdentityManager implements IdentityManager { + + private final Device device; + + public TestIdentityManager() { + device = new Device(); + device.setId(1); + device.setUniqueId("123456789012345"); + } @Override public Device getDeviceById(long id) { - return null; + return device; } @Override public Device getDeviceByUniqueId(String imei) { - Device device = new Device(); - device.setId(new Long(1)); - device.setUniqueId("123456789012345"); return device; } diff --git a/test/org/traccar/protocol/Gps103ProtocolEncoderTest.java b/test/org/traccar/protocol/Gps103ProtocolEncoderTest.java new file mode 100644 index 000000000..74091d0e0 --- /dev/null +++ b/test/org/traccar/protocol/Gps103ProtocolEncoderTest.java @@ -0,0 +1,29 @@ +package org.traccar.protocol; + +import java.util.HashMap; +import java.util.Map; +import org.junit.Assert; +import org.junit.Test; +import org.traccar.model.Command; + +public class Gps103ProtocolEncoderTest { + + @Test + public void testDecode() throws Exception { + + Gps103ProtocolEncoder encoder = new Gps103ProtocolEncoder(); + + Command command = new Command(); + command.setDeviceId(1); + command.setType(Command.TYPE_POSITION_FIX); + + Map other = new HashMap<>(); + other.put(Command.KEY_FREQUENCY, 300l); + + command.setOther(other); + + Assert.assertEquals("**,imei:123456789012345,C,05m", encoder.encodeCommand(command)); + + } + +} -- cgit v1.2.3