Main Content

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

近距離無線通信 (NFC)

この例では、2 つの近距離無線通信 (NFC) デバイス間の通信をモデル化する方法を示します。

はじめに

近距離無線通信 (NFC) は、規格ベースの近距離無線接続技術で、2 つの電子デバイス間の直感的でシンプルな通信のために設計されています。NFC は中心周波数 (Fc) 13.56 MHz、速度範囲 106 kbps から 424 kbps で動作し、その標準的な動作範囲は 10 cm 以下です。NFC には常にイニシエーターとターゲットがかかわります。イニシエーターはアクティブに電磁界を生成し、この電磁界はパッシブなターゲットに電力を供給できます。

ISO®/IEC 18092 (Telecommunications and Information Exchange Between Systems - Near Field Communication - Interface and Protocol) は NFCIP-1 (Near Field Communication - Interface and Protocol Specification) とも呼ばれ、NFC の支配的な国際規格です。これは、ISO/IEC 14443 に基づいています。ISO/IEC 18092 には次の 2 つの通信モードがあります。

  • パッシブ: イニシエーター デバイスが搬送フィールドを生成し、ターゲット デバイスは既存のフィールドを変調することで応答します。このモードでは、ターゲット デバイスはその動作電力をイニシエーターが提供する電磁界から引き出します。

  • アクティブ: イニシエーター デバイスとターゲット デバイスの両方がそれぞれのフィールドを交互に生成することで通信します。デバイスは、データを待機している間は RF フィールドを非アクティブにします。このモードでは、通常は両方のデバイスが電源を持ちます。

この 2 つの通信モードの中には、ISO/IEC 18092 で定義されている 3 つの動作モードがあります。

  • 読み込み/書き込み: このモードでは、NFC デバイスはサポートされている任意の NFC タグ (非接触カード) のデータを、標準的な NFC データ形式で読み込みおよび書き込みできます。使用例には、ラベルやスマート ポスターに組み込まれている安価な NFC タグに保存されている情報の読み込みがあります。

  • カード エミュレーション: NFC デバイスは、他のリーダーに対する NFC タグとして動作することもできます。これにより、スマート フォンのような NFC 対応デバイスが、スマート カードのように動作して支払いや発券などのトランザクションを実行できます。

  • ピアツーピア: 2 つの NFC デバイスがデータを交換できます。使用例には、Wi-Fi® や Bluetooth® リンクの共有や、バーチャル ビジネス カードや写真の形式でのデータ交換があります。

システム設定

この例では、イニシエーターからターゲットにデータを送信するために必要な NFC プロトコルとコマンドを示します。ここでは、イニシエーターが電磁界を提供し、ターゲットがこれを変調することで情報を送り返すパッシブ通信モードを使用します。イニシエーターはライターとして、ターゲットはカード エミュレーターまたはタグとして動作します。イニシエーターとターゲットは次で定義されている Type A の無線インターフェイスを使用し、ISO/IEC 14443-2 (Identification cards - Contactless integrated circuit cards - Proximity cards - Part 2: Radio frequency power and signal interface)、106 kbps で動作します。イニシエーターは、以下の時間スコープに示すように、100% ASK の Modified Miller コーディングを使用します。ターゲットは、イニシエーターのフィールドを使用し、負荷変調を用いて周波数が 847.5 kHz (Fs) のサブキャリアを生成し、このサブキャリアを使用してイニシエーターの搬送波周波数のデータを変調します。Spectrum Analyzer は以下の負荷変調を示します。847.5 kHz のサブキャリアを強調表示するために、スペクトル アナライザーのウィンドウで [ツール]、[測定値]、[ピークの検出] を選択します。ターゲットは、以下の時間スコープに示すように、10% ASK のマンチェスター符号化を使用します。2 つの時間スコープで示す時間領域信号はベースバンド信号であること、すわなち 13.56 MHz の搬送波信号が取り除かれていることに注意してください。

nfcInitiator オブジェクトはイニシエーターを表します。UserData プロパティはターゲットに送信されるデータを保持します。nfcTarget オブジェクトはターゲットを表し、ReceivedUserData はイニシエーターから受信したデータを保持します。NFC デバイス間の距離が近いため、システム SNR は非常に大きくなります。

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 (Initialization and anticollision flowchart for PCD) および図 10 (Anticollision loop, flowchart for PCD) は次にあり、ISO/IEC 14443-3 (Identification cards - Contactless integrated circuit cards - Proximity cards, Part 3: Initialization and anticollision)、対応するフローチャートが示されています。ISO/IEC 14443-3 の 6 節 (Type A - Initialization and anticollision) にコマンドとプロトコルが詳しく説明されています。関数 nfcInitialization() および nfcAnticollisionLoop() は、コマンドとプロトコルに対応するシーケンスを実装します。例では、コマンドの流れを示すために、イニシエーターとターゲット デバイスのステータスとアクション、および交換される重要情報を出力します。

転送プロトコル

ISO/IEC 18092 で説明されているとおり、転送プロトコルには次の 3 つの部分があります。

  • プロトコルの有効化: このフェーズでは、ビット レートなどのさまざまなプロトコル パラメーターがネゴシエートおよび選択されます。ISO/IEC 18092 の 12.5 節 (Activation of the protocol) にこのフェーズが詳しく説明されています。関数 nfcProtocolActivation() は、このフェーズで必要なコマンドのシーケンスを実装します。

  • データ交換プロトコル: このフェーズでは、エラー処理を備えたブロック指向のデータ送信をサポートする、ハーフ デュプレックス プロトコルを使用して情報が交換されます。詳細については、ISO/IEC 18092 の 12.6 節 (Data Exchange Protocol) を参照してください。関数 nfcDataExchangeProtocol() は、ISO/IEC 18092 で規定されているとおりのデータ交換を実装する方法を示します。

  • プロトコルの無効化: データ交換が完了すると、イニシエーターはプロトコルとターゲットとの接続を無効化します。関数 nfcProtocolDeactivation() は、ISO/IEC 18092 の 12.7 節 (Deactivation of the protocol) で説明されているシーケンスを実装します。

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

探査

NFC 規格で説明されているさまざまなコマンドとプロトコルを理解するために、nfcInitiator および nfcTarget オブジェクトのさまざまなメソッドを調査します。SNR、UID 型 (Single または Double)、UID 値、SamplesPerSymbol などのさまざまなシステム パラメーターを試して、これらのパラメーターがシステムに与える影響を確認します。

参考文献

  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 18092 Information technology - Telecommunications and information exchange between systems - Near Field Communication - Interface and Protocol (NFCIP-1)