Коммит 87e1a52c создал по автору lagutinakv's avatar lagutinakv
Просмотр файлов

Add the section about NFC

владелец 3a9c025b
......@@ -830,6 +830,16 @@ Copyright © 2016–2025 ООО «Открытая мобильн
* [Примеры](./sensors_filter/examples.md)
* [Тесты](./sensors_filter/tests.md)
* NFC
* [NFCD](./nfcd)
* Лекция:
[cлайды](./nfcd/lecture.fodp),
[конспект](./nfcd/lecture.md)
* [Тесты](./nfcd/tests.md)
* [PCSC Lite](./pcsc_lite)
* Лекция:
[cлайды](./pcsc_lite/lecture.fodp),
[конспект](./pcsc_lite/lecture.md)
* [Тесты](./pcsc_lite/tests.md)
* Шифрование и токены
* Дополнительные API ОС Аврора
* Локализация приложений
......
Это отличие свёрнуто
# NFCD
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## D-Bus-интерфейс NFCD
Драйвер устройств NFC в ОС Аврора управляется по протоколу D-Bus и предоставляет несколько интерфейсов.
* Daemon — Корневой интерфейс NFCD, чего через него создаётся объект Adapter.
* Adapter — Управление адаптером.
* IsoDep — Работа с метками стандарта ISO-DEP (ISO 14443-4).
* Tag — Работа с метками типа NFC Type 1.
* TagType2 — Работа с метками типа NFC Tag Type 2.
* NDEF — Чтение NDEF-сообщений, хранящихся в метках NFC.
* Peer — Работа с другим NFC-адаптером по P2P-соединению с использованием протокола LLCP.
## NFC Daemon
Интерфейс Daemon является корневым при работе с NFCD.
Сначала создаётся объект Daemon, после чего через него создаётся объект адаптера.
Шина: системная
Служба: org.sailfishos.nfc.Daemon
Объект: /
Интерфейс: org.sailfishos.nfc.Daemon
GetAdapters() возвращает список NFC-адаптеров, установленных на устройстве.
GetAll(), GetAll2(), GetAll3() возвращают данные об адаптерах и интерфейсе.
RegisterLocalService() служит для регистрации мнемонического имени сервиса, Service Access Point (SAP).
SAP — функциональный аналог порта в протоколе TCP/IP, использующийся в протоколе LLCP
при взаимодействии двух NFC-адаптеров по P2P-соединению.
UnregisterLocalService() служит для удаления SAP.
RequestMode() служит для регистрации запроса на изменение режима работы демона.
Запросы на изменение режима работы могут поступать от разных приложений и обрабатываются по очереди.
Метод возвращает значение id, по которому позднее можно отменить изменение, выполнив обратную
операцию при помощи метода ReleaseMode.
При изменении режима работы адаптера испускается сигнал ModeChanged.
ReleaseMode() отменяет ранее сделанную операцию RequestMode.
ModeChanged() сообщает об изменении режима работы адаптера.
## NFC Adapter
Интерфейс Adapter предназначен для управления NFC-адаптером, установленным на устройстве.
Объекты типа Adapter создаются службой org.sailfishos.nfc.Daemon, приложение получает доступ
к этим объектам, обращаясь к методам интерфейса Daemon.
Интерфейс Adapter реализует:
* методы, проверяющие статус адаптера, наличие подключённых меток и их идентификаторы;
* метод, возвращающий версию интерфейса;
* сигналы, сообщающие приложениям об изменении состояния адаптера, количества и типа подключённых меток.
Служба: org.sailfishos.nfc.Adapter
Объект: /
Интерфейс: org.sailfishos.nfc.Adapter
GetEnabled() возвращает флаг активности адаптера.
GetPowered() возвращает статус наличия питания на адаптере.
GetInterfaceVersion() возвращает версию интерфейса.
GetMode() возвращает текущий режим работы.
GetSupportedModes() возвращает поддерживаемые режимы работы.
GetTags() возвращает идентификаторы подключённых в данный момент тегов.
Например, если вывести информацию без приложенного в данный момент тега к устройству,
то список будет пуст, если же с поднесённым, то нет.
GetTargetPresent() возвращает информацию о наличии подключённой метки.
GetAll() возвращает все данные об адаптере.
## NFC IsoDep
IsoDep предназначен для работы с метками стандарта ISO-DEP (ISO 14443-4).
В рамках стандарта ISO-14443-4 обмен данными с тегом осуществляется в формате APDU.
APDU, по сути, являются командами, которые позволяют производить выполнение функций непосредственно
на процессоре тега и получать результаты такого выполнения.
Запись APDU состоит из заголовка (4 байта) и 255 байтов данных.
Служба: org.sailfishos.nfc.IsoDep
Объект: /
Интерфейс: org.sailfishos.nfc.IsoDep
GetActivationParameters() возвращает параметры интерфейса в виде массива пар ключ-значение.
GetInterfaceVersion() возвращает версию интерфейса.
Transmit() служит для передачи команд и данных по протоколу ISO-DEP.
Reset() делает попытку сбросить метку в исходное состояние, переинициализируя её на уровне NFC.
При этом питание не отключается и возврат к исходному состоянию не гарантируется, но, как минимум,
выбирается приложение по умолчанию, что, как правило, является основной целью инициализации.
## NFC Tag
Интерфейс org.sailfishos.nfc.Tag предназначен для взаимодействия с метками типа NFC Type 1.
Метки NFC Type 1 являются первыми из появившихся меток NFC.
Они подходят для записи и считывания NDEF сообщений.
Служба: org.sailfishos.nfc.Tag
Объект: /
Интерфейс: org.sailfishos.nfc.Tag
GetAll*() возвращает версию интерфейса, флаг присутствия метки в зоне действия адаптера, битовую
маску поддерживаемых технологий, протокол, тип, список совместимых интерфейсов, список
NDEF-записей, содержащихся в метке, низкоуровневые параметры метки.
Acquire() резервирует карту или метку для эксклюзивного доступа D-Bus клиентом, который вызывает этот метод.
Вызвав данный метод, приложение может отправить последовательность команд, получая гарантию,
что никакие другие команды не будут отправлены в метку.
Release() отменяет эксклюзивный доступ приложения к метке, предоставленный методом Acquire.
Transceive() служит для низкоуровнего обмена данными с меткой, например, нестандартными APDU.
Deactivate() деактивирует метку.
Removed() испускается при отключении тега.
## NFC TagType2
Интерфейс org.sailfishos.nfc.TagType2 предназначен для работы с метками,
поддерживающими стандарт NFC Type 2.
Метки NFC Type 2 являются одними из наиболее популярных типов меток.
Они подходят для записи и считывания NDEF сообщений, могут использоваться для пропусков,
их популярность оправдана сравнительно низкой ценой и высокой скоростью передачи данных
по сравнению с NFC Type 1.
Служба: org.sailfishos.nfc.TagType2
Объект: /
Интерфейс: org.sailfishos.nfc.TagType2
GetAll() возвращает версию интерфейса, размер блока, объём хранимых данных в байтах,
уникальный идентификатор метки
Read(), ReadData() возвращает данные, хранящиеся в блоке с указанным номером в секторе с указанным номером.
Write(), WriteData() записывает данные в блок с указанным номером, находящийся в секторе с указанным номером.
## NDEF
Интерфейс NDEF предназначен для чтения NDEF-сообщений, хранящихся в метках NFC.
NDEF — двоичный формат, в котором каждая запись содержит заголовок, определяющий тип
последующей информации и объект запроса.
Служба: org.sailfishos.nfc.NDEF
Объект: /
Интерфейс: org.sailfishos.nfc.NDEF
* GetId() возвращает список значений полей ID формата NDEF.
* GetType() возвращает список значений полей Type формата NDEF.
* GetInterfaceVersion() возвращает версию интерфейса.
* GetInterfaces() возвращает список совместимых интерфейсов.
* GetFlags() возвращает флаги в виде 32-битного значения.
* GetTypeNameFormat() возвращает Type Name Format.
* GetPayload() возвращает список объектов запросов из записей в виде значений uint8.
* GetRawData() возвращает содержимое метки в виде массива значений uint8.
* GetAll() возвращает все данные о метке.
## NFC Peer
Интерфейс org.sailfishos.nfc.Peer предназначен для управления взаимодействием адаптера
с другим NFC-адаптером по P2P-соединению с применением протокола LLCP.
Служба: org.sailfishos.nfc.Peer
Объект: /
Интерфейс: org.sailfishos.nfc.Peer
GetAll() возвращает версию интерфейса, наличие подключенного NFC-устройства, используемую
технологию, перечень совместимых интерфейсов, битовую маску стандартных сервисов согласно
спецификации протокола NFC LLCP.
ConnectAccessPoint() принимает SAP (Service Access Point) протокола LLCP
(аналог номера порта в IP протоколе).
Возвращает сокет для обмена данными с приложением, работающем на другом NFC устройстве.
ConnectServiceName() инициирует подключение к сервису, возвращает сокет для обмена данными
с приложением, работающем на другом NFC устройстве. NFCD обеспечивает копирование данных
между сокетом и NFC, использую внутреннюю реализацию протокола LLCP.
Deactivate() деактивирует P2P-соединение с внешним NFC-устройством.
## Пример работы с NFCD
Пример NFC Use Cases.
В проекте приведен пример работы со стеком NFC.
Модуль NFCD представляет собой сервис D-Bus, для взаимодействия с которым реализован
ряд интерфейсов D-Bus.
Для каждого класса интерфейса реализована оболочка QML.
# Тесты по теме «NFCD»
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Matching
Сопоставьте интерфейсы и их функциональность.
---
| | |
|----------|------------------------------------|
| Daemon | корневой интерфейс |
| Adapter | управление адаптером |
| IsoDep | работа с метками стандарта ISO-DEP |
| Tag | работа с метками NFC Type 1 |
| TagType2 | работа с метками NFC Tag Type 2 |
| NDEF | чтение NDEF-сообщений |
| Peer | работа с NFC-адаптером |
## Multiple choice
Что можно узнать с помощью службы NFC Adapter?
---
* список доступных адаптеров
* **наличие подключённой метки**
* **статус питания на адаптере**
## Multiple choice
Какие интерфейсы позволяют писать данные на NFC-метку?
---
* **Tag**
* **TagType2**
* NDEF
* Adapter
Это отличие свёрнуто
# PCSC Lite
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Библиотека PCSC Lite
PCSC lite — это API для связи с диспетчером ресурсов MUSCLE PC/SC для смарт-карты.
PC/SC — это стандарт, предложенный рабочей группой PC/SC, которая является конгломератом
представителей основных производителей смарт-карт и других компаний.
Данная спецификация пытается абстрагировать уровень смарт-карты в высокоуровневый API,
чтобы смарт-карты и их считыватели могли быть доступны через один и тот же интерфейс.
PCSC предоставляет общий API для однородного взаимодействия с большинством считывателей.
## Внутреннее устройство
PC/SC Lite состоит из серверного демона (pcscd) и клиентской библиотеки (libpcsclite.so),
которые обмениваются данными через IPC.
* Файл winscard_clnt.c на стороне клиента предоставляет API для приложений.
* В файле winscard.c имеются аналогичные функции на стороне сервера, описанные в winscard_clnt.c.
* Файл winscard_msg.c — это интерфейс связи между winscard_clnt.c и winscard.c.
* Файл pcscdaemon.c содержит основную функциональность сервера, включая цикл для приёма клиентских запросов.
* Файл winscard_svc.c содержит функции, вызываемые pcscdaemon.c для обслуживания запросов клиентов.
## Порядок работы
Когда функция из winscard_clnt.c вызывается клиентским приложением, она вызывает функцию
из winscard_msg.c для отправки сообщения на pcscdaemon.c.
Когда клиент pcscdaemon.c обнаруживает поступивший запрос, он вызывает winscard_svc.c,
который определяет, какую команду содержит сообщение, и просит winscard.c выполнить эту команду.
Тем временем winscard_clnt.c ожидает ответа, пока не истечёт время.
## winscard_clnt: работа с контекстом
SCardEstablishContext() создаёт контекст приложения для диспетчера ресурсов PC/SC.
Это должна быть первая функция WinSCard, вызываемая в приложении PC/SC.
Каждый поток приложения должен использовать свой собственный SCARDCONTEXT
SCardReleaseContext() разрушает контекст связи с диспетчером ресурсов PC/SC.
Это должна быть последняя функция, вызываемая в приложении PC/SC.
Функции для управления экземплярами SCardEstablishContext()
Эти функции отслеживают дескрипторы контекста и связывают блокирующую переменную
contextBlockStatus с hContext.
SCardAddContext()добавляет контекст приложения к вектору _psContextMap.
SCardGetAndLockContext() получает SCONTEXTMAP из вектора контекста приложения
для переданного контекста.
Эта функция является потокобезопасной оболочкой для функции SCardGetContextTH().
SCardRemoveContext() удаляет контекст приложения из вектора управления.
## Управление соединением
* SCardConnect() устанавливает соединение со считывателем.
* SCardReconnect() восстанавливает соединение со считывателем.
* SCardDisconnect() завершает соединение, установленное через SCardConnect().
## Взаимодействие со смарт-картой
SCardBeginTransaction() устанавливает временный режим монопольного доступа для выполнения
серии команд в транзакции.
Возможно, метод потребуется использовать, когда выбираются несколько файлов, а затем записывается
большой файл, чтобы быть уверенным в том, что другое приложение не изменит текущий файл.
SCardEndTransaction( ) завершает ранее начатую транзакцию.
Вызывающее приложение должно быть владельцем ранее начатой транзакции, иначе произойдёт ошибка.
SCardControl() отправляет команду непосредственно считывателю IFD.
Метод полезен для создания драйверов считывателя на стороне клиента для таких функций,
как ввод PIN-кода, биометрических данных или для других расширений обычного считывателя смарт-карт,
которые обычно не обрабатываются PC/SC.
SCardGetAttrib() получает атрибут от считывателя IFD.
SCardSetAttrib() устанавливает атрибут считывателя IFD.
SCardTransmit() отправляет APDU на смарт-карту, содержащуюся в считывающем устройстве,
подключённом с помощью SCardConnect().
## Статус карты
SCardStatus() возвращает текущий статус считывателя, подключённого к hCard.
## Статус читателей карты
SCardGetStatusChange() получает структуру или список структур, содержащих имена читателей.
Затем она блокирует ожидание изменения состояния на максимальное время блокировки.
SCardCancel() отменяет конкретную блокирующую функцию SCardGetStatusChange().
## error.c: обработка ошибок
pcsc_stringify_error() возвращает удобочитаемый текст для данного кода ошибки PC/SC.
Возвращённая строка использует буфер локального хранилища потока (TLS) и является допустимой:
* только пока жив поток, в котором она была получена;
* до следующего вызова этой функции в том же потоке.
## Пример NFC Use Cases
Модуль PCSC Lite предоставляет возможность обнаружения подключения NFC-меток
и вывода по ним базовой информации.
Также при инициализации этого модуля загружается список с атрибутами тегов и соответствующей информацией,
которая в дальнейшем также выводится на экран.
# Тесты по теме «PCSC Lite»
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Single choice
Какой API PC/SC нужно использовать в клиентском приложении для взаимодействия со смарт-картой?
---
* **winscard_clnt.c**
* winscard.c
* winscard_msg.c
* pcscdaemon.c
* winscard_svc.c
## Single choice
Какая функция должна быть вызвана первой при работе с картой через PC/SC?
---
* **SCardEstablishContext()**
* SCardAddContext()
* SCardConnect()
* SCardBeginTransaction()
## Single choice
Какая функция позволяет получить сообщение об ошибке в процессе работы с API PC/SC?
---
* **pcsc_stringify_error()**
* любая функция winscard_clnt.c
* любая функция winscard_msg.c
* SCardGetStatusChange()
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать