aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/org/traccar/model/Command.java5
-rw-r--r--src/org/traccar/protocol/WatchProtocolEncoder.java77
-rw-r--r--test/org/traccar/protocol/WatchProtocolEncoderTest.java23
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));
}