Как стать автором
Обновить

Работа с SIM-картой при помощи Arduino

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров7.7K

Привет, Хабр. Разбираясь с Arduino, мне захотелось реализовать какую-то практическую задачу. Наиболее интересным мне показалось поработать с SIM-картой. Результатом моей работы и стала данная статья, где я опишу ручной способ получения доступа к информации, содержащейся в тестовом SMS сообщении на SIM-карте, средствами программируемой платы Arduino.

Результаты исследования и их анализ

Начну с теории. SIM-карта – это контактная смарт-карта с собственным процессором, способная регистрироваться в мобильной сети. SIM-карта имеет постоянную (энергонезависимую) и оперативную память. Также есть модуль аппаратного шифрования и аппаратный генератор случайных чисел. Процессор SIM-карты работает на частоте до 10 МГц. Постоянная память делится на области: примерно 60% занимают данные оператора, 20% – операционная система, остальное – данные пользователя.

С помощью SIM-карты обеспечивается идентификация абонентского устройства, ее доступ к сети связи, а также защита от несанкционированного использования абонентского номера. Идентификация SIM-карты осуществляется с использованием международного идентификационного номера IMSI, однозначно соответствующего пользовательскому (абонентскому) номеру. Международный идентификатор IMSI, наряду с серийным номером телефонного аппарата IMEI, задействуется в идентификации пользователя коммутационным оборудованием сети при установлении и поддержании соединения.

Следует отметить, что перед проведением исследования необходимо изучить стандарт ISO-7816, который закрепляет основные положения протокола обмена данными с SIM-картой, а также ряд особенностей, связанных с непосредственной работой SIM-карты.

Кроме того, для верного извлечения и изучения информации с SIM-карты нужно знать:

1. Устройство SIM-карты.

2. Значение контактов SIM-карты.

3. Команды, с помощью которых происходит общение SIM-карты с мобильным устройством.

4. Файловую систему SIM-карты.

Подготовим аппаратную часть, подключив SIM-карту к Arduino. Для этого определим, какие выводы имеет SIM-карта (см.рис.1).

Рис. 1. Распиновка SIM-карты
Рис. 1. Распиновка SIM-карты

При установлении подключения между платой Arduino и SIM-картой используются следующие контакты:

1 –  неиспользуемый контакт.

2 – I/O – линия последовательного интерфейса ввода/вывода.

3 – VPP – контакт программирования, который используется при записи служебной информации.

4 – GND – «земля».

6 – CLK – синхросигнал (тактирование).

7 – Reset – контакт сброса.

8 – VCC — питание.

Установление подключения происходит посредством пайки к указанным в стандарте контактам и соединением с выводами платы Arduino по следующей схеме:

 

Рис. 2. Подключение SIM–карты к Arduino Uno.
Рис. 2. Подключение SIM–карты к Arduino Uno.
Рис. 3. Внешний вид подключения SIM–карты к Arduino Uno.
Рис. 3. Внешний вид подключения SIM–карты к Arduino Uno.

Так как SIM-карта является разновидностью Smart-карт, вся технология обмена сообщениями будет полностью основываться на стандарте ISO–7816. Обмен данными производится с использованием USART интерфейса со следующими параметрами: скорость передачи = 9600 Бод, частота = 3,5МГц.

Для начала работы с SIM-картой ее требуется «активировать»: необходимо подать на RST низкий уровень, на VCC подать питание и начать «щелкать» синхросигналом CLK с заданной частотой. Через 4000 циклов перехода синхросигнала CLK подать на RST высокий уровень.

Рис. 4. Временная диаграмма включения SIM–карты.
Рис. 4. Временная диаграмма включения SIM–карты.

 После «активации» SIM-карты нужно выставить RST на низкий уровень, затем SIM-карта отправит ATR (Answer–to–Reset) – ответ с информацией о частоте синхронизации, списком поддерживаемых протоколов передачи и т.д.

Первый байт ATR говорит о том, какая кодировка применяется SIM-картой (прямая или инверсная).  При прямом кодировании первый байт равен 0x3B, при инверсном – 0x3F. Инверсное кодирование означает, что бит 1 в сообщении кодирует логический бит 0 и наоборот.

Когда получен ATR, можно продолжить «общение» с SIM-картой, основываясь на подобранной кодировке. Взаимодействие можно вести при помощи встроенного терминала в «Arduino IDE», с помощью которого происходит программирование платы «Arduino UNO».

Общение с SIM-картой осуществляется с помощью передаваемых команд в специальном формате. Команды состоят из заголовка (4 байта) и тела команды. Пример команд и их соответствующий код можно посмотреть в таблице, которая представлена ниже.

