diff options
Diffstat (limited to 'src/org/traccar/protocol/AplicomProtocolDecoder.java')
-rw-r--r-- | src/org/traccar/protocol/AplicomProtocolDecoder.java | 257 |
1 files changed, 124 insertions, 133 deletions
diff --git a/src/org/traccar/protocol/AplicomProtocolDecoder.java b/src/org/traccar/protocol/AplicomProtocolDecoder.java index 9e0bddfcb..4f081b2eb 100644 --- a/src/org/traccar/protocol/AplicomProtocolDecoder.java +++ b/src/org/traccar/protocol/AplicomProtocolDecoder.java @@ -25,6 +25,7 @@ import org.traccar.BaseProtocolDecoder; import org.traccar.Context; import org.traccar.helper.ChannelBufferTools; import org.traccar.helper.Checksum; +import org.traccar.helper.Log; import org.traccar.helper.UnitsConverter; import org.traccar.model.Event; import org.traccar.model.Position; @@ -78,10 +79,120 @@ public class AplicomProtocolDecoder extends BaseProtocolDecoder { private static final int EVENT_DATA = 119; + private void decodeEventData(int event, ChannelBuffer buf) { + switch (event) { + case 2: + case 40: + buf.readUnsignedByte(); + break; + case 9: + buf.readUnsignedMedium(); + break; + case 31: + case 32: + buf.readUnsignedShort(); + break; + case 38: + buf.skipBytes(4 * 9); + break; + case 113: + buf.readUnsignedInt(); + buf.readUnsignedByte(); + break; + case 121: + case 142: + buf.readLong(); + break; + case 130: + buf.readUnsignedInt(); // incorrect + break; + default: + break; + } + } + + private void decodeCanData(ChannelBuffer buf, Position position) { + + buf.readUnsignedMedium(); // packet identifier + buf.readUnsignedByte(); // version + int count = buf.readUnsignedByte(); + buf.readUnsignedByte(); // batch count + buf.readUnsignedShort(); // selector bit + buf.readUnsignedInt(); // timestamp + + buf.skipBytes(8); + + ArrayList<ChannelBuffer> values = new ArrayList<>(count); + + for (int i = 0; i < count; i++) { + values.add(buf.readBytes(8)); + } + + for (int i = 0; i < count; i++) { + ChannelBuffer value = values.get(i); + switch (buf.readInt()) { + case 0x20D: + position.set(Event.KEY_RPM, ChannelBuffers.swapShort(value.readShort())); + position.set("diesel-temperature", ChannelBuffers.swapShort(value.readShort()) * 0.1); + position.set("battery-voltage", ChannelBuffers.swapShort(value.readShort()) * 0.01); + position.set("supply-air-temp-dep1", ChannelBuffers.swapShort(value.readShort()) * 0.1); + break; + case 0x30D: + position.set("active-alarm", ChannelBufferTools.readHexString(value, 16)); + break; + case 0x40C: + position.set("air-temp-dep1", ChannelBuffers.swapShort(value.readShort()) * 0.1); + position.set("air-temp-dep2", ChannelBuffers.swapShort(value.readShort()) * 0.1); + break; + case 0x40D: + position.set("cold-unit-state", ChannelBufferTools.readHexString(value, 16)); + break; + case 0x50C: + position.set("defrost-temp-dep1", ChannelBuffers.swapShort(value.readShort()) * 0.1); + position.set("defrost-temp-dep2", ChannelBuffers.swapShort(value.readShort()) * 0.1); + break; + case 0x50D: + position.set("condenser-pressure", ChannelBuffers.swapShort(value.readShort()) * 0.1); + position.set("suction-pressure", ChannelBuffers.swapShort(value.readShort()) * 0.1); + break; + case 0x58C: + value.readByte(); + value.readShort(); // index + switch (value.readByte()) { + case 0x01: + position.set("setpoint-zone1", ChannelBuffers.swapInt(value.readInt()) * 0.1); + break; + case 0x02: + position.set("setpoint-zone2", ChannelBuffers.swapInt(value.readInt()) * 0.1); + break; + case 0x05: + position.set("unit-type", ChannelBuffers.swapInt(value.readInt())); + break; + case 0x13: + position.set("diesel-hours", ChannelBuffers.swapInt(value.readInt()) / 60 / 60); + break; + case 0x14: + position.set("electric-hours", ChannelBuffers.swapInt(value.readInt()) / 60 / 60); + break; + case 0x17: + position.set("service-indicator", ChannelBuffers.swapInt(value.readInt())); + break; + case 0x18: + position.set("software-version", ChannelBuffers.swapInt(value.readInt()) * 0.01); + break; + default: + break; + } + break; + default: + Log.warning(new UnsupportedOperationException()); + break; + } + } + } + @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) - throws Exception { + protected Object decode(Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { ChannelBuffer buf = (ChannelBuffer) msg; @@ -97,13 +208,11 @@ public class AplicomProtocolDecoder extends BaseProtocolDecoder { buf.readUnsignedShort(); // length - // Selector - int selector = DEFAULT_SELECTOR; // default selector + int selector = DEFAULT_SELECTOR; if ((version & 0x40) != 0) { selector = buf.readUnsignedMedium(); } - // Create new position Position position = new Position(); position.setProtocol(getProtocolName()); if (!identify(imei, channel)) { @@ -112,24 +221,20 @@ public class AplicomProtocolDecoder extends BaseProtocolDecoder { position.setDeviceId(getDeviceId()); - // Event int event = buf.readUnsignedByte(); position.set(Event.KEY_EVENT, event); buf.readUnsignedByte(); - // Validity if ((selector & 0x0008) != 0) { position.setValid((buf.readUnsignedByte() & 0x40) != 0); } else { return null; // no location data } - // Time if ((selector & 0x0004) != 0) { buf.skipBytes(4); // snapshot time } - // Location if ((selector & 0x0008) != 0) { position.setTime(new Date(buf.readUnsignedInt() * 1000)); position.setLatitude(buf.readInt() / 1000000.0); @@ -137,19 +242,16 @@ public class AplicomProtocolDecoder extends BaseProtocolDecoder { position.set(Event.KEY_SATELLITES, buf.readUnsignedByte()); } - // Speed and heading if ((selector & 0x0010) != 0) { position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte())); buf.readUnsignedByte(); // maximum speed position.setCourse(buf.readUnsignedByte() * 2.0); } - // Input if ((selector & 0x0040) != 0) { position.set(Event.KEY_INPUT, buf.readUnsignedByte()); } - // ADC if ((selector & 0x0020) != 0) { position.set(Event.PREFIX_ADC + 1, buf.readUnsignedShort()); position.set(Event.PREFIX_ADC + 2, buf.readUnsignedShort()); @@ -157,7 +259,6 @@ public class AplicomProtocolDecoder extends BaseProtocolDecoder { position.set(Event.PREFIX_ADC + 4, buf.readUnsignedShort()); } - // Power if ((selector & 0x8000) != 0) { position.set(Event.KEY_POWER, buf.readUnsignedShort() / 1000.0); position.set(Event.KEY_BATTERY, buf.readUnsignedShort()); @@ -175,160 +276,50 @@ public class AplicomProtocolDecoder extends BaseProtocolDecoder { buf.readUnsignedInt(); } - // Trip 1 if ((selector & 0x0080) != 0) { position.set("trip1", buf.readUnsignedInt()); } - // Trip 2 if ((selector & 0x0100) != 0) { position.set("trip2", buf.readUnsignedInt()); } - // Output if ((selector & 0x0040) != 0) { position.set(Event.KEY_OUTPUT, buf.readUnsignedByte()); } - // Button if ((selector & 0x0200) != 0) { - buf.skipBytes(6); + buf.skipBytes(6); // button } - // Keypad if ((selector & 0x0400) != 0) { - buf.readUnsignedByte(); + buf.readUnsignedByte(); // Keypad } - // Altitude if ((selector & 0x0800) != 0) { position.setAltitude(buf.readShort()); } - // Snapshot counter if ((selector & 0x2000) != 0) { - buf.readUnsignedShort(); + buf.readUnsignedShort(); // snapshot counter } - // State flags if ((selector & 0x4000) != 0) { - buf.skipBytes(8); + buf.skipBytes(8); // state flags } - // Cell info if ((selector & 0x80000) != 0) { - buf.skipBytes(11); + buf.skipBytes(11); // cell info } - // Event specific data if ((selector & 0x1000) != 0) { - switch (event) { - case 2: - case 40: - buf.readUnsignedByte(); - break; - case 9: - buf.readUnsignedMedium(); - break; - case 31: - case 32: - buf.readUnsignedShort(); - break; - case 38: - buf.skipBytes(4 * 9); - break; - case 113: - buf.readUnsignedInt(); - buf.readUnsignedByte(); - break; - case 121: - case 142: - buf.readLong(); - break; - case 130: - buf.readUnsignedInt(); // incorrect - break; - default: - break; - } + decodeEventData(event, buf); } - if (Context.getConfig().getBoolean(getProtocolName() + ".can") && - buf.readable() && (selector & 0x1000) != 0 && event == EVENT_DATA) { - - buf.readUnsignedMedium(); // packet identifier - buf.readUnsignedByte(); // version - int count = buf.readUnsignedByte(); - buf.readUnsignedByte(); // batch count - buf.readUnsignedShort(); // selector bit - buf.readUnsignedInt(); // timestamp - - buf.skipBytes(8); + if (Context.getConfig().getBoolean(getProtocolName() + ".can") + && buf.readable() && (selector & 0x1000) != 0 && event == EVENT_DATA) { - ArrayList<ChannelBuffer> values = new ArrayList<>(count); - - for (int i = 0; i < count; i++) { - values.add(buf.readBytes(8)); - } - - for (int i = 0; i < count; i++) { - ChannelBuffer value = values.get(i); - switch (buf.readInt()) { - case 0x20D: - position.set(Event.KEY_RPM, ChannelBuffers.swapShort(value.readShort())); - position.set("diesel-temperature", ChannelBuffers.swapShort(value.readShort()) * 0.1); - position.set("battery-voltage", ChannelBuffers.swapShort(value.readShort()) * 0.01); - position.set("supply-air-temp-dep1", ChannelBuffers.swapShort(value.readShort()) * 0.1); - break; - case 0x30D: - position.set("active-alarm", ChannelBufferTools.readHexString(value, 16)); - break; - case 0x40C: - position.set("air-temp-dep1", ChannelBuffers.swapShort(value.readShort()) * 0.1); - position.set("air-temp-dep2", ChannelBuffers.swapShort(value.readShort()) * 0.1); - break; - case 0x40D: - position.set("cold-unit-state", ChannelBufferTools.readHexString(value, 16)); - break; - case 0x50C: - position.set("defrost-temp-dep1", ChannelBuffers.swapShort(value.readShort()) * 0.1); - position.set("defrost-temp-dep2", ChannelBuffers.swapShort(value.readShort()) * 0.1); - break; - case 0x50D: - position.set("condenser-pressure", ChannelBuffers.swapShort(value.readShort()) * 0.1); - position.set("suction-pressure", ChannelBuffers.swapShort(value.readShort()) * 0.1); - break; - case 0x58C: - value.readByte(); - value.readShort(); // index - switch (value.readByte()) { - case 0x01: - position.set("setpoint-zone1", ChannelBuffers.swapInt(value.readInt()) * 0.1); - break; - case 0x02: - position.set("setpoint-zone2", ChannelBuffers.swapInt(value.readInt()) * 0.1); - break; - case 0x05: - position.set("unit-type", ChannelBuffers.swapInt(value.readInt())); - break; - case 0x13: - position.set("diesel-hours", ChannelBuffers.swapInt(value.readInt()) / 60 / 60); - break; - case 0x14: - position.set("electric-hours", ChannelBuffers.swapInt(value.readInt()) / 60 / 60); - break; - case 0x17: - position.set("service-indicator", ChannelBuffers.swapInt(value.readInt())); - break; - case 0x18: - position.set("software-version", ChannelBuffers.swapInt(value.readInt()) * 0.01); - break; - default: - break; - } - break; - } - } + decodeCanData(buf, position); } return position; |