aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2018-10-29 16:01:47 +1300
committerAnton Tananaev <anton.tananaev@gmail.com>2018-10-29 16:01:47 +1300
commite8f2247e719e44796a4d89f6973e3a3c0d21568a (patch)
tree0d3adbfad509349c5ba08f5c241ebae2c1f151a5
parent464348b91591a684bc16cf3c207f38ca3f923daa (diff)
downloadtraccar-server-e8f2247e719e44796a4d89f6973e3a3c0d21568a.tar.gz
traccar-server-e8f2247e719e44796a4d89f6973e3a3c0d21568a.tar.bz2
traccar-server-e8f2247e719e44796a4d89f6973e3a3c0d21568a.zip
Implement BCE output control
-rw-r--r--src/org/traccar/helper/Checksum.java8
-rw-r--r--src/org/traccar/protocol/BceProtocol.java4
-rw-r--r--src/org/traccar/protocol/BceProtocolEncoder.java47
-rw-r--r--test/org/traccar/protocol/BceProtocolEncoderTest.java24
-rw-r--r--test/org/traccar/protocol/Pt502ProtocolEncoderTest.java2
5 files changed, 84 insertions, 1 deletions
diff --git a/src/org/traccar/helper/Checksum.java b/src/org/traccar/helper/Checksum.java
index 5aed84bf8..adfa697c5 100644
--- a/src/org/traccar/helper/Checksum.java
+++ b/src/org/traccar/helper/Checksum.java
@@ -160,6 +160,14 @@ public final class Checksum {
return String.format("*%02x", checksum).toUpperCase();
}
+ public static int sum(ByteBuffer buf) {
+ byte checksum = 0;
+ while (buf.hasRemaining()) {
+ checksum += buf.get();
+ }
+ return checksum;
+ }
+
public static String sum(String msg) {
byte checksum = 0;
for (byte b : msg.getBytes(StandardCharsets.US_ASCII)) {
diff --git a/src/org/traccar/protocol/BceProtocol.java b/src/org/traccar/protocol/BceProtocol.java
index 2078d7da5..6453a05a9 100644
--- a/src/org/traccar/protocol/BceProtocol.java
+++ b/src/org/traccar/protocol/BceProtocol.java
@@ -18,14 +18,18 @@ package org.traccar.protocol;
import org.traccar.BaseProtocol;
import org.traccar.PipelineBuilder;
import org.traccar.TrackerServer;
+import org.traccar.model.Command;
public class BceProtocol extends BaseProtocol {
public BceProtocol() {
+ setSupportedDataCommands(
+ Command.TYPE_OUTPUT_CONTROL);
addServer(new TrackerServer(false, getName()) {
@Override
protected void addProtocolHandlers(PipelineBuilder pipeline) {
pipeline.addLast(new BceFrameDecoder());
+ pipeline.addLast(new BceProtocolEncoder());
pipeline.addLast(new BceProtocolDecoder(BceProtocol.this));
}
});
diff --git a/src/org/traccar/protocol/BceProtocolEncoder.java b/src/org/traccar/protocol/BceProtocolEncoder.java
new file mode 100644
index 000000000..1bbf3db12
--- /dev/null
+++ b/src/org/traccar/protocol/BceProtocolEncoder.java
@@ -0,0 +1,47 @@
+/*
+ * 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.traccar.protocol;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import org.traccar.BaseProtocolEncoder;
+import org.traccar.helper.Checksum;
+import org.traccar.model.Command;
+
+public class BceProtocolEncoder extends BaseProtocolEncoder {
+
+ @Override
+ protected Object encodeCommand(Command command) {
+
+ if (command.getType().equals(Command.TYPE_OUTPUT_CONTROL)) {
+ ByteBuf buf = Unpooled.buffer();
+
+ buf.writeLongLE(Long.parseLong(getUniqueId(command.getDeviceId())));
+ buf.writeShortLE(1 + 1 + 3 + 1); // length
+ buf.writeByte(BceProtocolDecoder.MSG_OUTPUT_CONTROL);
+ buf.writeByte(command.getInteger(Command.KEY_INDEX) == 1 ? 0x0A : 0x0B);
+ buf.writeByte(0xFF); // index
+ buf.writeByte(0x00); // form id
+ buf.writeShortLE(Integer.parseInt(command.getString(Command.KEY_DATA)) > 0 ? 0x0055 : 0x0000);
+ buf.writeByte(Checksum.sum(buf.nioBuffer()));
+
+ return buf;
+ } else {
+ return null;
+ }
+ }
+
+}
diff --git a/test/org/traccar/protocol/BceProtocolEncoderTest.java b/test/org/traccar/protocol/BceProtocolEncoderTest.java
new file mode 100644
index 000000000..bdcc1f9e8
--- /dev/null
+++ b/test/org/traccar/protocol/BceProtocolEncoderTest.java
@@ -0,0 +1,24 @@
+package org.traccar.protocol;
+
+import org.junit.Test;
+import org.traccar.ProtocolTest;
+import org.traccar.model.Command;
+
+public class BceProtocolEncoderTest extends ProtocolTest {
+
+ @Test
+ public void testEncode() throws Exception {
+
+ BceProtocolEncoder encoder = new BceProtocolEncoder();
+
+ Command command = new Command();
+ command.setDeviceId(1);
+ command.setType(Command.TYPE_OUTPUT_CONTROL);
+ command.set(Command.KEY_INDEX, 1);
+ command.set(Command.KEY_DATA, "1");
+
+ verifyCommand(encoder, command, binary("79df0d86487000000600410aff00550048"));
+
+ }
+
+}
diff --git a/test/org/traccar/protocol/Pt502ProtocolEncoderTest.java b/test/org/traccar/protocol/Pt502ProtocolEncoderTest.java
index 9d591bceb..a6c8bb50f 100644
--- a/test/org/traccar/protocol/Pt502ProtocolEncoderTest.java
+++ b/test/org/traccar/protocol/Pt502ProtocolEncoderTest.java
@@ -31,7 +31,7 @@ public class Pt502ProtocolEncoderTest extends ProtocolTest {
command.setDeviceId(1);
command.setType(Command.TYPE_OUTPUT_CONTROL);
command.set(Command.KEY_INDEX, 2);
- command.set(Command.KEY_DATA, 1);
+ command.set(Command.KEY_DATA, "1");
assertEquals("#OPC2,1\r\n", encoder.encodeCommand(command));