Команда

Код инструкции

Параметр инструкции 1

Параметр инструкции 2

Количество байт в данных, передаваемых командой

SELECT

A4

00

00

02

STATUS

F2

00

00

длина

READ RECORD

B2

номер записи

режим

длина

UPDATE RECORD

DC

номер записи

режим

длина

Примеры команд и их кодов в шестнадцатеричном виде

Память SIM- карты состоит из файлов-каталогов и элементарных файлов. В структуре файловой системы имеются:

- корневой файл-каталог – «Master File» («MF»);

- выделенные файлы-каталоги «Dedicated File» («DF»);

- элементарные файлы (записи) «Elementary File» («EF»).

Выделенный файл («DF») – это функциональная группа файлов, состоящая из него самого и всех тех файлов, которые он в себя включает (то есть он состоит из «DF» и его полного «поддерева»). Такой файл состоит только из заголовочной части. Заголовок файла содержит информацию о структуре и атрибутах файла.

Все элементарные файлы состоят из заголовка и части данных файла.

Элементарные файлы различаются по своей структуре. В стандарте «GSM» используются следующие три структуры элементарных файлов:

1. Прозрачный «EF» – имеет структуру заголовка, в котором содержится смещение начала данных файла и общая длина этих данных, а сами данные представляют собой последовательность байт.

2. Линейный фиксированный «EF» – имеет структуру последовательности записей одинаковой (фиксированной) длины. Первой записью является запись номер 1. Длина записи, а также это значение, умноженное на количество записей, указывается в заголовке файла.

3. Циклический «EF» – используется для записей, хранящихся в хронологическом порядке. Когда все пространство записи занято, новые сохраненные данные будут перезаписывать самую старую информацию.

У каждого файл есть имя – это его идентификатор. Он используется для адресации и идентификации каждого конкретного файла. Такой идентификатор состоит из двух байтов и закодирован в шестнадцатеричной системе счисления.

Первый байт идентификатора указывает на тип файла:

- «3F»: мастер-файл;

- «7F»: выделенный файл;

- «2F»: элементарный файл в основном мастер-файле;

- «6F»: элементарный файл в выделенном файле.

В качестве эксперимента в ходе написания статьи был получен текст первого SMS–сообщения, которое содержится на SIM-карте. Для этого, сначала, был отправлен заголовок команды «Select» – A0 A4 00 00 02. После чего необходимо было дождаться ответа от SIM-карты (3 байта). После получения ответа было отправлено тело команды – 7F 10 (7F – id файла, 10 – тело файла (каталога) «MF»), далее была отправлена команда A0 A4 00 00 02, 6F 3C –  таким образом был совершён переход из корневого каталога в каталог «EF sms». После проведения подготовительных действий по переходу в каталог была отправлена команда «READ RECORD»: A0 B2 01 04 B0.

После получения команды по считыванию указанной записи, SIM-карта отправляет ответ в виде кодированных данных (рис. 5).

Рис. 5. Окно терминала программы «Arduino IDE» с полученным сообщением с SIM–карты.
Рис. 5. Окно терминала программы «Arduino IDE» с полученным сообщением с SIM–карты.

Ответ в виде кодированных данных о первом SMS-сообщении выглядит следующим образом (часть байт скрыта заменой на XX):

«B2 07 07 91 97 61 55 X3 XX FX 11 FF 09 81 97 71 29 X8 XX FX 00 08 FF 0C 04 1F 04 40 04 38 04 32 04 35 04 42 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 90 00».

В представленных данных, отправленных SIM-картой, можно выделить следующие области:

B2 07 – идентификатор начала сообщения;

97 61 55 X3 XX FX – номер получателя 7 916 553 XX XX (младший байт – старший);

97 71 29 X8 XX FX – номер отправителя 7 917 928 XX XX;

08 – кодировка (08 – кириллица);

0C – длина сообщения (12 байт);

04 1F 04 40 04 38 04 32 04 35 04 42 – содержимое сообщения: «Привет».

Вот так и прочитали первую смс с SIM-карты. Осталось только проверить на телефоне, что первая смс в SIM-карте именно такая. Так и оказалось, а, значит, эксперимент можно считать успешным.

В ходе исследования мы успешно проверили как работает «общение» между аппаратной платой Arduino и SIM-картой. Теперь, имея готовый вариант устройства для взаимодействия с SIM-картой, можно выяснять, а что еще интересного можно получить с SIM-карты. Оставлю себе надел на будущее.

Теги:
Хабы:
Всего голосов 15: ↑10 и ↓5+11
Комментарии16

Публикации

Информация

Сайт
amonitoring.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия