From 7b17e8d1fe1dc85b5a324776cbe87d1525230104 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 27 Sep 2016 16:14:30 +1300 Subject: Implement eeLink protocol commands --- src/org/traccar/protocol/EelinkProtocol.java | 9 ++- .../traccar/protocol/EelinkProtocolDecoder.java | 2 +- .../traccar/protocol/EelinkProtocolEncoder.java | 68 ++++++++++++++++++++++ .../protocol/EelinkProtocolEncoderTest.java | 22 +++++++ 4 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 src/org/traccar/protocol/EelinkProtocolEncoder.java create mode 100644 test/org/traccar/protocol/EelinkProtocolEncoderTest.java diff --git a/src/org/traccar/protocol/EelinkProtocol.java b/src/org/traccar/protocol/EelinkProtocol.java index 4da051159..e91fc5efd 100644 --- a/src/org/traccar/protocol/EelinkProtocol.java +++ b/src/org/traccar/protocol/EelinkProtocol.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com) + * Copyright 2015 - 2016 Anton Tananaev (anton.tananaev@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; import org.traccar.BaseProtocol; import org.traccar.TrackerServer; +import org.traccar.model.Command; import java.util.List; @@ -27,6 +28,11 @@ public class EelinkProtocol extends BaseProtocol { public EelinkProtocol() { super("eelink"); + setSupportedCommands( + Command.TYPE_CUSTOM, + Command.TYPE_ENGINE_STOP, + Command.TYPE_ENGINE_RESUME, + Command.TYPE_REBOOT_DEVICE); } @Override @@ -35,6 +41,7 @@ public class EelinkProtocol extends BaseProtocol { @Override protected void addSpecificHandlers(ChannelPipeline pipeline) { pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 3, 2)); + pipeline.addLast("objectEncoder", new EelinkProtocolEncoder()); pipeline.addLast("objectDecoder", new EelinkProtocolDecoder(EelinkProtocol.this)); } }); diff --git a/src/org/traccar/protocol/EelinkProtocolDecoder.java b/src/org/traccar/protocol/EelinkProtocolDecoder.java index 87d706aff..10a8304c9 100644 --- a/src/org/traccar/protocol/EelinkProtocolDecoder.java +++ b/src/org/traccar/protocol/EelinkProtocolDecoder.java @@ -40,7 +40,7 @@ public class EelinkProtocolDecoder extends BaseProtocolDecoder { public static final int MSG_STATE = 0x05; public static final int MSG_SMS = 0x06; public static final int MSG_OBD = 0x07; - public static final int MSG_INTERACTIVE = 0x80; + public static final int MSG_DOWNLINK = 0x80; public static final int MSG_DATA = 0x81; public static final int MSG_NORMAL = 0x12; diff --git a/src/org/traccar/protocol/EelinkProtocolEncoder.java b/src/org/traccar/protocol/EelinkProtocolEncoder.java new file mode 100644 index 000000000..a7e96aa97 --- /dev/null +++ b/src/org/traccar/protocol/EelinkProtocolEncoder.java @@ -0,0 +1,68 @@ +/* + * Copyright 2016 Anton Tananaev (anton.tananaev@gmail.com) + * + * 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 org.jboss.netty.buffer.ChannelBuffer; +import org.jboss.netty.buffer.ChannelBuffers; +import org.traccar.BaseProtocolEncoder; +import org.traccar.Context; +import org.traccar.helper.Checksum; +import org.traccar.helper.Log; +import org.traccar.model.Command; +import org.traccar.model.Device; + +import java.nio.charset.StandardCharsets; + +public class EelinkProtocolEncoder extends BaseProtocolEncoder { + + private ChannelBuffer encodeContent(String content) { + + ChannelBuffer buf = ChannelBuffers.dynamicBuffer(); + + buf.writeByte(0x67); + buf.writeByte(0x67); + buf.writeByte(EelinkProtocolDecoder.MSG_DOWNLINK); + buf.writeShort(2 + 1 + 4 + content.length()); // length + buf.writeShort(0); // index + + buf.writeByte(0x01); // command + buf.writeInt(0); // server id + buf.writeBytes(content.getBytes(StandardCharsets.UTF_8)); + + return buf; + } + + @Override + protected Object encodeCommand(Command command) { + + switch (command.getType()) { + case Command.TYPE_CUSTOM: + return encodeContent((String) command.getAttributes().get(Command.KEY_DATA)); + case Command.TYPE_ENGINE_STOP: + return encodeContent("RELAY,1#"); + case Command.TYPE_ENGINE_RESUME: + return encodeContent("RELAY,0#"); + case Command.TYPE_REBOOT_DEVICE: + return encodeContent("RESET#"); + default: + Log.warning(new UnsupportedOperationException(command.getType())); + break; + } + + return null; + } + +} diff --git a/test/org/traccar/protocol/EelinkProtocolEncoderTest.java b/test/org/traccar/protocol/EelinkProtocolEncoderTest.java new file mode 100644 index 000000000..8a8cd5f6b --- /dev/null +++ b/test/org/traccar/protocol/EelinkProtocolEncoderTest.java @@ -0,0 +1,22 @@ +package org.traccar.protocol; + +import org.junit.Test; +import org.traccar.ProtocolTest; +import org.traccar.model.Command; + +public class EelinkProtocolEncoderTest extends ProtocolTest { + + @Test + public void testEncode() throws Exception { + + EelinkProtocolEncoder encoder = new EelinkProtocolEncoder(); + + Command command = new Command(); + command.setDeviceId(1); + command.setType(Command.TYPE_ENGINE_STOP); + + verifyCommand(encoder, command, binary("676780000f0000010000000052454c41592c3123")); + + } + +} -- cgit v1.2.3