diff options
author | Ivan Muratov <binakot@gmail.com> | 2017-07-13 08:30:35 +0300 |
---|---|---|
committer | Ivan Muratov <binakot@gmail.com> | 2017-07-13 08:30:35 +0300 |
commit | 6e70a873886b366980423e448808b60c624e4047 (patch) | |
tree | 905021251f4174ab2eb4d01ff2587c86e1b8314a /src/org/traccar/protocol/Arnavi4FrameDecoder.java | |
parent | 2e0ed3ccfde8f779111de2b722a94224faa65c99 (diff) | |
download | traccar-server-6e70a873886b366980423e448808b60c624e4047.tar.gz traccar-server-6e70a873886b366980423e448808b60c624e4047.tar.bz2 traccar-server-6e70a873886b366980423e448808b60c624e4047.zip |
Basic ARNAVI4 binary protocol implementation is done.
Supported 2 types of HEADER packets (v1, v2).
Supported 3 types of PACKAGE DATA records: latitude, longitude and additional data (speed, satellites, altitude, course).
Diffstat (limited to 'src/org/traccar/protocol/Arnavi4FrameDecoder.java')
-rw-r--r-- | src/org/traccar/protocol/Arnavi4FrameDecoder.java | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/org/traccar/protocol/Arnavi4FrameDecoder.java b/src/org/traccar/protocol/Arnavi4FrameDecoder.java new file mode 100644 index 000000000..eaf829cc3 --- /dev/null +++ b/src/org/traccar/protocol/Arnavi4FrameDecoder.java @@ -0,0 +1,51 @@ +package org.traccar.protocol; + +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; + +/** + * Created by Ivan Muratov @binakot on 12.07.2017. + */ +public class Arnavi4FrameDecoder extends FrameDecoder { + + static final byte HEADER_START_SIGN = (byte)0xFF; + static final byte HEADER_VERSION_1 = 0x22; + static final byte HEADER_VERSION_2 = 0x23; + static final int HEADER_LENGTH = 10; + + static final byte PACKAGE_START_SIGN = 0x5B; + static final byte PACKAGE_END_SIGN = 0x5D; + static final int PACKAGE_MIN_PARCEL_NUMBER = 0x01; + static final int PACKAGE_MAX_PARCEL_NUMBER = 0xFB; + + @Override + protected Object decode( + ChannelHandlerContext ctx, + Channel channel, + ChannelBuffer buf) throws Exception { + + if (buf.readableBytes() == 0) { + return null; + } + + byte[] bytes = new byte[buf.readableBytes()]; + buf.getBytes(0, bytes); + + if (bytes[0] == HEADER_START_SIGN + && bytes.length == HEADER_LENGTH + && (bytes[1] == HEADER_VERSION_1 || bytes[1] == HEADER_VERSION_2)) { + return buf.readBytes(HEADER_LENGTH); + } + + int parcelNumber = bytes[1] & 0xFF; + if (bytes[0] == PACKAGE_START_SIGN && bytes[bytes.length - 1] == PACKAGE_END_SIGN + && parcelNumber >= PACKAGE_MIN_PARCEL_NUMBER && parcelNumber <= PACKAGE_MAX_PARCEL_NUMBER) { + return buf.readBytes(bytes.length); + } + + return null; + } + +} |