From b2f389803ffaed47082a6f770c5b19df98cecac2 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 28 Feb 2021 16:40:39 -0800 Subject: Commands and result support --- src/main/java/org/traccar/model/Command.java | 2 ++ .../java/org/traccar/protocol/KhdProtocol.java | 10 ++++-- .../org/traccar/protocol/KhdProtocolDecoder.java | 12 +++++--- .../org/traccar/protocol/KhdProtocolEncoder.java | 36 +++++++++++++++++++--- .../traccar/protocol/KhdProtocolEncoderTest.java | 5 ++- 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")); + } } -- cgit v1.2.3