Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to validate IMEI Number?

Tags:

c

vb.net

imei

For a mobile shop application, I need to validate an IMEI number. I know how to validate based on input length, but is their any other mechanism for validating the input number? Is there any built-in function that can achieve this?

Logic from any language is accepted, and appreciated.

like image 575
Kichu Avatar asked Aug 10 '14 14:08

Kichu


2 Answers

A search suggests that there isn't a built-in function that will validate an IMEI number, but there is a validation method using the Luhn algorithm.

General process:

  1. Input IMEI: 490154203237518
  2. Take off the last digit, and remember it: 49015420323751 & 8. This last digit 8 is the validation digit.
  3. Double each second digit in the IMEI: 4 18 0 2 5 8 2 0 3 4 3 14 5 2 (excluding the validation digit)
  4. Separate this number into single digits: 4 1 8 0 2 5 8 2 0 3 4 3 1 4 5 2 (notice that 18 and 14 have been split).
  5. Add up all the numbers: 4+1+8+0+2+5+8+2+0+3+4+3+1+4+5+2 = 52
  6. Take your resulting number, remember it, and round it up to the nearest multiple of ten: 60.
  7. Subtract your original number from the rounded-up number: 60 - 52 = 8.
  8. Compare the result to your original validation digit. If the two numbers match, your IMEI is valid.

The IMEI given in step 1 above is valid, because the number found in step #7 is 8, which matches the validation digit.

like image 70
Karl Nicoll Avatar answered Sep 19 '22 06:09

Karl Nicoll


According to the previous answer from Karl Nicoll i'm created this method in Java.

public static int validateImei(String imei) {

    //si la longitud del imei es distinta de 15 es invalido
    if (imei.length() != 15)
        return CheckImei.SHORT_IMEI;

    //si el imei contiene letras es invalido
    if (!PhoneNumber.allNumbers(imei))
        return CheckImei.MALFORMED_IMEI;

    //obtener el ultimo digito como numero
    int last = imei.charAt(14) - 48;

    //duplicar cada segundo digito
    //sumar cada uno de los digitos resultantes del nuevo imei
    int curr;
    int sum = 0;
    for (int i = 0; i < 14; i++) {
        curr = imei.charAt(i) - 48;
        if (i % 2 != 0){
            // sum += duplicateAndSum(curr);
            // initial code from Osvel Alvarez Jacomino contains 'duplicateAndSum' method.
            // replacing it with the implementation down here:
            curr = 2 * curr;
            if(curr > 9) {
                curr = (curr / 10) + (curr - 10);
            }
            sum += curr;
        }
        else {
            sum += curr;
        }

    }

    //redondear al multiplo de 10 superior mas cercano
    int round = sum % 10 == 0 ? sum : ((sum / 10 + 1) * 10);

    return (round - sum == last) ? CheckImei.VALID_IMEI_NO_NETWORK : CheckImei.INVALID_IMEI;

}
like image 31
Osvel Alvarez Jacomino Avatar answered Sep 22 '22 06:09

Osvel Alvarez Jacomino