В этом примере показан обмен данными между прикладными уровнями двух устройств NFC.
В примере демонстрируется интеллектуальный плакат Near Field Communication (NFC), который является функцией NFC, используемой ритейлерами, рекламными агентствами, транспортными службами, поставщиками медицинских услуг и различными отраслями, которые хотят взаимодействовать с потребителями. Поскольку NFC требует от пользователя принятия мер, выбор технологии создает вовлеченного пользователя, что приводит к гораздо более значимому взаимодействию с брендом.
Интеллектуальный плакат NFC - это реклама журнала, листовка, рекламный щит или другой физический носитель, включающий встроенные или прикрепленные NFC-теги. Когда устройство NFC размещено в пределах нескольких сантиметров от метки NFC, информация передается на устройство или на устройство запускается задача.
В зависимости от «умного» плаката и среды потребитель может получать адресную информацию о своем текущем местоположении. Примеры использования смарт-плаката NFC:
Плакат, содержащий NFC-тег, который предписывает принимающему NFC-устройству запустить приложение карты с указаниями помочь потерявшемуся туристу найти близлежащий ориентир.
В розничной торговле - плакат, предлагающий купоны, информацию о продукте или баллы лояльности. Телефон потребителя действует как карта лояльности и хранит информацию, таким образом устраняя необходимость отслеживания нескольких карт.
Передаваемые данные кодируются в NFC-теге в формате NDEF (NFC Data Exchange Format) и сохраняются в структуре данных тегов. NDEF - это формат данных для NFC-устройств и тегов для создания действительного сообщения NDEF. Файл NDEF состоит из сообщений NDEF, которые состоят из записей NDEF. Формат NDEF используется для хранения и обмена информацией, такой как URI (Uniform Resource Identifier), обычный текст, зашифрованные данные, данные изображения, такие как GIF и JPEG файлы и т.д.
Прикладной уровень NFC-тега хранит данные в файле NDEF. Этот пример иллюстрирует протоколы NFC и команды, необходимые для передачи данных между прикладными уровнями NFC-устройства и NFC-тегом для приложения, такого как интеллектуальный плакат NFC.
NDEF - это облегченный двоичный формат сообщения, который можно использовать для инкапсуляции одной или нескольких прикладных полезных нагрузок произвольного типа и размера в единую конструкцию сообщения. Каждая полезная нагрузка описывается типом, длиной и необязательным идентификатором. Идентификаторами типов могут быть URI, типы носителей MIME или типы, специфичные для NFC. Полезные нагрузки NDEF могут включать вложенные сообщения NDEF или цепочки связанных порций данных неизвестной длины на момент формирования данных [5].
txURL = 'mathworks.com'; targetRecord = ndefRecord('Type', 'U', 'URIID', '01', ... 'ActualText', txURL)
targetRecord =
ndefRecord with properties:
TypeNameFormat: 'NFC Forum well-known type'
IsIDLengthPresent: '0'
IsShortRecord: '1'
IsChunk: '0'
IsMessageBegin: '1'
IsMessageEnd: '1'
TypeLength: ''
PayloadLength: ''
IDLength: '00'
Type: 'U'
ID: ''
Payload: ''
StatusBytes: '02'
LanguageCode: 'en'
URIID: '01'
ActualText: 'mathworks.com'
Тег NFC, содержащий URI в файле NDEF, является тегом типа 4 в этом примере, как указано в спецификации операции с тегом типа 4 [6]. Объект nfcTarget моделирует этот тег. Он содержит объект nfcApp, моделирующий уровень приложения и содержащий данные для обмена.
targetAppLayer = nfcApp(); targetAppLayer.AppData = create(targetRecord)
targetAppLayer =
nfcApp with properties:
AppName: 'D2760000850101'
CCFileID: 'E103'
NDEFFileID: 'E104'
CLA: '00'
INS: 'A4'
P1: '04'
P2: '00'
Lc: ''
Le: ''
SW1: '90'
SW2: '00'
AppData: 'D1010E55016D617468776F726B732E636F6D'
target = nfcTarget('AppLayer', targetAppLayer, 'EnableVisualization', false)
target =
Fc: 13560000
Fs: 847500
SamplesPerSymbol: 64
UID: '11aa22bb'
AppLayer: [1x1 nfcApp]
ReceivedUserData: ''
EnableVisualization: 0
Устройство-потребитель моделируется объектом nfcInitiator, который также содержит объект nfcApp для моделирования его прикладного уровня.
initiator = nfcInitiator('AppLayer', nfcApp(), 'UserData', '', ... 'EnableVisualization', false)
initiator =
Fc: 13560000
SamplesPerSymbol: 64
t1: 32
AppLayer: [1x1 nfcApp]
UserData: ''
EnableVisualization: 0
% Signal to noise ratio, in dB snrdB = 50; % Reset the RNG for reproducible results s = rng(0);
Последовательности инициализации и антиколлизии описаны в примере NFC (Near Field Communication). Обмен данными приложения осуществляется с использованием полудуплексного блочного протокола передачи, как описано в ISO ®/IEC 14443-4 [4]. В примере показано состояние и действия устройств инициатора и адресата, а также важная информация, которой обмениваются для указания потока команд.
nfcPrint.Message('URL to transmit:');URL to transmit:
nfcPrint.Message(sprintf('%s%s', 'http://www.', txURL));
http://www.mathworks.com
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 Protocol Activation Initiator transmitted RATS Target received RATS Target transmitted ATS in response to RATS Initiator received ATS End of Protocol Activation
nfcBlockTransmissionProtocol(initiator, target, snrdB);
Start of Half-Duplex Block Transmission Protocol Initiator transmitted SELECT command for APP NAME Target received SELECT command for APP NAME Target transmitted STATUS Bytes for APP NAME Initiator received valid STATUS Bytes for APP NAME Initiator transmitted SELECT command for CC File Target received SELECT command for CC File Target transmitted STATUS Bytes for CC File Initiator received valid STATUS Bytes for CC File Initiator transmitted READ command for CC File Target received READ command for CC File Target transmitted CCFILE CONTENT and STATUS Bytes for CC File Initiator received valid CCFILE CONTENT and STATUS Bytes for CC File Initiator transmitted SELECT command for NDEF File Target received SELECT command for NDEF File Target transmitted STATUS Bytes for NDEF File Initiator received valid STATUS Bytes for NDEF File Initiator transmitted READ command for NDEF NLEN Target received READ command for NDEF NLEN Target transmitted NLEN and STATUS Bytes for NDEF Initiator received NLEN and valid STATUS Bytes Initiator transmitted READ command for NDEF File Target received READ command for NDEF File Target transmitted NDEF CONTENT and STATUS Bytes for NDEF File Initiator received NDEF File content and valid STATUS Bytes End of Half-Duplex Block Transmission Protocol
nfcProtocolDeactivation(initiator, target, snrdB)
Start of Protocol Deactivation Initiator transmitted DESELECT Target received DESELECT Target transmitted DESELECT response Initiator received DESELECT response Target released End of Protocol Deactivation
nfcPrint.End();
End of NFC Communication between Initiator and Target
recDataType = getReceivedNDEFType(initiator.AppLayer); recData = getReceivedNDEFData(initiator.AppLayer); if strcmpi(recDataType, 'U') nfcPrint.Message('Received URL:'); else nfcPrint.Message('Received telephone number:'); end
Received URL:
nfcPrint.Message(recData);
http://www.mathworks.com
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) % ISO/IEC 14443-4 Protocol Activation % Reference: ISO/IEC 14443-4, section 5 nfcPrint.NewLine; nfcPrint.Heading1('Start of Protocol Activation'); txRATS = transmitRATS(initiator); rxRATS = awgn(txRATS, snrdB, 'measured'); txATS = receiveRATS(target, rxRATS); rxATS = awgn(txATS, snrdB, 'measured'); status = receiveATS(initiator, rxATS); coder.internal.errorIf(~status, 'comm:NFC:ProtocolActivationFailed'); nfcPrint.Heading1('End of Protocol Activation'); end function nfcBlockTransmissionProtocol(initiator, target, snrdB) % Half-duplex Block Transmission Protocol % Reference: ISO/IEC 14443-4, section 7 nfcPrint.NewLine; nfcPrint.Heading1('Start of Half-Duplex Block Transmission Protocol'); nfcTransmissionProtocol(initiator, target, snrdB); nfcPrint.Heading1('End of Half-Duplex Block Transmission Protocol'); nfcPrint.NewLine; end function nfcProtocolDeactivation(initiator, target, snrdB) % Protocol Deactivation % Reference: ISO/IEC 14443-4, section 8 nfcPrint.NewLine; nfcPrint.Heading1('Start of Protocol Deactivation'); txDESLECT = transmitDESELECT(initiator); rxDESELECT = awgn(txDESLECT, snrdB, 'measured'); txDESELECT_RES = receiveDESELECT(target, rxDESELECT); rxDESELECT_RES = awgn(txDESELECT_RES, snrdB, 'measured'); status = receiveDESELECT_RES(initiator, rxDESELECT_RES); coder.internal.errorIf(~status, 'comm:NFC:ProtocolDeactivationFailed'); nfcPrint.Heading1('End of Protocol Deactivation'); end
Изучите различные методы объектов nfcInitiator, nfcTarget, nfcApp и ndefRecord, а также различные функции, используемые в этом примере, чтобы понять различные команды и протоколы, описанные в стандартах NFC. Экспериментируйте с различными системными параметрами, такими как сообщения SNR, NDEF, чтобы увидеть, как они влияют на систему.
2. ISO/IEC 14443-2 Идентификационные карты - Бесконтактные интегральные платы - Бесконтактные платы - Часть 2: Радиочастотный интерфейс питания и сигнала
3. ISO/IEC 14443-3 Идентификационные карты - Бесконтактные интегральные платы - Бесконтактные платы - Часть 3: Инициализация и антиколлизия
4. ISO/IEC 14443-4 Идентификационные карты - Бесконтактные интегральные платы - Бесконтактные платы - Часть 4: Протокол передачи
5. Формат обмена данными NFC (NDEF) Техническая спецификация 1.0
6. Тип 4. Технические условия эксплуатации, Техническая спецификация 2.0