From 341ef3590a7114e6ab93a5d4b52176105dd71856 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 2 Mar 2017 07:53:16 +1300 Subject: Implement Aplicom F protocol --- .../traccar/protocol/AplicomProtocolDecoder.java | 64 +++++++++++++++++++++- .../protocol/AplicomProtocolDecoderTest.java | 3 + 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/org/traccar/protocol/AplicomProtocolDecoder.java b/src/org/traccar/protocol/AplicomProtocolDecoder.java index daa8844b4..fbd868b86 100644 --- a/src/org/traccar/protocol/AplicomProtocolDecoder.java +++ b/src/org/traccar/protocol/AplicomProtocolDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright 2013 - 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2013 - 2017 Anton Tananaev (anton@traccar.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -78,6 +78,7 @@ public class AplicomProtocolDecoder extends BaseProtocolDecoder { private static final int DEFAULT_SELECTOR_D = 0x0002fC; private static final int DEFAULT_SELECTOR_E = 0x007ffc; + private static final int DEFAULT_SELECTOR_F = 0x0007fd; private static final int EVENT_DATA = 119; @@ -498,6 +499,63 @@ public class AplicomProtocolDecoder extends BaseProtocolDecoder { } } + private void decodeF(Position position, ChannelBuffer buf, int selector) { + + getLastLocation(position, null); + + buf.readUnsignedShort(); // event + + if ((selector & 0x0004) != 0) { + buf.skipBytes(4); // snapshot time + } + + buf.readUnsignedByte(); // data validity + + if ((selector & 0x0008) != 0) { + position.set(Position.KEY_RPM, buf.readUnsignedShort()); + position.set("rpmMax", buf.readUnsignedShort()); + position.set("rpmMin", buf.readUnsignedShort()); + } + + if ((selector & 0x0010) != 0) { + position.set("engineTemp", buf.readShort()); + position.set("engineTempMax", buf.readShort()); + position.set("engineTempMin", buf.readShort()); + } + + if ((selector & 0x0020) != 0) { + position.set(Position.KEY_HOURS, buf.readUnsignedInt()); + position.set("serviceDistance", buf.readInt()); + buf.readUnsignedByte(); // driver activity + position.set(Position.KEY_THROTTLE, buf.readUnsignedByte()); + position.set(Position.KEY_FUEL, buf.readUnsignedByte()); + } + + if ((selector & 0x0040) != 0) { + position.set("totalFuelUsed", buf.readUnsignedInt()); + } + + if ((selector & 0x0080) != 0) { + position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); + } + + if ((selector & 0x0100) != 0) { + position.set(Position.KEY_OBD_SPEED, buf.readUnsignedByte()); + position.set("speedMax", buf.readUnsignedByte()); + position.set("speedMin", buf.readUnsignedByte()); + position.set("hardBreaking", buf.readUnsignedByte()); + } + + if ((selector & 0x0200) != 0) { + buf.readUnsignedByte(); // tachograph based speed + buf.readUnsignedByte(); // driver 1 state + buf.readUnsignedByte(); // driver 2 state + buf.readUnsignedByte(); // tachograph status + position.set("overspeedCount", buf.readUnsignedByte()); + } + + } + @Override protected Object decode(Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { @@ -518,6 +576,8 @@ public class AplicomProtocolDecoder extends BaseProtocolDecoder { int selector = DEFAULT_SELECTOR_D; if (protocol == 'E') { selector = DEFAULT_SELECTOR_E; + } else if (protocol == 'F') { + selector = DEFAULT_SELECTOR_F; } if ((version & 0x40) != 0) { selector = buf.readUnsignedMedium(); @@ -541,6 +601,8 @@ public class AplicomProtocolDecoder extends BaseProtocolDecoder { decodeE(position, buf, selector); } else if (protocol == 'H') { decodeH(position, buf, selector); + } else if (protocol == 'F') { + decodeF(position, buf, selector); } else { return null; } diff --git a/test/org/traccar/protocol/AplicomProtocolDecoderTest.java b/test/org/traccar/protocol/AplicomProtocolDecoderTest.java index cb39b5d2e..38ac1c43f 100644 --- a/test/org/traccar/protocol/AplicomProtocolDecoderTest.java +++ b/test/org/traccar/protocol/AplicomProtocolDecoderTest.java @@ -10,6 +10,9 @@ public class AplicomProtocolDecoderTest extends ProtocolTest { AplicomProtocolDecoder decoder = new AplicomProtocolDecoder(new AplicomProtocol()); + verifyAttributes(decoder, binary( + "46c30144f667c1711f00340007ff75005891601401025707b50236003b003b003500000a9300006bd50100640000a5250167d2f9034c01010107020400021a901004")); + verifyAttributes(decoder, binary( "48C1014143B4493145004900203F6D014B5557C20003000015060110FF00C800000000000000003D01141E283C500100260404010200000000000000000000000000C8000000000000010200110019001E0064019003E8")); -- cgit v1.2.3