diff options
author | Anton Tananaev <anton.tananaev@gmail.com> | 2015-07-29 11:33:50 +1200 |
---|---|---|
committer | Anton Tananaev <anton.tananaev@gmail.com> | 2015-07-29 11:33:50 +1200 |
commit | 411f631b6a9dd898476b43d342180db02e45dd9c (patch) | |
tree | d09700692aeadadda1f369d853327f45296e1cc5 | |
parent | 41f88170ba9c47a20a0dda9cb42a2fa151c57ade (diff) | |
download | trackermap-server-411f631b6a9dd898476b43d342180db02e45dd9c.tar.gz trackermap-server-411f631b6a9dd898476b43d342180db02e45dd9c.tar.bz2 trackermap-server-411f631b6a9dd898476b43d342180db02e45dd9c.zip |
Fix Totem frame decoder
-rw-r--r-- | src/org/traccar/protocol/TotemFrameDecoder.java | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/src/org/traccar/protocol/TotemFrameDecoder.java b/src/org/traccar/protocol/TotemFrameDecoder.java index 6f7c3a37c..0b1a3e7c2 100644 --- a/src/org/traccar/protocol/TotemFrameDecoder.java +++ b/src/org/traccar/protocol/TotemFrameDecoder.java @@ -19,7 +19,8 @@ import java.nio.charset.Charset; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; +import org.jboss.netty.handler.codec.frame.FrameDecoder; +import org.traccar.helper.ChannelBufferTools; public class TotemFrameDecoder extends FrameDecoder { @@ -28,27 +29,26 @@ public class TotemFrameDecoder extends FrameDecoder { ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - + // Check minimum length if (buf.readableBytes() < 10) { return null; } - - // Trim end line - if (buf.getUnsignedShort(buf.readerIndex()) == 0x0d0a) { - buf.skipBytes(2); + + // Find start + Integer beginIndex = ChannelBufferTools.find(buf, buf.readerIndex(), "$$"); + if (beginIndex == null) { + return null; + } else if (beginIndex > buf.readerIndex()) { + buf.readerIndex(beginIndex); } - - if(buf.toString(buf.readerIndex(), 2, Charset.defaultCharset()).equals("$$")){ - int length = Integer.parseInt(buf.toString(buf.readerIndex() + 2, 2, Charset.defaultCharset()), 16); - if (length <= buf.readableBytes()) { - return buf.readBytes(length); - } - }else{ - //TODO: notify to user the GPS response - return buf.readBytes(buf.readableBytes()); + + // Read message + int length = Integer.parseInt(buf.toString(buf.readerIndex() + 2, 2, Charset.defaultCharset()), 16); + if (length <= buf.readableBytes()) { + return buf.readBytes(length); } - + return null; } |