diff options
Diffstat (limited to 'src/org/traccar/protocol')
-rw-r--r-- | src/org/traccar/protocol/WatchProtocolEncoder.java | 77 |
1 files changed, 76 insertions, 1 deletions
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; |