aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/traccar/protocol/IotmProtocolDecoder.java207
1 files changed, 151 insertions, 56 deletions
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);
}
}