UnlockClub.Ru

Опросы

Какое устройство вы у нас разблокировали?




















  

Новости

Вычисление контрольного числа IMEI

IMEI. Расчет контрольной суммы.

IMEI (англ. International Mobile Equipment Identity — международный идентификатор мобильного оборудования) — число (обычно 15-разрядное в десятичном представлении), уникальное для каждого использующего его аппарата. Применяется в сотовых телефонах сетей GSM, WCDMA и IDEN, а также в некоторых спутниковых телефонах.

IMEI присваивается телефону во время изготовления на заводе. Он служит для идентификации устройства в сети и хранится в прошивке аппарата. Как правило, IMEI указывается в четырёх местах: в самом аппарате (в большинстве случаев его можно вывести на экран набором *#06# на клавиатуре), под аккумуляторной батареей, на упаковке и в гарантийном талоне. IMEI играет роль серийного номера аппарата и передаётся в эфир при авторизации в сети. 

В этой статье мы расскажем о том как проверить корректность IMEI. 15-я цифра IMEI является так называемым контрольным числом, которое позволяет проверить правильность всех остальных цифр. Согласно Википедии, существует два основных способа его расчета, ниже мы приведем суть этих способов, а также пример реализации расчета контрольной суммы IMEI и проверки его корректности на нескольких языках программирования.

Способ 1.

Для расчета последней цифры IMEI необходимо:
  1. Сложить все цифры в нечетных положениях;
  2. Заменить цифры на четных местах по формуле и сложить их: 0=0 1=2 2=4 3=6 4=8 5=1 6=3 7=5 8=7 9=9
  3. К полученному числу прибавить результат, полученный в п.1.;
  4. Если полученное число равно нулю либо кратно 10, тогда контрольное число IMEI равно 0. В противном случае контрольная сумма равна числу, которое нужно прибавить к результату, чтобы получить ближайшее большее «круглое» число.
Методика расчета Check Digit на примере: Ниже мы с Вами попробуем рассчитать контрольное число CD для IMEI=354190023896443. Для этого нам необходимо выполнить следующие операции с нашим IMEI кодом:
  1. Сложить все цифры в нечетных положениях 3,4,9,0,3,9,4 : 3+4+9+0+3+9+4 = 32
  2. Заменить цифры на четных местах 5,1,0,2,8,6,4 по формуле 0=>0, 1=>2, 2=>4, 3=>6, 4=>8, 5=>1, 6=>3, 7=>5, 8=>7, 9=>9 : 5,1,0,2,8,6,4 => 1,2,0,4,7,3,8 и сложить их: 1+2+0+4+7+3+8 = 25
  3. К полученному числу 25 прибавить результат 32 , полученный в п.1. 25 + 32 = 57
  4. "Если полученное число равно нулю либо кратно 10, тогда контрольное число IMEI равно 0" - это не этот случай... В противном (=нашем) случае контрольная сумма равна числу, которое нужно прибавить к результату, чтобы получить ближайшее бОльшее «круглое» число ( т.е. следующий целый десяток ). Следующий целый десяток = 60. К результату 57 надо прибавить 3 , чтобы получить ближайшее бОльшее «круглое» число 60.
  5. Контрольное число = 3

Способ 2.

  1. Удвоить значения цифр на четных позициях (5,1,0,2,8,6,4).
  2. Сложить вместе удвоенные числа на четных позициях и не четных позициях, при этом «раскладывая» числа на четных позициях на составляющие числа (например, 14 нужно представить как 1 и 4). Получили 57
  3. Если конечное число заканчивается на 0, то CD = 0. В противном случае CD равно числу, которое нужно добавить к результату, полученному в пункте 2, чтобы получить следующий целый десяток. Следующий десяток после 57 это 60, 60-57 получаем 3. Итого контрольное число равно 3.

Ниже приведена реализация этого алгоритма на языке PHP:

Реализация алгоритма расчета контрольной суммы IMEI на языке PHP
function calc_imei($imei)
{
        $sum = 0;
        for ($i = 0; $i < 14; $i++)
        {
                $num = $imei[$i];
                if (($i % 2) != 0)
                {
                        $num = $imei[$i] * 2;
                        if ($num > 9)
                        {
                                $num = (string) $num;
                                $num = $num[0] + $num[1];
                        }
                }
                $sum += $num;
        }
	return ((10 - $sum % 10) % 10);
}

function validate_imei($imei)
{
        if (!preg_match('/^[0-9]{15}$/', $imei)) return false;
        $sum = 0;
        for ($i = 0; $i < 14; $i++)
        {
                $num = $imei[$i];
                if (($i % 2) != 0)
                {
                        $num = $imei[$i] * 2;
                        if ($num > 9)
                        {
                                $num = (string) $num;
                                $num = $num[0] + $num[1];
                        }
                }
                $sum += $num;
        }
        if ((($sum + $imei[14]) % 10) != 0) return false;
        return true;
}

Здесь функция  calc_imei вычисляет контрольную сумму последнего разряда IMEI по второму способу, а функция validate_imei  проверяет его корректность. Рассмотрим использование этих функций на уже рассмотренном примере:

$imeis[] = "354190023896443";
$imeis[] = "354190023896440";

foreach ($imeis as $imei) {
echo $imei . " - " . substr($imei,0,14) . calc_imei($imei)." - ".var_export(validate_imei($imei),true)."\r\n";
}

Результатом выполнения приведенного выше кода будет:

354190023896443 - 354190023896443 - true
354190023896440 - 354190023896443 - false

Т.е., как мы видим, IMEI  354190023896443 является корректным, а IMEI  354190023896440 - нет, расчитанная верная контрольная цифра (check digit) - для него 3. 


Возврат к списку