aboutsummaryrefslogtreecommitdiff
path: root/src/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/org')
-rw-r--r--src/org/traccar/protocol/Arnavi4FrameDecoder.java16
-rw-r--r--src/org/traccar/protocol/Arnavi4ProtocolDecoder.java4
2 files changed, 14 insertions, 6 deletions
diff --git a/src/org/traccar/protocol/Arnavi4FrameDecoder.java b/src/org/traccar/protocol/Arnavi4FrameDecoder.java
index a50ece641..bb130e6bb 100644
--- a/src/org/traccar/protocol/Arnavi4FrameDecoder.java
+++ b/src/org/traccar/protocol/Arnavi4FrameDecoder.java
@@ -50,10 +50,18 @@ public class Arnavi4FrameDecoder extends FrameDecoder {
return buf.readBytes(HEADER_LENGTH);
}
- int parcelNumber = buf.getByte(1) & 0xFF;
- if (buf.getByte(0) == PACKAGE_START_SIGN && buf.getByte(buf.readableBytes() - 1) == PACKAGE_END_SIGN
- && parcelNumber >= PACKAGE_MIN_PARCEL_NUMBER && parcelNumber <= PACKAGE_MAX_PARCEL_NUMBER) {
- return buf;
+ int index = buf.getByte(1) & 0xFF; // parcel number
+ if (buf.getByte(0) == PACKAGE_START_SIGN
+ && index >= PACKAGE_MIN_PARCEL_NUMBER && index <= PACKAGE_MAX_PARCEL_NUMBER) {
+
+ // package: 1 byte start sign, 1 byte parcel number, packets, 1 byte end sign
+ int packetStartIndex = 2;
+ while (packetStartIndex + 8 < buf.readableBytes() && buf.getByte(packetStartIndex) != PACKAGE_END_SIGN) {
+ // packet: 1 byte type, 2 bytes length, 4 bytes unixtime, length-bytes data, 1 byte crc
+ packetStartIndex += buf.getUnsignedShort(packetStartIndex + 1) + 8;
+ }
+
+ return buf.readBytes(packetStartIndex + 1);
}
return null;
diff --git a/src/org/traccar/protocol/Arnavi4ProtocolDecoder.java b/src/org/traccar/protocol/Arnavi4ProtocolDecoder.java
index 07e4d855c..ed11e1559 100644
--- a/src/org/traccar/protocol/Arnavi4ProtocolDecoder.java
+++ b/src/org/traccar/protocol/Arnavi4ProtocolDecoder.java
@@ -153,7 +153,7 @@ public class Arnavi4ProtocolDecoder extends BaseProtocolDecoder {
int index = buf.readUnsignedByte();
byte recordType = buf.readByte();
- while (recordType != PACKAGE_END_SIGN && buf.readableBytes() != 1) { // The last end sign byte
+ while (buf.readableBytes() > 0) {
switch (recordType) {
case RECORD_PING:
case RECORD_DATA:
@@ -176,7 +176,7 @@ public class Arnavi4ProtocolDecoder extends BaseProtocolDecoder {
return null; // Ignore unsupported types of package
}
- recordType = buf.readByte();
+ recordType = buf.readByte(); // The last byte in package is end sign
}
sendPackageResponse(channel, index);