From c2ecf80df96f9782ef716d01678ed33f886a6480 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 1 Oct 2015 15:04:06 +1300 Subject: Fix Luhn checksum calculation --- src/org/traccar/helper/Crc.java | 2 +- src/org/traccar/protocol/MeiligaoProtocolDecoder.java | 5 +---- test/org/traccar/helper/CrcTest.java | 1 + 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/org/traccar/helper/Crc.java b/src/org/traccar/helper/Crc.java index 418ec3132..522a25403 100644 --- a/src/org/traccar/helper/Crc.java +++ b/src/org/traccar/helper/Crc.java @@ -172,7 +172,7 @@ public class Crc { remain /= 10; } - return 10 - (checksum % 10); + return (10 - (checksum % 10)) % 10; } } diff --git a/src/org/traccar/protocol/MeiligaoProtocolDecoder.java b/src/org/traccar/protocol/MeiligaoProtocolDecoder.java index c660107ca..faf3a5baf 100644 --- a/src/org/traccar/protocol/MeiligaoProtocolDecoder.java +++ b/src/org/traccar/protocol/MeiligaoProtocolDecoder.java @@ -98,14 +98,11 @@ public class MeiligaoProtocolDecoder extends BaseProtocolDecoder { } if (id.length() == 14) { + // Try to recreate full IMEI number // Sometimes first digit is cut, so this won't work if (identify(id + Crc.luhnChecksum(Long.valueOf(id)), channel, null, false)) { return true; } - } else if (id.length() > 15) { - if (identify(id.substring(0, 15), channel, null, false)) { - return true; - } } return identify(id, channel); diff --git a/test/org/traccar/helper/CrcTest.java b/test/org/traccar/helper/CrcTest.java index 46e7dfc79..7bd4a0482 100644 --- a/test/org/traccar/helper/CrcTest.java +++ b/test/org/traccar/helper/CrcTest.java @@ -9,6 +9,7 @@ public class CrcTest { public void testLuhnChecksum() { Assert.assertEquals(7, Crc.luhnChecksum(12345678901234L)); + Assert.assertEquals(0, Crc.luhnChecksum(63070019470771L)); } -- cgit v1.2.3