このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
近距離無線通信 (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 などのさまざまなシステム パラメーターを試して、これらのパラメーターがシステムに与える影響を確認します。
参考文献
ISO/IEC 14443-2 Identification cards - Contactless integrated circuit cards - Proximity cards - Part 2: Radio frequency power and signal interface
ISO/IEC 14443-3 Identification cards - Contactless integrated circuit cards - Proximity cards - Part 3: Initialization and anticollision
ISO/IEC 18092 Information technology - Telecommunications and information exchange between systems - Near Field Communication - Interface and Protocol (NFCIP-1)