diff options
-rw-r--r-- | src/org/traccar/model/Command.java | 5 | ||||
-rw-r--r-- | src/org/traccar/protocol/WatchProtocolEncoder.java | 77 | ||||
-rw-r--r-- | test/org/traccar/protocol/WatchProtocolEncoderTest.java | 23 |
3 files changed, 99 insertions, 6 deletions
diff --git a/src/org/traccar/model/Command.java b/src/org/traccar/model/Command.java index bb3f2186e..4525b3cde 100644 --- a/src/org/traccar/model/Command.java +++ b/src/org/traccar/model/Command.java @@ -35,6 +35,7 @@ public class Command extends Extensible { public static final String TYPE_SOS_NUMBER = "sosNumber"; public static final String TYPE_SILENCE_TIME = "silenceTime"; public static final String TYPE_SET_PHONEBOOK = "setPhonebook"; + public static final String TYPE_VOICE_MESSAGE = "voiceMessage"; public static final String TYPE_ALARM_GEOFENCE = "movementAlarm"; public static final String TYPE_ALARM_BATTERY = "alarmBattery"; @@ -49,5 +50,9 @@ public class Command extends Extensible { public static final String KEY_RADIUS = "radius"; public static final String KEY_PHONE_NUMBER = "phoneNumber"; public static final String KEY_MESSAGE = "message"; + public static final String KEY_ENABLE = "enable"; + public static final String KEY_DATA = "data"; + public static final String KEY_INDEX = "index"; + public static final String KEY_PHONE = "phone"; } diff --git a/src/org/traccar/protocol/WatchProtocolEncoder.java b/src/org/traccar/protocol/WatchProtocolEncoder.java index f93cb7568..b31c2e076 100644 --- a/src/org/traccar/protocol/WatchProtocolEncoder.java +++ b/src/org/traccar/protocol/WatchProtocolEncoder.java @@ -19,14 +19,89 @@ import org.traccar.StringProtocolEncoder; import org.traccar.helper.Log; import org.traccar.model.Command; +import javax.xml.bind.DatatypeConverter; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + public class WatchProtocolEncoder extends StringProtocolEncoder { + protected String formatCommand(Command command, String format, String... keys) { + String content = super.formatCommand(command, format, keys); + return String.format("[CS*%s*%04x*%s]", + getUniqueId(command.getDeviceId()), content.length(), content); + } + + private int getEnableFlag(Command command) { + if ((Boolean) command.getAttributes().get(Command.KEY_ENABLE)) { + return 1; + } else { + return 0; + } + } + + private static Map<Byte, Byte> mapping = new HashMap<>(); + + static { + mapping.put((byte) 0x7d, (byte) 0x01); + mapping.put((byte) 0x5B, (byte) 0x02); + mapping.put((byte) 0x5D, (byte) 0x03); + mapping.put((byte) 0x2C, (byte) 0x04); + mapping.put((byte) 0x2A, (byte) 0x05); + } + + private String getBinaryData(Command command) { + byte[] data = DatatypeConverter.parseHexBinary((String) command.getAttributes().get(Command.KEY_DATA)); + + int encodedLength = data.length; + for (byte b : data) { + if (mapping.containsKey(b)) { + encodedLength += 1; + } + } + + int index = 0; + byte[] encodedData = new byte[encodedLength]; + + for (byte b : data) { + Byte replacement = mapping.get(b); + if (replacement != null) { + encodedData[index] = 0x7D; + index += 1; + encodedData[index] = replacement; + } else { + encodedData[index] = b; + } + index += 1; + } + + return new String(encodedData, StandardCharsets.US_ASCII); + } + @Override protected Object encodeCommand(Command command) { switch (command.getType()) { + case Command.TYPE_SOS_NUMBER: + return formatCommand(command, "SOS{%s},{%s}", Command.KEY_INDEX, Command.KEY_PHONE); + case Command.TYPE_ALARM_SOS: + return formatCommand(command, "SOSSMS," + getEnableFlag(command)); + case Command.TYPE_ALARM_BATTERY: + return formatCommand(command, "LOWBAT," + getEnableFlag(command)); case Command.TYPE_REBOOT_DEVICE: - return formatCommand(command, "[CS*{%s}*0005*RESET]", Command.KEY_UNIQUE_ID); + return formatCommand(command, "RESET"); + case Command.TYPE_ALARM_REMOVE: + return formatCommand(command, "REMOVE," + getEnableFlag(command)); + case Command.TYPE_SILENCE_TIME: + return formatCommand(command, "SILENCETIME,{%s}", Command.KEY_DATA); + case Command.TYPE_ALARM_CLOCK: + return formatCommand(command, "REMIND,{%s}", Command.KEY_DATA); + case Command.TYPE_SET_PHONEBOOK: + return formatCommand(command, "PHB,{%s}", Command.KEY_DATA); + case Command.TYPE_VOICE_MESSAGE: + return formatCommand(command, "TK," + getBinaryData(command)); default: Log.warning(new UnsupportedOperationException(command.getType())); break; diff --git a/test/org/traccar/protocol/WatchProtocolEncoderTest.java b/test/org/traccar/protocol/WatchProtocolEncoderTest.java index 3f9e8328c..4e707a47b 100644 --- a/test/org/traccar/protocol/WatchProtocolEncoderTest.java +++ b/test/org/traccar/protocol/WatchProtocolEncoderTest.java @@ -12,12 +12,25 @@ public class WatchProtocolEncoderTest extends ProtocolTest { WatchProtocolEncoder encoder = new WatchProtocolEncoder(); - Command command = new Command(); + Command command; + + command = new Command(); command.setDeviceId(1); - command.setType(Command.TYPE_POSITION_PERIODIC); - command.set(Command.KEY_FREQUENCY, 300); - - //Assert.assertEquals("**,imei:123456789012345,C,05m", encoder.encodeCommand(command)); + command.setType(Command.TYPE_REBOOT_DEVICE); + Assert.assertEquals("[CS*123456789012345*0005*RESET]", encoder.encodeCommand(command)); + + command = new Command(); + command.setDeviceId(1); + command.setType(Command.TYPE_SOS_NUMBER); + command.set(Command.KEY_INDEX, 1); + command.set(Command.KEY_PHONE, "123456789"); + Assert.assertEquals("[CS*123456789012345*000e*SOS1,123456789]", encoder.encodeCommand(command)); + + command = new Command(); + command.setDeviceId(1); + command.setType(Command.TYPE_VOICE_MESSAGE); + command.set(Command.KEY_DATA, "3333"); + Assert.assertEquals("[CS*123456789012345*0005*TK,33]", encoder.encodeCommand(command)); } |