当社では独自のLinuxプラットフォームを開発しており、PN5190をカードリーダーとして長年にわたり正常に動作させてきました。
次に、「NfcrdlibEx8_HCE_T4T」の例のように、タイプ4Aタグとして機能させる方法を試してみます。リーダーライブラリバージョン7.14.00を使用してサンプルを試してみましたが、スレッドで報告されているのと同じ結果になりました: https://community.nxp.com/t5/NFC/HCE-T4T-Example-not-working-with-NXP-NFC-Library-v07-08-00-in/td-p/...
Android端末(Samsung S23 ultra)をNXPの「TagInfo」アプリでタップすると、無効なRATSが返されます。Rxバッファは、0x11、0xD4、...などから始まるデータを受信します。
[phacDiscLoop_Sw_Run] リスニングモードを開始します
[T4TCardEmulation] カードがリスニングモードで有効化されました...
[phpalI14443p4mC_Sw_Activate] RATS: 11 D4 00 8C 26 82 9B FA 12 01 DF 84 5B 00 00 00 30
[phpalI14443p4mC_Sw_Activate] 無効なRATSを受信しました...
電話機がNFC-DEP(P2Pモード/SNEP)で通信しようとしていることが原因でしょうか?
この問題の解決にご協力いただければ幸いです。
よろしくお願いします!
お世話になります。
お知らせいただきありがとうございます。それぞれの説明と最新情報について対応いたします。
すてきな一日を!
こんにちは、
この件に関して、さらに質問があります。
「 NfcrdlibEx8_HCE_T4T」サンプルを使用してデバイスをタイプ4カードエミュレータとして動作させることはできましたが、非常に動作が遅いようです。アプリケーションの手順は以下のとおりです。
1. デバイスはリーダー(ポーリング)モードで動作します
2. 電話をタップすると、モバイルウォレット内のカードが読み取られる。
3. 読み取り終了後すぐにRFをオフにする
4. HCEタイプ4カードエミュレーターモード(パッシブリスナーモード)でRFチップを再初期化します。
5. スマートフォンにURL(NDEF)を送信する
問題は、カードエミュレーターモードでRFチップを再初期化し、スマートフォンにURLを送信するのに約1500ミリ秒かかることです。
ユーザーがスマートフォンを長押ししたりタップしたりしなくても済むような、もっと速い方法はありますか?
Googleで検索したところ、以下のようにタイプ2タグを使用することで可能だと書かれていました。しかし、それはうまくいかなかった。電話には何も着信がありませんでした。
│
▼
ステップ1:フィールドを終了する
│(約1ms)
▼
ステップ2:NDEFデータの読み込み
│(約3ms)
▼
ステップ3:オートコールを実行する
500ミリ秒以内に高速なモード切り替えとURLの電話への送信を実現する方法について、具体的な手順をご教示いただければ幸いです。
よろしくお願いします!
上記の質問に関連して、フィールドを終了させた後に実装しようとしたコードを以下に示します。phhalHw_Autocoll() は成功を返しますが、phhalHw_Pn5190_Instr_ExchangeRFData() では 0x020A が返されます。
phhalHw_Pn5190_Autocoll() も以下のように更新されました。
phhalHw_Pn5190_Instr_SwitchModeAutocoll (pDataParams,bRfTechnology, PHHAL_HW_PN5190_AUTOCOLL_MODE_AUTONOMOUS_WITH_STANDBY ))
int card_emulator_main_cutdown(void)
{
する
{
整数 ret;
phStatus_t ステータス;
pHal_Hce = phNfcLib_GetDataParams(PH_COMP_HAL);
TRACE0("NfcLibデータパラメータポインタが正常に設定されました");
/* ======================================================================= */
/*
/* ======================================================================= */
TRACE0("ハードウェアターゲットレイヤーの設定とURLバッファの読み込み中...");
/* ターゲットモードHALパラメータの設定 */
status = phAppHce_HALConfigAutoColl();
CHECK_STATUS(ステータス);
if (status != PH_ERR_SUCCESS) {
TRACE1("phhalHw_TargetInit が失敗しました: 0x%04X", status);
ステータスを返します。
}
/* ======================================================================= */
/*
/* ======================================================================= */
TRACE0("100ms未満の自律リスニングモードに入ります...");
// 重大な修正: PH_ASSERT_NULL クラッシュを防ぐために有効なストレージメモリを割り当てます
uint8_t * pRxBufferPtr = NULL;
uint16_t wRxLengthData = 0;
uint16_t wProtocolParams = 0;
// HALのパラメータフットプリントに厳密にマッピングされた関数を実行します。
// スイッチコードにパッシブNFC-Aテクノロジーを選択するように指示するために「A_MODE」を渡します。
ステータス = phhalHw_Autocoll(
pHal_Hce、
A_MODE、// NFC-Aテクノロジーのプロファイリングを強制するビットマスクフラグ
&pRxBufferPtr, // ポインタへの有効なポインタ参照として渡されます
&wRxLengthData, // 長さへの有効なポインタ参照として渡されます
&wProtocolParams // パラメータへの有効なポインタ参照として渡されます
);
if ((status & PH_ERR_MASK) == PH_ERR_SUCCESS) {
TRACE0("
TRACE1("デラップされたアクティベーションプロトコルパラメータ: 0x%04X", wProtocolParams);
/* ======================================================================= */
/*
/* ======================================================================= */
TRACE0("電話のファイルシステム読み取りコマンドを待機しています...");
// データ交換バッファを割り当てる
uint8_t * pDataIn = NULL;
uint16_t wDataInLen = 0;
// 電話機が起動直後に送信した最初のデータパケットを取得します
// Autocoll スニペットは既にアドレスを pRxBufferPtr / wRxLengthData に格納しています
pDataIn = pRxBufferPtr;
wDataInLen = wRxLengthData;
// 電話機の読み取りコマンドを処理するための高速ループに入ります
// 電話機は「NDEFアプリケーションを選択」→「NDEFファイルを選択」→「バイナリを読み込む」というメッセージを送信します。
//while (1)
ヤージュ
// 0x0225 チェックをバイパスするには、正しいターゲット エミュレーション送信関数を使用してください
//PH_RECEIVE_RF_ENABLE_EVT_STATUS は転送のイベント追跡を有効にします
ステータス = phhalHw_Pn5190_Instr_ExchangeRFData(
pHal_Hce、
PH_EXCHANGE_DEFAULT、// wOption
0, // bTxLastBits (0は完全な8ビットバイトレイアウトを示す)
0x05、// bRespControl: ビットマスク 0x04 (イベントステータス) | 0x01 (受信ステータス)
aNdefFile、// URL配列構造
23, // URLデータペイロードのサイズ
&pRxBufferPtr, // レスポンスデータポインタのアドレス
&wRxLengthData // 受信する長さトラッカーのアドレス
);
if (status == PH_ERR_SUCCESS) {
TRACE0("
} それ以外 {
TRACE1("注入ステータス/タイムアウト: 0x%04X (電話が正常に切断された可能性が高い)", status);
}
}
} それ以外 {
TRACE1("Autocoll が終了、タイムアウト、またはステータス 0x%04X で破棄されました", status);
}
} while(0);
0を返す。
}
// /* 必須の NDEF ファイル。phceT4T_SetElementaryFile を使用して設定されます。*/
uint8_t aNdefFile[] = {
/* ---
//0x02、// 1. PCBバイト:このフレームをパート4 Iブロック(ブロック番号0)として構成します
0x00、0x13、// 1. T4Tコンテナ長インジケータ(ペイロード合計19バイト)
0xD1、// 2. NDEFレコードヘッダー(MB=1、ME=1、SR=1、TNF=0x01 既知タイプ)
0x01、// 3. タイプ長(1バイト長の名前)
0x0F、// 4. ペイロード長(プレフィックス+文字列で15バイト)
0x55、// 5. レコードタイプ: 'U' (URIレコードの場合は0x55)
0x02、// 6. URI識別子プレフィックス: コード0x02は「 https://www. 」にマッピングされます。
// 7. URIペイロード文字列(14バイト)
0xww、0xww、0xww、0xww、0xww、0xww、0xww、0xww、0xww、0xww、0xww、0xww、0xww、0xww、0xww、
/* ---
0x90、0x00 // 21-22。APDU成功ステータス(Androidに対し、データ読み取りが完了したことを通知する)
};
出力:
06-16 17:34:31.600 26047 27687 E nfc : [card_emulator_main_cutdown] NfcLibデータパラメータポインタが正常に設定されました
06-16 17:34:31.600 26047 27687 E nfc : [card_emulator_main_cutdown] ハードウェアターゲットレイヤーの設定とURLバッファの読み込み中...
06-16 17:34:31.605 26047 27687 E nfc : [card_emulator_main_cutdown] 100ms未満の自律リスニングモードに入ります...
06-16 17:34:31.607 26047 27999 V nfc : [socket_send_thread] socketSend に入りました
06-16 17:34:31.607 26047 27999 V nfc :
06-16 17:34:32.456 26047 27687 E nfc : [card_emulator_main_cutdown]
06-16 17:34:32.456 26047 27687 W nfc : [card_emulator_main_cutdown] アクティベーションプロトコルパラメータのデラップ: 0x0100
06-16 17:34:32.456 26047 27687 E nfc : [card_emulator_main_cutdown] 電話のファイルシステム読み取りコマンドを待機しています...
06-16 17:34:32.456 26047 27687 W nfc : [card_emulator_main_cutdown] インジェクションステータス / タイムアウト: 0x020A (電話機は正常に切断された可能性が高い)