В этом примере показано, как смоделировать связь между двумя устройствами Near Field Communication (NFC).
Near Field Communication (NFC) - стандартизированная технология беспроводного подключения малой дальности, предназначенная для интуитивно понятной и простой связи между двумя электронными устройствами. NFC работает на 13,56 МГц центральной частоты (Fc), со скоростью от 106 кбит/с до 424 кбит/с, и его типичная рабочая область значений составляет 10 см или менее. NFC всегда включает Инициатор и Цель - Инициатор активно генерирует электромагнитное поле, которое может питать пассивную Цель.
ISO ®/IEC 18092 (Связь и обмен информацией между системами - Ближняя полевая связь - Интерфейс и протокол), также именуемый NFCIP-1 (Ближняя полевая связь - спецификация интерфейса и протокола), является руководящим международным стандартом для NFC. Он основан на стандарте ISO/IEC 14443. ISO/IEC 18092 включает в себя два режима связи:
Пассивный: Устройство Initiator генерирует поле несущей, и целевое устройство отвечает путем модулирования существующего поля. В этом режиме целевое устройство потребляет рабочую степень от электромагнитного поля, обеспечиваемого Инициатором.
Активно: И Инициатор, и Целевое устройство обмениваются данными путем поочередного генерирования собственных полей. Устройство отключает свое поле RF во время ожидания данных. В этом режиме оба устройства обычно имеют источники степени.
В двух режимах связи существуют три режима операции, заданные в ISO/IEC 18092:
Чтение/запись: В этом режиме устройство NFC может считывать данные из или записывать данные в любой из поддерживаемых NFC-тегов (бесконтактных карт) в стандартном формате данных NFC. Приложения включают в себя чтение информации, хранящейся в недорогих NFC-метках, встроенных в метки или смарт-плакаты.
Эмуляция карты: Устройство NFC может также выступать в качестве тега NFC для других считывающих устройств. Это позволяет устройствам с поддержкой NFC, таким как смартфоны, действовать подобно смарт-картам для выполнения транзакций, таких как платежи или билеты.
Peer-to-Peer: Два устройства NFC могут обмениваться данными. Приложения включают совместное использование ссылок WiFi или Bluetooth ® или обмен данными в виде виртуальных визитных карточек и фотографий.
Этот пример иллюстрирует протокол NFC и команды, необходимые для передачи данных от инициатора к целевому объекту. Здесь используется пассивный режим связи, посредством которого Инициатор обеспечивает электромагнитное поле, а Цель отправляет информацию назад путем модулирования этого поля. Инициатор работает как средство записи, а Целевой как эмулятор карты или тег. Инициатор и Цель используют радиоинтерфейс типа А, заданный в ISO/IEC 14443-2 (Идентификационные карты - Бесконтактные интегральные платы - Карты близости - Часть 2: Радиочастотная степень и интерфейс сигнала), и работают со скоростью 106 кбит/с. Инициатор использует модифицированное кодирование Миллера со 100% ASK, как показано в области времени ниже. Цель генерирует поднесущую с частотой 847,5 кГц (Fs), посредством модуляции нагрузки, используя поле Инициатора, и затем модулирует данные на частоту несущей Инициатора, используя эту поднесущую. Анализатор спектра иллюстрирует модуляцию нагрузки ниже. Чтобы выделить поднесущую с частотой 847,5 кГц, выберите инструменты- > измерения- > Peak Finder в окне анализатора спектра. Target использует кодирование Manchester с 10% ASK, как показано на возможностях Time ниже. Обратите внимание, что сигналы временного интервала, показанные в двух возможностях времени, являются сгенерированными модулированными сигналами, т.е. сигнал несущей 13,56 МГц удаляется.
Объект nfcInitiator представляет Инициатор. Свойство UserData содержит данные, которые будут переданы в целевой объект. Объект nfcTarget представляет Target, а ReceivedUserData содержит данные, полученные от инициатора. Из-за малой области значений NFC-устройств ОСШ системы очень высок.
initiator = nfcInitiator
initiator = Fc: 13560000 SamplesPerSymbol: 64 t1: 32 AppLayer: [] UserData: 'Hello, from MathWorks.' EnableVisualization: 1
target = nfcTarget
target = Fc: 13560000 Fs: 847500 SamplesPerSymbol: 64 UID: '11aa22bb' AppLayer: [] ReceivedUserData: '' EnableVisualization: 1
% Signal to noise ratio, in dB snrdB = 50; % Reset the RNG for reproducible results s = rng(0);
Инициатор и Цель следуют за последовательностями инициализации и антиколлизии, чтобы установить ссылку связи. Рисунок 9 (Блок-схема инициализации и антиколлизии для PCD) и Рисунок 10 (Anticollision цикла, блок-схема для PCD) в ISO/IEC 14443-3 (Идентификационные карты - Бесконтактные интегральные платы - Карты близости, Часть 3: Инициализация и антиколлизия) иллюстрируют соответствующую блок-схему Раздел 6 (Тип A - Инициализация и антиколлизия) ISO/IEC 14443-3 подробно описывает команды и протокол. Функции nfcInitialization () и nfcAnticollisionLoop () реализуют соответствующую последовательность команд и протокола. Пример печатает состояние и действия устройств Initiator и Target, а также важную информацию, которая обменивается, чтобы указать поток команд.
Как описано в ISO/IEC 18092, транспортный протокол имеет три части -
Активация протокола: Различные параметры протокола, как и скорости передачи битов, согласовываются и выбираются на этой фазе. Раздел 12.5 (Активация протокола) ISO/IEC 18092 подробно описывает эту фазу. Функция nfcProtocolActivation () реализует последовательность команд, необходимых во время этой фазы.
Протокол обмена данными: Обмен информацией на этой фазе осуществляется с помощью полудуплексного протокола, который поддерживает блочную передачу данных с обработкой ошибок. Для получения дополнительной информации см. раздел 12.6 (Протокол обмена данными) стандарта ISO/IEC 18092. Функция nfcDataExchangeProtocol () показывает, как реализовать обмен данными, как предписано ISO/IEC 18092.
Деактивация протокола: После завершения обмена данными Инициатор деактивирует протокол и соединение с объектом. Функция nfcProtocolDeactivation () реализует последовательность, описанную в разделе 12.7 (Деактивация протокола) ISO/IEC 18092.
nfcPrint.Message('The message to transmit from Initiator to Target:');
The message to transmit from Initiator to Target:
nfcPrint.Message(initiator.UserData);
Hello, from MathWorks.
nfcPrint.Start();
Start of NFC Communication between Initiator and Target
nfcInitialization(initiator, target, snrdB);
Initiator transmitted REQA Target received REQA
Target transmitted ATQA in response to REQA Initiator received ATQA Target supports bit frame anticollision Target's UID size: single
nfcAnticollisionLoop(initiator, target, snrdB);
Start of Anticollision loop Cascade Level-1 Initiator transmitted ANTICOLLISION command Target received Cascade Level-1 SEL code
Target transmitted full UID Initiator received CL1 UID without collision Complete UID received: 0x11aa22bb Initiator transmitted SELECT command Target received Cascade Level-1 SEL code Target selection confirmed Target transmitted SAK with UID complete flag Initiator received SAK UID complete. Exit Anticollision loop. End of Anticollision loop Target compliant with NFCIP-1. Continue with Transport Protocol Activation
nfcProtocolActivation(initiator, target, snrdB);
Start of Transport Protocol Activation Initiator transmitted ATR_REQ Target received ATR_REQ Target transmitted ATR_RES in response to ATR_REQ Initiator received ATR_RES Initiator transmitted PSL_REQ in response to ATR_REQ Selected send rate: 106 Kbps Selected receive rate: 106 Kbps Target received PSL_REQ Target transmitted PSL_RES in response to PSL_REQ Initiator received PSL_RES PSL_RES validated. All selected rates confirmed End of Transport Protocol Activation
nfcDataExchangeProtocol(initiator, target, snrdB);
Start of Data Exchange Protocol (DEP) Initiator transmitted an Information PDU in DEP_REQ Initiator PNI: 0 Target received an Information PDU in DEP_REQ MI chaining not activated in received information PDU Received Initiator PNI: 0 Target PNI: 0 Target transmitted an Information PDU in DEP_RES in response to DEP_REQ Initiator received an Information PDU in DEP_RES Received Target PNI: 0 All data transmitted from Initiator to Target. Exit DEP. End of Data Exchange Protocol (DEP)
nfcProtocolDeactivation(initiator, target, snrdB)
Start of Transport Protocol Deactivation Initiator transmitted RLS_REQ Target received RLS_REQ Target transmitted RLS_RES in response to RLS_REQ Initiator received RLS_RES Target released End of Transport Protocol Deactivation
nfcPrint.End();
End of NFC Communication between Initiator and Target
nfcPrint.Message('The message received by Target from Initiator:');
The message received by Target from Initiator:
nfcPrint.Message(target.ReceivedUserData);
Hello, from MathWorks.
nfcPrint.NewLine;
% Restore RNG state
rng(s);
function nfcInitialization(initiator, target, snrdB) % Initialization and anticollision % Reference: ISO/IEC 14443-3, section 6 txREQA = transmitREQA(initiator); rxREQA = awgn(txREQA, snrdB, 'measured'); txATQA = receiveREQA(target, rxREQA); rxATQA = awgn(txATQA, snrdB, 'measured'); [isATQAValid, isCollisionDetected, isTargetCompliant] = ... receiveATQA(initiator, rxATQA); coder.internal.errorIf(~isATQAValid, 'comm:NFC:InvalidATQA'); coder.internal.errorIf(isCollisionDetected, 'comm:NFC:CollisionATQA'); coder.internal.errorIf(~isTargetCompliant, 'comm:NFC:TargetNotCompliant'); end function nfcAnticollisionLoop(initiator, target, snrdB) % Anticollision Loop % Reference: ISO/IEC 14443-3, section 6 nfcPrint.NewLine; nfcPrint.Heading1('Start of Anticollision loop'); % Start anticollision loop cascadeLevel = 1; targetRxAC = []; nfcPrint.CascadeLevel(cascadeLevel); [initiatorTxAC, newCascadeLevel, uidComplete, isoCompliantTarget] = ... antiCollisionLoop(initiator, targetRxAC, cascadeLevel); while (newCascadeLevel <= 3) && ~uidComplete nfcPrint.CascadeLevel(newCascadeLevel, cascadeLevel); cascadeLevel = newCascadeLevel; targetRxAC = awgn(initiatorTxAC, snrdB, 'measured'); % Target's anticollision loop targetTxAC = antiCollisionLoop(target, targetRxAC); initiatorRxAC = awgn(targetTxAC, snrdB, 'measured'); % Initiator's anticollision loop [initiatorTxAC, newCascadeLevel, uidComplete, isoCompliantTarget] = ... antiCollisionLoop(initiator, initiatorRxAC, cascadeLevel); end coder.internal.errorIf(~uidComplete, 'comm:NFC:IncompleteUID'); coder.internal.errorIf(~isoCompliantTarget, ... 'comm:NFC:TargetNotCompliantWithNFCIP1'); nfcPrint.Heading1('End of Anticollision loop'); nfcPrint.NewLine; nfcPrint.Heading1(['Target compliant with NFCIP-1. '... 'Continue with Transport Protocol Activation']); end function nfcProtocolActivation(initiator, target, snrdB) % NFCIP-1 Transport Protocol Activation % Reference: ISO/IEC 18092, section 12.5 nfcPrint.NewLine; nfcPrint.Heading1('Start of Transport Protocol Activation'); txATR_REQ = transmitATR_REQ(initiator); rxATR_REQ = awgn(txATR_REQ, snrdB, 'measured'); txATR_RES = receiveATR_REQ(target, rxATR_REQ); rxATR_RES = awgn(txATR_RES, snrdB, 'measured'); txPSL_REQ = receiveATR_RES(initiator, rxATR_RES); rxPSL_REQ = awgn(txPSL_REQ, snrdB, 'measured'); txPSL_RES = receivePSL_REQ(target, rxPSL_REQ); status = receivePSL_RES(initiator, txPSL_RES); coder.internal.errorIf(~status, 'comm:NFC:TPActivationFailed'); nfcPrint.Heading1('End of Transport Protocol Activation'); end function nfcDataExchangeProtocol(initiator, target, snrdB) % Data Exchange Protocol % Reference: ISO/IEC 18092, section 12.6 nfcPrint.NewLine; nfcPrint.Heading1('Start of Data Exchange Protocol (DEP)'); status = nfcDEP(initiator, target, snrdB); coder.internal.errorIf(~status, 'nfc:NFC:DEPFailed'); nfcPrint.Heading1('End of Data Exchange Protocol (DEP)'); nfcPrint.NewLine; end function nfcProtocolDeactivation(initiator, target, snrdB) % Transport Protocol Deactivation % Reference: ISO/IEC 18092, section 12.7 nfcPrint.NewLine; nfcPrint.Heading1('Start of Transport Protocol Deactivation'); txRLS_REQ = transmitRLS_REQ(initiator); rxRLS_REQ = awgn(txRLS_REQ, snrdB, 'measured'); txRLS_RES = receiveRLS_REQ(target, rxRLS_REQ); rxRLS_RES = awgn(txRLS_RES, snrdB, 'measured'); status = receiveRLS_RES(initiator, rxRLS_RES); coder.internal.errorIf(~status, 'comm:NFC:TPDeactivationFailed'); nfcPrint.Heading1('End of Transport Protocol Deactivation'); end
Исследуйте различные методы объектов nfcInitiator и nfcTarget, чтобы понять различные команды и протоколы, описанные стандартами NFC. Экспериментируйте с различными системными параметрами, такими как ОСШ, тип UID (Single или Double), значение UID, SamplesPerSymbol, чтобы увидеть, как они влияют на систему.
ISO/IEC 14443-2 Идентификационные карты - Бесконтактные интегральные платы - Карты близости - Часть 2: Радиочастотная степень и сигнала
ISO/IEC 14443-3 Идентификационные карты - Бесконтактные интегральные платы - Карты близости - Часть 3: Инициализация и антиколлизия
ISO/IEC 18092 Информационные технологии - Телекоммуникации и обмен информацией между системами - Ближняя полевая связь - Интерфейс и протокол (NFCIP-1)