diff options
Diffstat (limited to 'src/main/java/org/traccar/protocol/Minifinder2ProtocolDecoder.java')
-rw-r--r-- | src/main/java/org/traccar/protocol/Minifinder2ProtocolDecoder.java | 218 |
1 files changed, 96 insertions, 122 deletions
diff --git a/src/main/java/org/traccar/protocol/Minifinder2ProtocolDecoder.java b/src/main/java/org/traccar/protocol/Minifinder2ProtocolDecoder.java index 2d6bde89f..ad73e7642 100644 --- a/src/main/java/org/traccar/protocol/Minifinder2ProtocolDecoder.java +++ b/src/main/java/org/traccar/protocol/Minifinder2ProtocolDecoder.java @@ -85,22 +85,18 @@ public class Minifinder2ProtocolDecoder extends BaseProtocolDecoder { int endIndex = buf.readUnsignedByte() + buf.readerIndex(); int key = buf.readUnsignedByte(); switch (key) { - case 0x11: - case 0x21: - case 0x22: + case 0x11, 0x21, 0x22 -> { body.writeByte(9 + 1); // length body.writeByte(key); body.writeIntLE(0); // latitude body.writeIntLE(0); // longitude body.writeByte(0); // address - break; - case 0x12: + } + case 0x12 -> { body.writeByte(5); // length body.writeByte(key); body.writeIntLE((int) (System.currentTimeMillis() / 1000)); - break; - default: - break; + } } buf.readerIndex(endIndex); } @@ -161,7 +157,8 @@ public class Minifinder2ProtocolDecoder extends BaseProtocolDecoder { DeviceSession deviceSession = null; while (buf.isReadable()) { - int endIndex = buf.readUnsignedByte() + buf.readerIndex(); + int length = buf.readUnsignedByte(); + int endIndex = buf.readerIndex() + length; int key = buf.readUnsignedByte(); if (keys.contains(key)) { @@ -185,6 +182,9 @@ public class Minifinder2ProtocolDecoder extends BaseProtocolDecoder { if (BitUtil.check(alarm, 31)) { position.set("bark", true); } + if (length == 5) { + position.setDeviceTime(new Date(buf.readUnsignedIntLE() * 1000)); + } break; case 0x14: position.set(Position.KEY_BATTERY_LEVEL, buf.readUnsignedByte()); @@ -203,6 +203,7 @@ public class Minifinder2ProtocolDecoder extends BaseProtocolDecoder { position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); break; case 0x21: + case 0x29: int mcc = buf.readUnsignedShortLE(); int mnc = buf.readUnsignedByte(); if (position.getNetwork() == null) { @@ -210,8 +211,14 @@ public class Minifinder2ProtocolDecoder extends BaseProtocolDecoder { } while (buf.readerIndex() < endIndex) { int rssi = buf.readByte(); - position.getNetwork().addCellTower(CellTower.from( - mcc, mnc, buf.readUnsignedShortLE(), buf.readUnsignedShortLE(), rssi)); + int lac = buf.readUnsignedShortLE(); + long cid; + if (key == 0x29) { + cid = buf.readLongLE(); + } else { + cid = buf.readUnsignedShortLE(); + } + position.getNetwork().addCellTower(CellTower.from(mcc, mnc, lac, cid, rssi)); } break; case 0x22: @@ -226,10 +233,22 @@ public class Minifinder2ProtocolDecoder extends BaseProtocolDecoder { } break; case 0x23: - position.set("tagId", readTagId(buf)); - position.setLatitude(buf.readIntLE() * 0.0000001); - position.setLongitude(buf.readIntLE() * 0.0000001); - position.setValid(true); + case 0x26: + if (length >= 7) { + position.set("tagId", readTagId(buf)); + } + if (length >= 15) { + position.setLatitude(buf.readIntLE() * 0.0000001); + position.setLongitude(buf.readIntLE() * 0.0000001); + position.setValid(true); + } + if (key == 0x26) { + position.set(Position.KEY_HDOP, buf.readUnsignedShortLE() * 0.1); + position.setAltitude(buf.readShortLE()); + } else if (length > 15) { + position.set("description", buf.readCharSequence( + length, StandardCharsets.US_ASCII).toString()); + } break; case 0x24: position.setTime(new Date(buf.readUnsignedIntLE() * 1000)); @@ -245,6 +264,13 @@ public class Minifinder2ProtocolDecoder extends BaseProtocolDecoder { position.set(Position.KEY_BATTERY_LEVEL, BitUtil.from(status, 24)); position.set(Position.KEY_STATUS, status); break; + case 0x27: + position.setLatitude(buf.readIntLE() * 0.0000001); + position.setLongitude(buf.readIntLE() * 0.0000001); + position.setValid(true); + position.set(Position.KEY_HDOP, buf.readUnsignedShortLE() * 0.1); + position.setAltitude(buf.readShortLE()); + break; case 0x28: int beaconFlags = buf.readUnsignedByte(); position.set("tagId", readTagId(buf)); @@ -267,6 +293,10 @@ public class Minifinder2ProtocolDecoder extends BaseProtocolDecoder { position.setLatitude(buf.readIntLE() * 0.0000001); position.setLongitude(buf.readIntLE() * 0.0000001); position.setValid(true); + if (endIndex > buf.readerIndex()) { + position.set("description", buf.readCharSequence( + endIndex - buf.readerIndex(), StandardCharsets.US_ASCII).toString()); + } break; case 0x30: buf.readUnsignedIntLE(); // timestamp @@ -367,145 +397,89 @@ public class Minifinder2ProtocolDecoder extends BaseProtocolDecoder { int key = buf.readUnsignedByte(); switch (key) { - case 0x01: - position.set("moduleNumber", buf.readUnsignedInt()); - break; - case 0x02: - position.set(Position.KEY_VERSION_FW, String.valueOf(buf.readUnsignedInt())); - break; - case 0x03: - position.set("imei", buf.readCharSequence(length, StandardCharsets.US_ASCII).toString()); - break; - case 0x04: - position.set(Position.KEY_ICCID, BufferUtil.readString(buf, length)); - break; - case 0x05: - position.set("bleMac", ByteBufUtil.hexDump(buf.readSlice(length))); - break; - case 0x06: - position.set("settingTime", buf.readUnsignedInt()); - break; - case 0x07: - position.set("runTimes", buf.readUnsignedInt()); - break; - case 0x0A: + case 0x01 -> position.set("moduleNumber", buf.readUnsignedInt()); + case 0x02 -> position.set(Position.KEY_VERSION_FW, String.valueOf(buf.readUnsignedInt())); + case 0x03 -> position.set("imei", buf.readCharSequence(length, StandardCharsets.US_ASCII).toString()); + case 0x04 -> position.set(Position.KEY_ICCID, BufferUtil.readString(buf, length)); + case 0x05 -> position.set("bleMac", ByteBufUtil.hexDump(buf.readSlice(length))); + case 0x06 -> position.set("settingTime", buf.readUnsignedInt()); + case 0x07 -> position.set("runTimes", buf.readUnsignedInt()); + case 0x0A -> { position.set("interval", buf.readUnsignedMedium()); position.set("petMode", buf.readUnsignedByte()); - break; - case 0x0D: - position.set("passwordProtect", buf.readUnsignedInt()); - break; - case 0x0E: - position.set("timeZone", (int) buf.readByte()); - break; - case 0x0F: - position.set("enableControl", buf.readUnsignedInt()); - break; - case 0x13: - position.set("deviceName", BufferUtil.readString(buf, length)); - break; - case 0x14: + } + case 0x0D -> position.set("passwordProtect", buf.readUnsignedInt()); + case 0x0E -> position.set("timeZone", (int) buf.readByte()); + case 0x0F -> position.set("enableControl", buf.readUnsignedInt()); + case 0x13 -> position.set("deviceName", BufferUtil.readString(buf, length)); + case 0x14 -> { position.set(Position.KEY_BATTERY_LEVEL, buf.readUnsignedByte()); position.set(Position.KEY_BATTERY, buf.readUnsignedShort() * 0.001); - break; - case 0x15: + } + case 0x15 -> { position.set("bleLatitude", buf.readIntLE() * 0.0000001); position.set("bleLongitude", buf.readIntLE() * 0.0000001); position.set("bleLocation", BufferUtil.readString(buf, length - 8)); - break; - case 0x17: - position.set("gpsUrl", BufferUtil.readString(buf, length)); - break; - case 0x18: - position.set("lbsUrl", BufferUtil.readString(buf, length)); - break; - case 0x1A: - position.set("firmware", BufferUtil.readString(buf, length)); - break; - case 0x1B: - position.set("gsmModule", BufferUtil.readString(buf, length)); - break; - case 0x1D: + } + case 0x17 -> position.set("gpsUrl", BufferUtil.readString(buf, length)); + case 0x18 -> position.set("lbsUrl", BufferUtil.readString(buf, length)); + case 0x1A -> position.set("firmware", BufferUtil.readString(buf, length)); + case 0x1B -> position.set("gsmModule", BufferUtil.readString(buf, length)); + case 0x1D -> { position.set("agpsUpdate", buf.readUnsignedByte()); position.set("agpsLatitude", buf.readIntLE() * 0.0000001); position.set("agpsLongitude", buf.readIntLE() * 0.0000001); - break; - case 0x30: + } + case 0x30 -> { position.set("numberFlag", buf.readUnsignedByte()); position.set("number", BufferUtil.readString(buf, length - 1)); - break; - case 0x31: + } + case 0x31 -> { position.set("prefixFlag", buf.readUnsignedByte()); position.set("prefix", BufferUtil.readString(buf, length - 1)); - break; - case 0x33: - position.set("phoneSwitches", buf.readUnsignedByte()); - break; - case 0x40: - position.set("apn", BufferUtil.readString(buf, length)); - break; - case 0x41: - position.set("apnUser", BufferUtil.readString(buf, length)); - break; - case 0x42: - position.set("apnPassword", BufferUtil.readString(buf, length)); - break; - case 0x43: + } + case 0x33 -> position.set("phoneSwitches", buf.readUnsignedByte()); + case 0x40 -> position.set("apn", BufferUtil.readString(buf, length)); + case 0x41 -> position.set("apnUser", BufferUtil.readString(buf, length)); + case 0x42 -> position.set("apnPassword", BufferUtil.readString(buf, length)); + case 0x43 -> { buf.readUnsignedByte(); // flag position.set("port", buf.readUnsignedShort()); position.set("server", BufferUtil.readString(buf, length - 3)); - break; - case 0x44: + } + case 0x44 -> { position.set("heartbeatInterval", buf.readUnsignedInt()); position.set("uploadInterval", buf.readUnsignedInt()); position.set("uploadLazyInterval", buf.readUnsignedInt()); - break; - case 0x47: - position.set("deviceId", BufferUtil.readString(buf, length)); - break; - case 0x4E: - position.set("gsmBand", buf.readUnsignedByte()); - break; - case 0x50: - position.set("powerAlert", buf.readUnsignedInt()); - break; - case 0x51: - position.set("geoAlert", buf.readUnsignedInt()); - break; - case 0x53: - position.set("motionAlert", buf.readUnsignedInt()); - break; - case 0x5C: + } + case 0x47 -> position.set("deviceId", BufferUtil.readString(buf, length)); + case 0x4E -> position.set("gsmBand", buf.readUnsignedByte()); + case 0x50 -> position.set("powerAlert", buf.readUnsignedInt()); + case 0x51 -> position.set("geoAlert", buf.readUnsignedInt()); + case 0x53 -> position.set("motionAlert", buf.readUnsignedInt()); + case 0x5C -> { position.set("barkLevel", buf.readUnsignedByte()); position.set("barkInterval", buf.readUnsignedInt()); - break; - case 0x61: - position.set("msisdn", BufferUtil.readString(buf, length)); - break; - case 0x62: + } + case 0x61 -> position.set("msisdn", BufferUtil.readString(buf, length)); + case 0x62 -> { position.set("wifiWhitelist", buf.readUnsignedByte()); position.set("wifiWhitelistMac", ByteBufUtil.hexDump(buf.readSlice(6))); - break; - case 0x64: + } + case 0x64 -> { position.set(Position.KEY_RSSI, buf.readUnsignedByte()); position.set("networkBand", buf.readUnsignedInt()); position.set(Position.KEY_OPERATOR, BufferUtil.readString(buf, length - 5)); - break; - case 0x65: + } + case 0x65 -> { position.set(Position.KEY_RSSI, buf.readUnsignedByte()); position.set("networkStatus", buf.readUnsignedByte()); position.set("serverStatus", buf.readUnsignedByte()); position.set("networkPlmn", ByteBufUtil.hexDump(buf.readSlice(6))); position.set("homePlmn", ByteBufUtil.hexDump(buf.readSlice(6))); - break; - case 0x66: - position.set("imsi", BufferUtil.readString(buf, length)); - break; - case 0x75: - position.set("extraEnableControl", buf.readUnsignedInt()); - break; - default: - break; + } + case 0x66 -> position.set("imsi", BufferUtil.readString(buf, length)); + case 0x75 -> position.set("extraEnableControl", buf.readUnsignedInt()); } buf.readerIndex(endIndex); |