Этот пример демонстрирует обмен данными между прикладными уровнями двух устройств Около полевой коммуникации (NFC).
Пример демонстрирует Около полевой коммуникации (NFC) умный плакат, который является функцией NFC, использованной ритейлерами, рекламными агентствами, Управлениями транспортом, медицинскими работниками и различными отраслями промышленности, которые хотят взаимодействовать с потребителями. Поскольку NFC требует, чтобы пользователь принял меры, подписаться природа технологии создает занятого пользователя, ведущего к намного большему значимому взаимодействию с брендом.
Умный плакат NFC является рекламой журнала, листовкой, рекламным щитом или другим физическим носителем, который включает встроенные или присоединенные теги NFC. Когда устройство NFC помещается в нескольких сантиметрах тега NFC, информация передается устройству, или задача запускается на устройстве.
В зависимости от умного плаката и среды, потребитель может получить предназначенную информацию об их текущем местоположении. Примеры NFC умное использование плаката включают:
Плакат, который содержит тег NFC, который дает устройству NFC получения команду запускать приложение карты с направлениями, чтобы помочь потерянной туристической находке соседний ориентир.
В розничной установке, плакат, который предлагает купоны, информацию о продукте или точки лояльности. Телефон потребителя действует как карта лояльности и хранит информацию, таким образом избавляя от необходимости отслеживать несколько карт.
Данные, чтобы передать закодированы в Теге NFC в NDEF (Формат Обмена данными NFC) формат и хранятся в структуру данных Тега. NDEF является форматом данных для Устройств NFC и Тегов, чтобы создать допустимое сообщение NDEF. Файл NDEF состоит из сообщений NDEF, которые состоят из Записей NDEF. Формат NDEF используется, чтобы сохранить и обмениваться информацией как URI (Унифицированный идентификатор ресурса), простой текст, зашифрованные данные, данные изображения как GIF и файлы JPEG, и т.д.
Прикладной уровень Тега NFC хранит данные в файле NDEF. Этот пример иллюстрирует протоколы NFC и команды, требуемые передавать данные между прикладными уровнями Устройства NFC и Тега NFC для приложения как NFC умный плакат.
NDEF является легким весом, формат двоичного сообщения, который может использоваться, чтобы инкапсулировать одну или несколько заданных приложением полезных нагрузок произвольного типа и размера в одно построение сообщения. Каждая полезная нагрузка описана типом, длиной и дополнительным идентификатором. Идентификаторы типов могут быть URIs, типами носителей 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 в этом примере, как задано в Спецификации [6] Операции Тега Типа 4. 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). Данными приложения обмениваются с помощью полудуплексного протокола передачи блока, как описано в 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. Экспериментируйте с различными системными параметрами как ОСШ, сообщения 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