Открыть главное меню

IMEI: различия между версиями

 
 
(не показано 13 промежуточных версий 7 участников)
Строка 1:Строка 1:
'''IMEI''' ({{lang-en|International Mobile Equipment Identifier}}) — всегда 15-значный Международный Идентификатор Мобильного Оборудования. Наличие IMEI обязательно для GSM (450, 850, 900, 1800, 1900 MHz) и UMTS-устройств (в том числе двурежимных — GSM/UMTS). Полная информация о распределении IMEI находится в базе данных [http://www.gsmworld.com/ Ассоциации GSM].
+
'''IMEI''' ({{lang-en|International Mobile Equipment Identifier}}) — всегда 15-значный Международный Идентификатор Мобильного Оборудования. Наличие '''IMEI''' обязательно для [[GSM]] (рабочие частоты — 450, 850, 900, 1800, 1900 MHz) и [[UMTS|UMTS-устройств]] (в том числе двурежимных — GSM/UMTS). Полная информация о распределении '''IMEI''' находится в базе данных [http://www.gsmworld.com/ Ассоциации GSM].<metadesc>Всегда 15-значный Международный Идентификатор Мобильного Оборудования.</metadesc>
  
=== Предназначение IMEI ===
+
== Предназначение IMEI ==
IMEI предназначен именно для того, чтобы идентифицировать каждый телефон, как уникальный. Это сделано для того, чтобы предотвратить  
+
'''IMEI''' предназначен для того, чтобы идентифицировать каждый телефон, как уникальный. Это, среди прочего, позволяет предотвратить использование краденных аппаратов. IMEI автоматически передается аппаратом в сеть оператора при регистрации телефона в сети, то даже если в украденном аппарате сменили [[SIM-карта|SIM-карту]], телефон все равно можно найти по его IMEI. С помощью технических средств, которые имеются у операторов сотовой связи, можно локализовать местонахождение включенного телефона с точностью до нескольких сотен метров.
возможность использования краденных аппаратов: ведь если вор сменил [[SIM-карта|SIM-карту]], вроде бы обнаружить телефон невозможно.
 
  
Но это не так. Поскольку IMEI автоматически передается аппаратом в сеть оператора при регистрации телефона в сети, то даже если в украденном аппарате сменили [[SIM-карта|SIM-карту]], телефон все равно можно найти по его IMEI. С помощью технических средств, которые имеются у операторов сотовой связи, можно локализовать местонахождение включенного телефона с точностью до нескольких сотен метров.
+
В современных аппаратах IMEI хранится в [[OTP]] ({{lang-en|One-Time Programmable, однократно программируемой}}) зоне памяти и не может быть изменен программными средствами. IMEI обязательно должен был нанесён на корпус (обычно — на стикер под батарейкой) и упаковку телефона. Все сертифицированные устройства дожный отображать свой IMEI при наборе следующего сочетания клавиш: '''*#06#'''.
  
В современных аппаратах IMEI хранится в [[OTP]] (One-time programmable — однократно программируемой) зоне памяти и не может быть изменен программными средствами.
 
=== Какая информация закодирована в IMEI ===
 
 
== Структура IMEI ==
 
== Структура IMEI ==
IMEI состоит из 3-х групп цифр: TAC+Serial No+Check Digit
+
'''IMEI''' состоит из 3-х групп цифр — '''TAC'''+'''Serial#'''+'''Check Digit'''.
- ''TAC'' (Type Allocation Code, Типовой код распределения)
+
 
  - ''RBI'' (Reporting Body Identifier). Символьное обозначение - NN.
+
* '''TAC''' ({{lang-en|Type Allocation Code}}) — типовой код распределения.
  - ''Type Identifier''. Символьное обозначение - XXXX XX.
+
** '''RBI''' ({{lang-en|Reporting Body Identifier}}). Символьное обозначение — ''NN''.
- ''Serial No'' (Серийный номер). Назначается производителем индивидуально для каждого устройства. Символьное обозначение - ZZZZZZZ.
+
** '''Type Identifier'''. Символьное обозначение — ''XXXX XX''.
- ''Check Digit'' (Проверочный код). Символьное обозначение - A.
+
* '''Serial No''' (''Серийный номер''). Назначается производителем индивидуально для каждого устройства. Символьное обозначение — ''ZZZZZZZ''.
 +
* '''Check Digit''' (''Проверочный код''). Символьное обозначение — ''A''.
 +
 
 
== Алгоритм вычисления Check Digit ==
 
== Алгоритм вычисления Check Digit ==
 
Чтобы расчитать Check Digit:
 
Чтобы расчитать Check Digit:
  
1. Каждый второй символ слева направо умножаем на 2.
+
# Каждый второй символ слева направо умножаем на 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 ==
 +
(''проверить: алгоритм отписанный выше не совсем правильный''')
 +
 
 +
# Имеем 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. Складываем каждое получившееся на Шаге 1 число между собой (обратите внимание, что, например, 14 мы складываем, как 1 + 4).
+
// ШАГ 2: Складываем все полученные цифры (S) с число (X)
 +
X := 0;
 +
for i:=1 to Length(S) do
 +
  X := X + StrToInt(S[I]);
  
3. Складываем между собой нечетные числа IMEI (первое, третье, пятое и т.д.). Если в конце полученного значения будет 0, то расчет Check Digit завершен, то есть Check Digit равен нулю. Если в конце не 0, то переходим к Шагу 4.
+
// ШАГ 3: Если результат сложения (X) = 0 , то CD = 0б иначе переходим к 4 шагу
 +
if X>0 then
  
4. Суммируем значения Шага 2 и Шага 3 (здесь, например, 14 будем считать как 14, а не 1 + 4).
+
// ШАГ 4: Увеличиваем результат сложения в число (X) до следующего десятка и уменьшаем на результат сложения (X)
 +
// Если результат сложения (X) = 11, то 20 - 11 = 9
 +
// Если результат сложения (X) = 24, то 30 - 24 = 6
  
5. Вычитаем из ближайшего значения к числу, полученному на Шаге 4, оканчивающемуся на ноль значение, полученное на Шаге 4 — получаем значение последней пятнадцатой цифры IMEI-кода.
+
  X := Trunc(((X div 10)+1)*10)-X;
 +
  if X=10 then X:=0; //Пример X=40 функция Trunc опредиляет значение = 50 таким образом X=50-40???
 +
Result := IMEI + IntToStr(X);
 +
end;

Текущая версия на 04:11, 9 апреля 2019

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:

  1. Каждый второй символ слева направо умножаем на 2.
  2. Складываем каждое получившееся на Шаге 1 число между собой (обратите внимание, что, например, 14 мы складываем, как 1 + 4).
  3. Складываем между собой нечетные числа IMEI (первое, третье, пятое и т.д.). Если в конце полученного значения будет 0, то расчет Check Digit завершен, то есть Check Digit равен нулю. Если в конце не 0, то переходим к Шагу 4.
  4. Суммируем значения Шага 2 и Шага 3 (здесь, например, 14 будем считать как 14, а не 1 + 4).
  5. Вычитаем из ближайшего значения к числу, полученному на Шаге 4, оканчивающемуся на ноль значение, полученное на Шаге 4 — получаем значение последней пятнадцатой цифры IMEI-кода.

Алгоритм вычисления Check Digit на языке Delphi

(проверить: алгоритм отписанный выше не совсем правильный')

  1. Имеем 14 значный IMEI
  2. Получаем полный 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; if X=10 then X:=0; //Пример X=40 функция Trunc опредиляет значение = 50 таким образом X=50-40???
Result := IMEI + IntToStr(X);

end;