IMEI: различия между версиями
MOTOROKR (обсуждение | вклад) (→Предназначение IMEI) | (→Алгоритм вычисления Check Digit) | ||
Строка 23: | Строка 23: | ||
# Суммируем значения Шага 2 и Шага 3 (здесь, например, 14 будем считать как 14, а не 1 + 4). | # Суммируем значения Шага 2 и Шага 3 (здесь, например, 14 будем считать как 14, а не 1 + 4). | ||
# Вычитаем из ближайшего значения к числу, полученному на Шаге 4, оканчивающемуся на ноль значение, полученное на Шаге 4 — получаем значение последней пятнадцатой цифры IMEI-кода. | # Вычитаем из ближайшего значения к числу, полученному на Шаге 4, оканчивающемуся на ноль значение, полученное на Шаге 4 — получаем значение последней пятнадцатой цифры IMEI-кода. | ||
+ | |||
+ | == Алгоритм вычисления Check Digit на языке Delphi (by n0wheremany): == | ||
+ | (небольшой комментарий от n0wheremany - алгоритм отписанный выше не совсем правильный) | ||
+ | |||
+ | # Имеем 14 значный IMEI | ||
+ | # Получаем полный 15 значный IMEI (c Check Digit) | ||
+ | |||
+ | ---- | ||
+ | |||
+ | function GetFullIMEI(IMEI:string):string; | ||
+ | var | ||
+ | X:integer; | ||
+ | i:integer; | ||
+ | S:string; | ||
+ | begin | ||
+ | Result := IMEI; | ||
+ | // Проверка на правильно ввода | ||
+ | if Length(IMEI)<14 then exit; | ||
+ | IMEI := Copy(IMEI,1,14); | ||
+ | |||
+ | // ШАГ 1: Складываем в строку цифры IMEI таким образом: | ||
+ | // Все четные цифры умножаем на 2, а не четные оставляем | ||
+ | S := ""; | ||
+ | for i:=1 to 14 do | ||
+ | if (i mod 2)=0 then | ||
+ | S := S + IntToStr(StrToInt(IMEI[I])*2) | ||
+ | else | ||
+ | S := S + IMEI[I]; | ||
+ | |||
+ | // ШАГ 2: Складываем все полученные цифры (S) с число (X) | ||
+ | X := 0; | ||
+ | for i:=1 to Length(S) do | ||
+ | X := X + StrToInt(S[I]); | ||
+ | |||
+ | // ШАГ 3: Если результат сложения (X) = 0 , то CD = 0б иначе переходим к 4 шагу | ||
+ | if X>0 then | ||
+ | |||
+ | // ШАГ 4: Увеличиваем результат сложения в число (X) до следующего десятка и уменьшаем на результат сложения (X) | ||
+ | // Если результат сложения (X) = 11, то 20 - 11 = 9 | ||
+ | // Если результат сложения (X) = 24, то 30 - 24 = 6 | ||
+ | |||
+ | X := Trunc(((X div 10)+1)*10)-X; | ||
+ | |||
+ | Result := IMEI + IntToStr(X); | ||
+ | end; |
Версия 07:53, 2 марта 2009
IMEI (англ. International Mobile Equipment Identifier) — всегда 15-значный Международный Идентификатор Мобильного Оборудования. Наличие IMEI обязательно для GSM (рабочие частоты — 450, 850, 900, 1800, 1900 MHz) и UMTS-устройств (в том числе двурежимных — GSM/UMTS). Полная информация о распределении IMEI находится в базе данных Ассоциации GSM.
Содержание
Предназначение IMEI
IMEI предназначен для того, чтобы идентифицировать каждый телефон, как уникальный. Это, среди прочего, позволяет предотвратить использование краденных аппаратов. IMEI автоматически передается аппаратом в сеть оператора при регистрации телефона в сети, то даже если в украденном аппарате сменили SIM-карту, телефон все равно можно найти по его IMEI. С помощью технических средств, которые имеются у операторов сотовой связи, можно локализовать местонахождение включенного телефона с точностью до нескольких сотен метров.
В современных аппаратах IMEI хранится в OTP (англ. One-Time Programmable, однократно программируемой) зоне памяти и не может быть изменен программными средствами. IMEI обязательно должен был нанесён на корпус (обычно — на стикер под батарейкой) и упаковку телефона. Все сертифицированные устройства дожный отображать свой IMEI при наборе следующего сочетания клавиш: *#06#.
Структура IMEI
IMEI состоит из 3-х групп цифр — TAC+Serial#+Check Digit.
- TAC (англ. Type Allocation Code) — типовой код распределения.
- RBI (англ. Reporting Body Identifier). Символьное обозначение — NN.
- Type Identifier. Символьное обозначение — XXXX XX.
- Serial No (Серийный номер). Назначается производителем индивидуально для каждого устройства. Символьное обозначение — ZZZZZZZ.
- Check Digit (Проверочный код). Символьное обозначение — A.
Алгоритм вычисления Check Digit
Чтобы расчитать Check Digit:
- Каждый второй символ слева направо умножаем на 2.
- Складываем каждое получившееся на Шаге 1 число между собой (обратите внимание, что, например, 14 мы складываем, как 1 + 4).
- Складываем между собой нечетные числа IMEI (первое, третье, пятое и т.д.). Если в конце полученного значения будет 0, то расчет Check Digit завершен, то есть Check Digit равен нулю. Если в конце не 0, то переходим к Шагу 4.
- Суммируем значения Шага 2 и Шага 3 (здесь, например, 14 будем считать как 14, а не 1 + 4).
- Вычитаем из ближайшего значения к числу, полученному на Шаге 4, оканчивающемуся на ноль значение, полученное на Шаге 4 — получаем значение последней пятнадцатой цифры IMEI-кода.
Алгоритм вычисления Check Digit на языке Delphi (by n0wheremany):
(небольшой комментарий от n0wheremany - алгоритм отписанный выше не совсем правильный)
- Имеем 14 значный IMEI
- Получаем полный 15 значный IMEI (c Check Digit)
function GetFullIMEI(IMEI:string):string; var
X:integer; i:integer; S:string;
begin
Result := IMEI;
// Проверка на правильно ввода
if Length(IMEI)<14 then exit; IMEI := Copy(IMEI,1,14);
// ШАГ 1: Складываем в строку цифры IMEI таким образом: // Все четные цифры умножаем на 2, а не четные оставляем
S := ""; for i:=1 to 14 do if (i mod 2)=0 then S := S + IntToStr(StrToInt(IMEI[I])*2) else S := S + IMEI[I];
// ШАГ 2: Складываем все полученные цифры (S) с число (X)
X := 0; for i:=1 to Length(S) do X := X + StrToInt(S[I]);
// ШАГ 3: Если результат сложения (X) = 0 , то CD = 0б иначе переходим к 4 шагу
if X>0 then
// ШАГ 4: Увеличиваем результат сложения в число (X) до следующего десятка и уменьшаем на результат сложения (X) // Если результат сложения (X) = 11, то 20 - 11 = 9 // Если результат сложения (X) = 24, то 30 - 24 = 6
X := Trunc(((X div 10)+1)*10)-X;
Result := IMEI + IntToStr(X);
end;