aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2018-03-29 16:33:28 +1300
committerAnton Tananaev <anton.tananaev@gmail.com>2018-03-29 16:33:48 +1300
commit1e3e7c767ba88e6439dd512dd64b6a8b746b7e96 (patch)
treebaca8d38214fbffa8d34aa146839ccd32e39e685
parenteac3b3804d8bbabde8b5ac8c4661bf0fec469868 (diff)
downloadtraccar-server-1e3e7c767ba88e6439dd512dd64b6a8b746b7e96.tar.gz
traccar-server-1e3e7c767ba88e6439dd512dd64b6a8b746b7e96.tar.bz2
traccar-server-1e3e7c767ba88e6439dd512dd64b6a8b746b7e96.zip
Improve Watch command encoding
-rw-r--r--src/org/traccar/BaseProtocolEncoder.java12
-rw-r--r--src/org/traccar/protocol/WatchProtocolDecoder.java24
-rw-r--r--src/org/traccar/protocol/WatchProtocolEncoder.java54
-rw-r--r--test/org/traccar/protocol/WatchProtocolEncoderTest.java16
4 files changed, 70 insertions, 36 deletions
diff --git a/src/org/traccar/BaseProtocolEncoder.java b/src/org/traccar/BaseProtocolEncoder.java
index 2c8a81868..18544fd28 100644
--- a/src/org/traccar/BaseProtocolEncoder.java
+++ b/src/org/traccar/BaseProtocolEncoder.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2015 - 2016 Anton Tananaev (anton@traccar.org)
+ * Copyright 2015 - 2018 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -45,7 +45,7 @@ public abstract class BaseProtocolEncoder extends OneToOneEncoder {
if (msg instanceof Command) {
Command command = (Command) msg;
- Object encodedCommand = encodeCommand(command);
+ Object encodedCommand = encodeCommand(channel, command);
// Log command
StringBuilder s = new StringBuilder();
@@ -65,6 +65,12 @@ public abstract class BaseProtocolEncoder extends OneToOneEncoder {
return msg;
}
- protected abstract Object encodeCommand(Command command);
+ protected Object encodeCommand(Channel channel, Command command) {
+ return encodeCommand(command);
+ }
+
+ protected Object encodeCommand(Command command) {
+ return null;
+ }
}
diff --git a/src/org/traccar/protocol/WatchProtocolDecoder.java b/src/org/traccar/protocol/WatchProtocolDecoder.java
index 41cd957ae..68832cd3e 100644
--- a/src/org/traccar/protocol/WatchProtocolDecoder.java
+++ b/src/org/traccar/protocol/WatchProtocolDecoder.java
@@ -60,7 +60,7 @@ public class WatchProtocolDecoder extends BaseProtocolDecoder {
.expression("(.*)") // cell and wifi
.compile();
- private void sendResponse(Channel channel, String manufacturer, String id, String index, String content) {
+ private void sendResponse(Channel channel, String id, String index, String content) {
if (channel != null) {
if (index != null) {
channel.write(String.format(
@@ -161,6 +161,17 @@ public class WatchProtocolDecoder extends BaseProtocolDecoder {
return position;
}
+ private boolean hasIndex;
+ private String manufacturer;
+
+ public boolean getHasIndex() {
+ return hasIndex;
+ }
+
+ public String getManufacturer() {
+ return manufacturer;
+ }
+
@Override
protected Object decode(
Channel channel, SocketAddress remoteAddress, Object msg) throws Exception {
@@ -168,7 +179,7 @@ public class WatchProtocolDecoder extends BaseProtocolDecoder {
ChannelBuffer buf = (ChannelBuffer) msg;
buf.skipBytes(1); // header
- String manufacturer = buf.readBytes(2).toString(StandardCharsets.US_ASCII);
+ manufacturer = buf.readBytes(2).toString(StandardCharsets.US_ASCII);
buf.skipBytes(1); // delimiter
int idIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) '*');
@@ -185,6 +196,7 @@ public class WatchProtocolDecoder extends BaseProtocolDecoder {
if (contentIndex + 5 < buf.writerIndex() && buf.getByte(contentIndex + 5) == '*'
&& buf.toString(contentIndex + 1, 4, StandardCharsets.US_ASCII).matches("\\p{XDigit}+")) {
int indexLength = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) '*') - buf.readerIndex();
+ hasIndex = true;
index = buf.readBytes(indexLength).toString(StandardCharsets.US_ASCII);
buf.skipBytes(1); // delimiter
}
@@ -207,11 +219,11 @@ public class WatchProtocolDecoder extends BaseProtocolDecoder {
if (type.equals("INIT")) {
- sendResponse(channel, manufacturer, id, index, "INIT,1");
+ sendResponse(channel, id, index, "INIT,1");
} else if (type.equals("LK")) {
- sendResponse(channel, manufacturer, id, index, "LK");
+ sendResponse(channel, id, index, "LK");
if (buf.readable()) {
String[] values = buf.toString(StandardCharsets.US_ASCII).split(",");
@@ -231,14 +243,14 @@ public class WatchProtocolDecoder extends BaseProtocolDecoder {
|| type.equals("AL") || type.equals("WT")) {
if (type.equals("AL")) {
- sendResponse(channel, manufacturer, id, index, "AL");
+ sendResponse(channel, id, index, "AL");
}
return decodePosition(deviceSession, buf.toString(StandardCharsets.US_ASCII));
} else if (type.equals("TKQ")) {
- sendResponse(channel, manufacturer, id, index, "TKQ");
+ sendResponse(channel, id, index, "TKQ");
} else if (type.equals("PULSE") || type.equals("heart") || type.equals("bphrt")) {
diff --git a/src/org/traccar/protocol/WatchProtocolEncoder.java b/src/org/traccar/protocol/WatchProtocolEncoder.java
index 5206fbf10..4c87f3abd 100644
--- a/src/org/traccar/protocol/WatchProtocolEncoder.java
+++ b/src/org/traccar/protocol/WatchProtocolEncoder.java
@@ -15,6 +15,7 @@
*/
package org.traccar.protocol;
+import org.jboss.netty.channel.Channel;
import org.traccar.StringProtocolEncoder;
import org.traccar.helper.DataConverter;
import org.traccar.helper.Log;
@@ -41,12 +42,27 @@ public class WatchProtocolEncoder extends StringProtocolEncoder implements Strin
return null;
}
+ protected String formatCommand(Channel channel, Command command, String format, String... keys) {
+
+ boolean hasIndex = false;
+ String manufacturer = "CS";
+ if (channel != null) {
+ WatchProtocolDecoder decoder = channel.getPipeline().get(WatchProtocolDecoder.class);
+ if (decoder != null) {
+ hasIndex = decoder.getHasIndex();
+ manufacturer = decoder.getManufacturer();
+ }
+ }
- @Override
- protected String formatCommand(Command command, String format, String... keys) {
String content = formatCommand(command, format, this, keys);
- return String.format("[CS*%s*%04x*%s]",
- getUniqueId(command.getDeviceId()), content.length(), content);
+
+ if (hasIndex) {
+ return String.format("[%s*%s*0001*%04x*%s]",
+ manufacturer, getUniqueId(command.getDeviceId()), content.length(), content);
+ } else {
+ return String.format("[%s*%s*%04x*%s]",
+ manufacturer, getUniqueId(command.getDeviceId()), content.length(), content);
+ }
}
private int getEnableFlag(Command command) {
@@ -96,37 +112,37 @@ public class WatchProtocolEncoder extends StringProtocolEncoder implements Strin
}
@Override
- protected Object encodeCommand(Command command) {
+ protected Object encodeCommand(Channel channel, Command command) {
switch (command.getType()) {
case Command.TYPE_CUSTOM:
- return formatCommand(command, command.getString(Command.KEY_DATA));
+ return formatCommand(channel, command, command.getString(Command.KEY_DATA));
case Command.TYPE_POSITION_SINGLE:
- return formatCommand(command, "RG");
+ return formatCommand(channel, command, "RG");
case Command.TYPE_SOS_NUMBER:
- return formatCommand(command, "SOS{%s},{%s}", Command.KEY_INDEX, Command.KEY_PHONE);
+ return formatCommand(channel, command, "SOS{%s},{%s}", Command.KEY_INDEX, Command.KEY_PHONE);
case Command.TYPE_ALARM_SOS:
- return formatCommand(command, "SOSSMS," + getEnableFlag(command));
+ return formatCommand(channel, command, "SOSSMS," + getEnableFlag(command));
case Command.TYPE_ALARM_BATTERY:
- return formatCommand(command, "LOWBAT," + getEnableFlag(command));
+ return formatCommand(channel, command, "LOWBAT," + getEnableFlag(command));
case Command.TYPE_REBOOT_DEVICE:
- return formatCommand(command, "RESET");
+ return formatCommand(channel, command, "RESET");
case Command.TYPE_ALARM_REMOVE:
- return formatCommand(command, "REMOVE," + getEnableFlag(command));
+ return formatCommand(channel, command, "REMOVE," + getEnableFlag(command));
case Command.TYPE_SILENCE_TIME:
- return formatCommand(command, "SILENCETIME,{%s}", Command.KEY_DATA);
+ return formatCommand(channel, command, "SILENCETIME,{%s}", Command.KEY_DATA);
case Command.TYPE_ALARM_CLOCK:
- return formatCommand(command, "REMIND,{%s}", Command.KEY_DATA);
+ return formatCommand(channel, command, "REMIND,{%s}", Command.KEY_DATA);
case Command.TYPE_SET_PHONEBOOK:
- return formatCommand(command, "PHB,{%s}", Command.KEY_DATA);
+ return formatCommand(channel, command, "PHB,{%s}", Command.KEY_DATA);
case Command.TYPE_VOICE_MESSAGE:
- return formatCommand(command, "TK," + getBinaryData(command));
+ return formatCommand(channel, command, "TK," + getBinaryData(command));
case Command.TYPE_POSITION_PERIODIC:
- return formatCommand(command, "UPLOAD,{%s}", Command.KEY_FREQUENCY);
+ return formatCommand(channel, command, "UPLOAD,{%s}", Command.KEY_FREQUENCY);
case Command.TYPE_SET_TIMEZONE:
- return formatCommand(command, "LZ,,{%s}", Command.KEY_TIMEZONE);
+ return formatCommand(channel, command, "LZ,,{%s}", Command.KEY_TIMEZONE);
case Command.TYPE_SET_INDICATOR:
- return formatCommand(command, "FLOWER,{%s}", Command.KEY_DATA);
+ return formatCommand(channel, command, "FLOWER,{%s}", Command.KEY_DATA);
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 a201b7860..d7784f50b 100644
--- a/test/org/traccar/protocol/WatchProtocolEncoderTest.java
+++ b/test/org/traccar/protocol/WatchProtocolEncoderTest.java
@@ -18,41 +18,41 @@ public class WatchProtocolEncoderTest extends ProtocolTest {
command = new Command();
command.setDeviceId(1);
command.setType(Command.TYPE_REBOOT_DEVICE);
- assertEquals("[CS*123456789012345*0005*RESET]", encoder.encodeCommand(command));
+ assertEquals("[CS*123456789012345*0005*RESET]", encoder.encodeCommand(null, 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");
- assertEquals("[CS*123456789012345*000e*SOS1,123456789]", encoder.encodeCommand(command));
+ assertEquals("[CS*123456789012345*000e*SOS1,123456789]", encoder.encodeCommand(null, command));
command = new Command();
command.setDeviceId(1);
command.setType(Command.TYPE_VOICE_MESSAGE);
command.set(Command.KEY_DATA, "3333");
- assertEquals("[CS*123456789012345*0005*TK,33]", encoder.encodeCommand(command));
+ assertEquals("[CS*123456789012345*0005*TK,33]", encoder.encodeCommand(null, command));
command = new Command();
command.setDeviceId(1);
command.setType(Command.TYPE_CUSTOM);
command.set(Command.KEY_DATA, "WORK,6-9,11-13,13-15,17-19");
- assertEquals("[CS*123456789012345*001a*WORK,6-9,11-13,13-15,17-19]", encoder.encodeCommand(command));
+ assertEquals("[CS*123456789012345*001a*WORK,6-9,11-13,13-15,17-19]", encoder.encodeCommand(null, command));
command = new Command();
command.setDeviceId(1);
command.setType(Command.TYPE_SET_TIMEZONE);
command.set(Command.KEY_TIMEZONE, "Europe/Amsterdam");
- assertEquals("[CS*123456789012345*0006*LZ,,+1]", encoder.encodeCommand(command));
+ assertEquals("[CS*123456789012345*0006*LZ,,+1]", encoder.encodeCommand(null, command));
command.set(Command.KEY_TIMEZONE, "GMT+01:30");
- assertEquals("[CS*123456789012345*0008*LZ,,+1.5]", encoder.encodeCommand(command));
+ assertEquals("[CS*123456789012345*0008*LZ,,+1.5]", encoder.encodeCommand(null, command));
command.set(Command.KEY_TIMEZONE, "Atlantic/Azores");
- assertEquals("[CS*123456789012345*0006*LZ,,-1]", encoder.encodeCommand(command));
+ assertEquals("[CS*123456789012345*0006*LZ,,-1]", encoder.encodeCommand(null, command));
command.set(Command.KEY_TIMEZONE, "GMT-11:30");
- assertEquals("[CS*123456789012345*0009*LZ,,-11.5]", encoder.encodeCommand(command));
+ assertEquals("[CS*123456789012345*0009*LZ,,-11.5]", encoder.encodeCommand(null, command));
}