aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/traccar/model/Command.java2
-rw-r--r--src/main/java/org/traccar/protocol/KhdProtocol.java10
-rw-r--r--src/main/java/org/traccar/protocol/KhdProtocolDecoder.java12
-rw-r--r--src/main/java/org/traccar/protocol/KhdProtocolEncoder.java36
-rw-r--r--src/test/java/org/traccar/protocol/KhdProtocolEncoderTest.java5
5 files changed, 53 insertions, 12 deletions
diff --git a/src/main/java/org/traccar/model/Command.java b/src/main/java/org/traccar/model/Command.java
index 099fb152d..99930d1e6 100644
--- a/src/main/java/org/traccar/model/Command.java
+++ b/src/main/java/org/traccar/model/Command.java
@@ -36,6 +36,7 @@ public class Command extends Message implements Cloneable {
public static final String TYPE_REQUEST_PHOTO = "requestPhoto";
public static final String TYPE_POWER_OFF = "powerOff";
public static final String TYPE_REBOOT_DEVICE = "rebootDevice";
+ public static final String TYPE_FACTORY_RESET = "factoryReset";
public static final String TYPE_SEND_SMS = "sendSms";
public static final String TYPE_SEND_USSD = "sendUssd";
public static final String TYPE_SOS_NUMBER = "sosNumber";
@@ -54,6 +55,7 @@ public class Command extends Message implements Cloneable {
public static final String TYPE_SET_ODOMETER = "setOdometer";
public static final String TYPE_GET_MODEM_STATUS = "getModemStatus";
public static final String TYPE_GET_DEVICE_STATUS = "getDeviceStatus";
+ public static final String TYPE_SET_SPEED_LIMIT = "setSpeedLimit";
public static final String TYPE_MODE_POWER_SAVING = "modePowerSaving";
public static final String TYPE_MODE_DEEP_SLEEP = "modeDeepSleep";
diff --git a/src/main/java/org/traccar/protocol/KhdProtocol.java b/src/main/java/org/traccar/protocol/KhdProtocol.java
index f77f4c311..60a2aea7f 100644
--- a/src/main/java/org/traccar/protocol/KhdProtocol.java
+++ b/src/main/java/org/traccar/protocol/KhdProtocol.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2015 - 2019 Anton Tananaev (anton@traccar.org)
+ * Copyright 2015 - 2021 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.
@@ -26,7 +26,13 @@ public class KhdProtocol extends BaseProtocol {
public KhdProtocol() {
setSupportedDataCommands(
Command.TYPE_ENGINE_STOP,
- Command.TYPE_ENGINE_RESUME);
+ Command.TYPE_ENGINE_RESUME,
+ Command.TYPE_GET_VERSION,
+ Command.TYPE_FACTORY_RESET,
+ Command.TYPE_SET_SPEED_LIMIT,
+ Command.TYPE_SET_ODOMETER,
+ Command.TYPE_POSITION_SINGLE);
+
addServer(new TrackerServer(false, getName()) {
@Override
protected void addProtocolHandlers(PipelineBuilder pipeline) {
diff --git a/src/main/java/org/traccar/protocol/KhdProtocolDecoder.java b/src/main/java/org/traccar/protocol/KhdProtocolDecoder.java
index 16ad616ed..1f3798bd2 100644
--- a/src/main/java/org/traccar/protocol/KhdProtocolDecoder.java
+++ b/src/main/java/org/traccar/protocol/KhdProtocolDecoder.java
@@ -125,11 +125,15 @@ public class KhdProtocolDecoder extends BaseProtocolDecoder {
position.set(Position.KEY_ODOMETER, buf.readUnsignedMedium());
position.set(Position.KEY_STATUS, buf.readUnsignedInt());
- position.set(Position.KEY_HDOP, buf.readUnsignedByte());
- position.set(Position.KEY_VDOP, buf.readUnsignedByte());
- position.set(Position.KEY_SATELLITES, buf.readUnsignedByte());
- buf.skipBytes(5); // other location data
+ buf.readUnsignedShort();
+ buf.readUnsignedByte();
+ buf.readUnsignedByte();
+ buf.readUnsignedByte();
+ buf.readUnsignedByte();
+ buf.readUnsignedByte();
+
+ position.set(Position.KEY_RESULT, buf.readUnsignedByte());
if (type == MSG_PERIPHERAL) {
diff --git a/src/main/java/org/traccar/protocol/KhdProtocolEncoder.java b/src/main/java/org/traccar/protocol/KhdProtocolEncoder.java
index 4a8df26c8..8aeb9660d 100644
--- a/src/main/java/org/traccar/protocol/KhdProtocolEncoder.java
+++ b/src/main/java/org/traccar/protocol/KhdProtocolEncoder.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2015 - 2019 Anton Tananaev (anton@traccar.org)
+ * Copyright 2015 - 2021 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.
@@ -24,14 +24,19 @@ import org.traccar.Protocol;
public class KhdProtocolEncoder extends BaseProtocolEncoder {
+ public static final int MSG_ON_DEMAND_TRACK = 0x30;
public static final int MSG_CUT_OIL = 0x39;
public static final int MSG_RESUME_OIL = 0x38;
+ public static final int MSG_CHECK_VERSION = 0x3D;
+ public static final int MSG_FACTORY_RESET = 0xC3;
+ public static final int MSG_SET_OVERSPEED = 0x3F;
+ public static final int MSG_DELETE_MILEAGE = 0x66;
public KhdProtocolEncoder(Protocol protocol) {
super(protocol);
}
- private ByteBuf encodeCommand(int command, String uniqueId) {
+ private ByteBuf encodeCommand(int command, String uniqueId, ByteBuf content) {
ByteBuf buf = Unpooled.buffer();
@@ -39,7 +44,12 @@ public class KhdProtocolEncoder extends BaseProtocolEncoder {
buf.writeByte(0x29);
buf.writeByte(command);
- buf.writeShort(6); // size
+
+ int length = 6;
+ if (content != null) {
+ length += content.readableBytes();
+ }
+ buf.writeShort(length);
uniqueId = "00000000".concat(uniqueId);
uniqueId = uniqueId.substring(uniqueId.length() - 8);
@@ -48,6 +58,10 @@ public class KhdProtocolEncoder extends BaseProtocolEncoder {
buf.writeByte(Integer.parseInt(uniqueId.substring(4, 6)) + 0x80);
buf.writeByte(Integer.parseInt(uniqueId.substring(6, 8)));
+ if (content != null) {
+ buf.writeBytes(content);
+ }
+
buf.writeByte(Checksum.xor(buf.nioBuffer()));
buf.writeByte(0x0D); // ending
@@ -61,9 +75,21 @@ public class KhdProtocolEncoder extends BaseProtocolEncoder {
switch (command.getType()) {
case Command.TYPE_ENGINE_STOP:
- return encodeCommand(MSG_CUT_OIL, uniqueId);
+ return encodeCommand(MSG_CUT_OIL, uniqueId, null);
case Command.TYPE_ENGINE_RESUME:
- return encodeCommand(MSG_RESUME_OIL, uniqueId);
+ return encodeCommand(MSG_RESUME_OIL, uniqueId, null);
+ case Command.TYPE_GET_VERSION:
+ return encodeCommand(MSG_CHECK_VERSION, uniqueId, null);
+ case Command.TYPE_FACTORY_RESET:
+ return encodeCommand(MSG_FACTORY_RESET, uniqueId, null);
+ case Command.TYPE_SET_SPEED_LIMIT:
+ ByteBuf content = Unpooled.buffer();
+ content.writeByte(Integer.parseInt(command.getString(Command.KEY_DATA)));
+ return encodeCommand(MSG_RESUME_OIL, uniqueId, content);
+ case Command.TYPE_SET_ODOMETER:
+ return encodeCommand(MSG_DELETE_MILEAGE, uniqueId, null);
+ case Command.TYPE_POSITION_SINGLE:
+ return encodeCommand(MSG_ON_DEMAND_TRACK, uniqueId, null);
default:
return null;
}
diff --git a/src/test/java/org/traccar/protocol/KhdProtocolEncoderTest.java b/src/test/java/org/traccar/protocol/KhdProtocolEncoderTest.java
index 390defe6f..043bf4d9a 100644
--- a/src/test/java/org/traccar/protocol/KhdProtocolEncoderTest.java
+++ b/src/test/java/org/traccar/protocol/KhdProtocolEncoderTest.java
@@ -13,10 +13,13 @@ public class KhdProtocolEncoderTest extends ProtocolTest {
Command command = new Command();
command.setDeviceId(1);
- command.setType(Command.TYPE_ENGINE_STOP);
+ command.setType(Command.TYPE_ENGINE_STOP);
verifyCommand(encoder, command, binary("29293900065981972d5d0d"));
+ command.setType(Command.TYPE_POSITION_SINGLE);
+ verifyCommand(encoder, command, binary("29293000065981972d540d"));
+
}
}