From 51d4e557703a0322b983a8b294f2a8c6920718c5 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 17 Jul 2015 20:10:48 +1200 Subject: Start GPS103 encoder implementation --- src/org/traccar/BaseProtocol.java | 2 +- src/org/traccar/BaseProtocolEncoder.java | 4 ++ src/org/traccar/protocol/Gps103Protocol.java | 25 +++------ .../traccar/protocol/Gps103ProtocolEncoder.java | 65 ++++++++++++++++++++++ 4 files changed, 79 insertions(+), 17 deletions(-) create mode 100644 src/org/traccar/protocol/Gps103ProtocolEncoder.java diff --git a/src/org/traccar/BaseProtocol.java b/src/org/traccar/BaseProtocol.java index 4a408761d..31f278739 100644 --- a/src/org/traccar/BaseProtocol.java +++ b/src/org/traccar/BaseProtocol.java @@ -35,7 +35,7 @@ public abstract class BaseProtocol implements Protocol { return name; } - public void setSupportedCommands(String[] commands) { + public void setSupportedCommands(String... commands) { supportedCommands.addAll(Arrays.asList(commands)); } diff --git a/src/org/traccar/BaseProtocolEncoder.java b/src/org/traccar/BaseProtocolEncoder.java index 819ccc998..2589e4994 100644 --- a/src/org/traccar/BaseProtocolEncoder.java +++ b/src/org/traccar/BaseProtocolEncoder.java @@ -21,6 +21,10 @@ import org.jboss.netty.handler.codec.oneone.OneToOneEncoder; import org.traccar.model.Command; public abstract class BaseProtocolEncoder extends OneToOneEncoder { + + protected String getUniqueId(long deviceId) { + return Context.getIdentityManager().getDeviceById(deviceId).getUniqueId(); + } @Override protected Object encode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception { diff --git a/src/org/traccar/protocol/Gps103Protocol.java b/src/org/traccar/protocol/Gps103Protocol.java index 3f04ede4e..59d8e62a7 100644 --- a/src/org/traccar/protocol/Gps103Protocol.java +++ b/src/org/traccar/protocol/Gps103Protocol.java @@ -15,6 +15,7 @@ */ package org.traccar.protocol; +import java.util.List; import org.jboss.netty.bootstrap.ConnectionlessBootstrap; import org.jboss.netty.bootstrap.ServerBootstrap; import org.jboss.netty.channel.ChannelPipeline; @@ -23,29 +24,19 @@ import org.jboss.netty.handler.codec.string.StringEncoder; import org.traccar.BaseProtocol; import org.traccar.CharacterDelimiterFrameDecoder; import org.traccar.TrackerServer; - -import java.util.List; +import org.traccar.model.Command; public class Gps103Protocol extends BaseProtocol { public Gps103Protocol() { super("gps103"); + setSupportedCommands( + Command.TYPE_POSITION_STOP, + Command.TYPE_POSITION_FIX, + Command.TYPE_ENGINE_STOP, + Command.TYPE_ENGINE_RESUME); } - /*@Override - protected void initCommandsTemplates(Map templates) { - templates.put(CommandType.STOP_POSITIONING, new StringCommandTemplate("**,imei:[%s],A", Command.UNIQUE_ID)); - templates.put(CommandType.FIX_POSITIONING, new StringCommandTemplate("**,imei:[%s],C,[%s]", Command.UNIQUE_ID, FixPositioningCommand.FREQUENCY) - .addConverter(Duration.class, new CommandValueConversion() { - @Override - public String convert(Duration value) { - return String.format("%02d%s", value.getValue(), value.getUnit().getCommandFormat()); - } - })); - templates.put(CommandType.RESUME_ENGINE, new StringCommandTemplate("**,imei:[%s],J", Command.UNIQUE_ID)); - templates.put(CommandType.STOP_ENGINE, new StringCommandTemplate("**,imei:[%s],K", Command.UNIQUE_ID)); - }*/ - @Override public void initTrackerServers(List serverList) { serverList.add(new TrackerServer(new ServerBootstrap(), this.getName()) { @@ -55,6 +46,7 @@ public class Gps103Protocol extends BaseProtocol { pipeline.addLast("stringDecoder", new StringDecoder()); pipeline.addLast("stringEncoder", new StringEncoder()); pipeline.addLast("objectDecoder", new Gps103ProtocolDecoder(Gps103Protocol.this)); + pipeline.addLast("objectEncoder", new Gps103ProtocolEncoder()); } }); serverList.add(new TrackerServer(new ConnectionlessBootstrap(), this.getName()) { @@ -63,6 +55,7 @@ public class Gps103Protocol extends BaseProtocol { pipeline.addLast("stringDecoder", new StringDecoder()); pipeline.addLast("stringEncoder", new StringEncoder()); pipeline.addLast("objectDecoder", new Gps103ProtocolDecoder(Gps103Protocol.this)); + pipeline.addLast("objectEncoder", new Gps103ProtocolEncoder()); } }); } diff --git a/src/org/traccar/protocol/Gps103ProtocolEncoder.java b/src/org/traccar/protocol/Gps103ProtocolEncoder.java new file mode 100644 index 000000000..d7cddd1ba --- /dev/null +++ b/src/org/traccar/protocol/Gps103ProtocolEncoder.java @@ -0,0 +1,65 @@ +/* + * Copyright 2015 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 java.util.Map; +import org.traccar.BaseProtocolEncoder; +import org.traccar.model.Command; + +public class Gps103ProtocolEncoder extends BaseProtocolEncoder { + + /*@Override + protected void initCommandsTemplates(Map templates) { + templates.put(CommandType.FIX_POSITIONING, new StringCommandTemplate("**,imei:[%s],C,[%s]", Command.UNIQUE_ID, FixPositioningCommand.FREQUENCY) + .addConverter(Duration.class, new CommandValueConversion() { + @Override + public String convert(Duration value) { + return String.format("%02d%s", value.getValue(), value.getUnit().getCommandFormat()); + } + })); + }*/ + + private String formatCommand(String format, Command command) { + + String result = format; + + result = result.replaceAll("\\{uniqueId}", getUniqueId(command.getDeviceId())); + for (Map.Entry entry : command.getOther().entrySet()) { + result = result.replaceAll("\\{" + entry.getKey() + "}", entry.getValue().toString()); + } + + return result; + } + + + @Override + protected Object encodeCommand(Command command) { + + switch (command.getType()) { + case Command.TYPE_POSITION_STOP: + return formatCommand("**,imei:{uniqueId},A", command); + case Command.TYPE_POSITION_FIX: + return formatCommand("**,imei:{uniqueId},C,{time}", command); // TODO + case Command.TYPE_ENGINE_STOP: + return formatCommand("**,imei:{uniqueId},K", command); + case Command.TYPE_ENGINE_RESUME: + return formatCommand("**,imei:{uniqueId},J", command); + } + + return null; + } + +} -- cgit v1.2.3