Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

NFC アプリケーション層

この例では、2 つの近距離無線通信 (NFC) デバイスのアプリケーション層間のデータの交換を示します。

はじめに

例では、近距離無線通信 (NFC) スマート ポスターを実証します。NFC スマート ポスターは、小売業者、広告代理店、運輸当局、医療事業者、および消費者との交流を希望する各種産業によって使用されている NFC の機能です。NFC ではユーザーによるアクションの実行を必要とするため、技術のオプトイン特性によって積極的に関与するユーザーを生み出し、ブランドとのよりいっそう有意義な交互作用へとつながります。

NFC スマート ポスターは、埋め込みまたは添付の NFC Tag を含めた雑誌広告、ちらし、屋外の大型広告、あるいはその他の物理的媒体です。NFC デバイスが NFC Tag の数センチ以内の場所に置かれると、デバイスに情報が転送されるか、またはデバイス上でタスクが開始されます。

消費者は、スマート ポスターおよび環境に応じて、現在の位置に関するターゲット情報を受信することができます。NFC スマート ポスターの使用例には、次のものがあります。

  • 迷子になった旅行者が近くのランドマークを見つける際に役に立つよう、方向を含む地図アプリケーションの起動を受信 NFC デバイスに指示する NFC Tag を含むポスター。

  • 小売業の環境において、クーポン、製品に関する情報、またはロイヤルティ ポイントを提供するポスター。消費者のスマートフォンがロイヤルティ カードとして機能し、情報を保存するため、多数のカードの記録を維持する必要がなくなります。

転送するデータは、NFC Tag で NDEF (NFC Data Exchange Format) 形式で符号化され、Tag データ構造体内に保存されます。NDEF は、有効な NDEF メッセージを構築するための NFC デバイスと Tags 用のデータ形式です。NDEF ファイルは、NDEF レコードから成る NDEF メッセージで構成されています。NDEF 形式は、URI (Uniform Resource Identifier)、プレーンテキスト、暗号化データ、GIF や JPEG ファイルのようなイメージ データなどの情報の保存と交換に使用されます。

システム設定

NFC Tag のアプリケーション層では、データを NDEF ファイルに保存します。この例では、NFC スマート ポスターのような用途のための NFC デバイスと NFC Tag のアプリケーション層間のデータ転送に必要な NFC のプロトコルとコマンドを説明します。

NDEF は、1 つ以上のアプリケーションで定義された任意のタイプおよびサイズのペイロードを単一メッセージの構造にカプセル化するために使用できる軽量なバイナリ メッセージ形式です。各ペイロードは、タイプ、長さ、およびオプションの識別子で記述されます。タイプ識別子は、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'

NDEF ファイルの URI を含む NFC Tag は、この例では、Type 4 Tag Operation Specification [6] で仕様が示された Type 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

探査

NFC 規格で説明されているさまざまなコマンドとプロトコルを理解するために、nfcInitiator、nfcTarget、nfcApp、および ndefRecord オブジェクトのさまざまなメソッドと、この例で使用されているさまざまな関数を調査します。SNR、NDEF メッセージなどのさまざまなシステム パラメーターを試して、これらのパラメーターがシステムに与える影響を確認します。

参考文献

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

2.ISO/IEC 14443-2 Identification cards - Contactless integrated circuit cards - Proximity cards - Part 2: Radio frequency power and signal interface

3.ISO/IEC 14443-3 Identification cards - Contactless integrated circuit cards - Proximity cards - Part 3: Initialization and anticollision

4.ISO/IEC 14443-4 Identification cards - Contactless integrated circuit cards - Proximity cards - Part 4: Transmission protocol

5.NFC Data Exchange Format (NDEF) Technical Specification 1.0

6.Type 4 Tag Operation Specification Technical Specification 2.0