Прикладные

Слои NFC

Этот пример демонстрирует обмен данными между прикладными слоями двух устройств Near Field Communication (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 (Унифицированный Идентификатор Ресурса), обычный текст, зашифрованные данные, данные изображений, такие как GIF и JPEG файлы и т.д.

Setup системы

Прикладной слой тега NFC сохраняет данные в файле NDEF. Этот пример иллюстрирует протоколы и команды NFC, необходимые для передачи данных между слоями приложения NFC Device и NFC Tag для приложения, такого как смарт-постер 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);

Последовательности инициализации и антиколлизии описаны в примере Near Field Communication (NFC). Прикладные данные обмениваются с использованием полудуплексного протокола передачи блоков, как описано в ISO ®/IEC 14443-4 [4]. Пример печатает состояние и действия устройств Initiator и Target, а также важную информацию, которая обменивается, чтобы указать поток команд.

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, чтобы увидеть, как они влияют на систему.

Ссылки

1. http://nfc-forum.org/

2. ISO/IEC 14443-2 Идентификационные карты - Бесконтактные интегральные платы - Карты близости - Часть 2: Радиочастотная степень и сигнала

3. ISO/IEC 14443-3 Идентификационные карты - Бесконтактные интегральные платы - Карты близости - Часть 3: Инициализация и антиколлизия

4. ISO/IEC 14443-4 Идентификационные карты - Бесконтактные интегральные платы - Карты близости - Часть 4: Протокол передачи

5. Техническая спецификация NFC Data Exchange Format (NDEF) 1.0

6. Тип 4 Тег Операция Спецификация Техническая спецификация 2.0

Для просмотра документации необходимо авторизоваться на сайте