From ae2b6f31de1559805589cbd1a8d9dd1324b3bd58 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 23 Mar 2021 21:53:06 -0700 Subject: Decode additional sensors --- .../org/traccar/protocol/IotmProtocolDecoder.java | 207 +++++++++++++++------ 1 file changed, 151 insertions(+), 56 deletions(-) (limited to 'src/main/java/org/traccar/protocol') diff --git a/src/main/java/org/traccar/protocol/IotmProtocolDecoder.java b/src/main/java/org/traccar/protocol/IotmProtocolDecoder.java index bbb63fb65..9c94ffd4b 100644 --- a/src/main/java/org/traccar/protocol/IotmProtocolDecoder.java +++ b/src/main/java/org/traccar/protocol/IotmProtocolDecoder.java @@ -84,6 +84,156 @@ public class IotmProtocolDecoder extends BaseProtocolDecoder { } } + private void decodeSensor(Position position, ByteBuf record, int sensorType, int sensorId) { + String key; + switch (sensorId) { + case 0x0002: + position.set(Position.KEY_MOTION, sensorType > 0); + break; + case 0x0008: + case 0x009B: + if (sensorType > 0) { + position.set(Position.KEY_ALARM, Position.ALARM_JAMMING); + } + break; + case 0x0010: + case 0x0011: + case 0x0012: + case 0x0013: + case 0x0014: + case 0x0015: + key = Position.PREFIX_IN + (sensorId - 0x0010 + 2); + position.set(key, sensorType > 0); + break; + case 0x0062: + position.set("doorFL", sensorType > 0); + break; + case 0x0063: + position.set("doorFR", sensorType > 0); + break; + case 0x0064: + position.set("doorRL", sensorType > 0); + break; + case 0x0065: + position.set("doorRR", sensorType > 0); + break; + case 0x001E: + position.set("buttonPresent", sensorType > 0); + break; + case 0x006D: + position.set(Position.KEY_IGNITION, sensorType > 0); + break; + case 0x008B: + position.set("handBrake", sensorType > 0); + break; + case 0x008C: + position.set("footBrake", sensorType > 0); + break; + case 0x0094: + case 0x0095: + case 0x0096: + key = Position.PREFIX_OUT + (sensorId - 0x0094 + 1); + position.set(key, sensorType > 0); + break; + case 0x009A: + position.set(Position.PREFIX_OUT + 4, sensorType > 0); + break; + case 0x2000: + position.set(Position.KEY_OBD_SPEED, record.readUnsignedByte()); + break; + case 0x2001: + position.set(Position.KEY_SATELLITES, record.readUnsignedByte()); + break; + case 0x2006: + position.set(Position.KEY_THROTTLE, record.readUnsignedByte()); + break; + case 0x2007: + position.set(Position.KEY_FUEL_LEVEL, record.readUnsignedByte()); + break; + case 0x2008: + position.set(Position.KEY_COOLANT_TEMP, record.readUnsignedByte()); + break; + case 0x2009: + position.set("fuel2", record.readUnsignedByte()); + break; + case 0x200A: + position.set(Position.KEY_ENGINE_LOAD, record.readUnsignedByte()); + break; + case 0x2041: + position.set(Position.KEY_BATTERY_LEVEL, record.readUnsignedByte()); + break; + case 0x3000: + position.set(Position.KEY_POWER, record.readUnsignedShortLE() * 0.001); + break; + case 0x3001: + case 0x3002: + case 0x3003: + key = Position.PREFIX_ADC + (0x3003 - sensorId + 3); + position.set(key, record.readUnsignedShortLE() * 0.001); + break; + case 0x3004: + position.set(Position.KEY_BATTERY, record.readUnsignedShortLE() * 0.001); + break; + case 0x300C: + position.set(Position.KEY_RPM, record.readUnsignedShortLE()); + break; + case 0x3021: + position.set(Position.KEY_FUEL_CONSUMPTION, record.readUnsignedShortLE() * 0.05); + break; + case 0x3037: + position.set("cargoWeight", record.readUnsignedShortLE() * 2); + break; + case 0x4001: + position.set(Position.KEY_FUEL_USED, record.readUnsignedIntLE()); + break; + case 0x4002: + position.set(Position.KEY_HOURS, record.readUnsignedIntLE()); + break; + case 0x4003: + position.set(Position.KEY_ODOMETER, record.readUnsignedIntLE() * 5); + break; + case 0x4063: + position.set(Position.KEY_AXLE_WEIGHT, record.readUnsignedIntLE()); + break; + case 0x5000: + position.set(Position.KEY_DRIVER_UNIQUE_ID, String.valueOf(record.readLongLE())); + break; + case 0x5004: + case 0x5005: + case 0x5006: + case 0x5007: + key = Position.PREFIX_TEMP + (sensorId - 0x5004 + 1); + position.set(key, record.readLongLE()); + break; + case 0x500D: + position.set("trailerId", String.valueOf(record.readLongLE())); + break; + case 0xA000: + position.set(Position.KEY_DEVICE_TEMP, record.readFloatLE()); + break; + case 0xA001: + position.set(Position.KEY_ACCELERATION, record.readFloatLE()); + break; + case 0xA002: + position.set("cornering", record.readFloatLE()); + break; + case 0xA017: + case 0xA018: + case 0xA019: + case 0xA01A: + key = Position.PREFIX_TEMP + (sensorId - 0xA017 + 1); + position.set(key, record.readFloatLE()); + break; + case 0xB002: + position.set(Position.KEY_OBD_ODOMETER, record.readDoubleLE()); + break; + default: + key = Position.PREFIX_IO + sensorId; + position.getAttributes().put(key, readValue(record, sensorType)); + break; + } + } + @Override protected Object decode( Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { @@ -163,62 +313,7 @@ public class IotmProtocolDecoder extends BaseProtocolDecoder { continue; } - String key; - switch (sensorId) { - case 0x0008: - if (sensorType > 0) { - position.set(Position.KEY_ALARM, Position.ALARM_JAMMING); - } - break; - case 0x0010: - case 0x0011: - case 0x0012: - case 0x0013: - key = Position.PREFIX_IN + (sensorId - 0x0010 + 2); - position.set(key, sensorType > 0); - break; - case 0x001E: - position.set("buttonPresent", sensorType > 0); - break; - case 0x006D: - position.set(Position.KEY_IGNITION, sensorType > 0); - break; - case 0x3000: - position.set(Position.KEY_POWER, record.readUnsignedShortLE() * 0.001); - break; - case 0x3001: - case 0x3002: - case 0x3003: - key = Position.PREFIX_ADC + (0x3003 - sensorId + 3); - position.set(key, record.readUnsignedShortLE() * 0.001); - break; - case 0x3004: - position.set(Position.KEY_BATTERY, record.readUnsignedShortLE() * 0.001); - break; - case 0x300C: - position.set(Position.KEY_RPM, record.readUnsignedShortLE()); - break; - case 0x4003: - position.set(Position.KEY_ODOMETER, record.readUnsignedIntLE() * 5); - break; - case 0x5000: - position.set(Position.KEY_DRIVER_UNIQUE_ID, String.valueOf(record.readLongLE())); - break; - case 0xA001: - position.set(Position.KEY_ACCELERATION, record.readFloatLE()); - break; - case 0xA002: - position.set("cornering", record.readFloatLE()); - break; - case 0xA017: - key = Position.PREFIX_TEMP + (sensorId - 0xA017 + 1); - position.set(key, record.readFloatLE()); - break; - default: - key = Position.PREFIX_IO + sensorId; - position.getAttributes().put(key, readValue(record, sensorType)); - break; - } + decodeSensor(position, record, sensorType, sensorId); } } -- cgit v1.2.3