#準備
・デバイス:SONY RC-S380
・カード:manaca
・SDK for NFC Starter Kit
#カード情報の読み取り
「SDK for NFC ユーザーズマニュアルPC/SC編(Lite)」に記載されているAPDUの独自定義(拡張)コマンドを使用して、カードからIDm、PMmなどを取得する。
##操作手順
- SCardEstablishContext()関数でリソースマネージャのハンドルを取得。
SCARDCONTEXT hContext = 0; LONG lResult = ::SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hContext);
- SCardListReaders()関数でデバイス名を取得。
LPTSTR lpszReaderName = NULL; DWORD dwAutoAllocate = SCARD_AUTOALLOCATE; LONG lResult = ::SCardListReaders(hContext, NULL, (LPTSTR)&lpszReaderName, &dwAutoAllocate);
- SCardConnect()関数でカードに接続。
SCARDHANDLE hCard = 0; DWORD dwActiveProtocol = 0; LONG lResult = ::SCardConnect(hContext, lpszReaderName, SCARD_SHARE_SHARED,SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCard, &dwActiveProtocol);
- SCardTransmit()関数でコマンド送信・データ受信。
BYTE bySndCmd[] = {0x00, 0x00, 0x00, 0x00, 0x00}; //使用するコマンド。 BYTE byRcvBuf[8] = {0x00}; DWORD dwResSize = sizeof(byRcvBuf); LONG lResult = ::SCardTransmit(hCard, (SCARD_IO_REQUEST*)SCARD_PCI_T1, bySndCmd, sizeof(bySndCmd), NULL, byRcvBuf, &dwResSize);
- SCardDisconnect()関数でカードの切り離し。
::SCardDisconnect(hCard, SCARD_LEAVE_CARD);
- SCardFreeMemory()関数でデバイス名領域の解放
::SCardFreeMemory(hContext, lpszReaderName);
- SCardReleaseContext()関数でリソースマネージャの解放。
::SCardReleaseContext(hContext);
##コマンド例
操作手順4のSCardTransmit()関数で使用するコマンド。
・IDm取得
送信
CLA | INS | P1 | P2 | Lc | Data In | Le |
---|---|---|---|---|---|---|
FF | CA | 00 | 00 | - | - | 00 |
受信
Data | SW1 | SW2 |
---|---|---|
IDm(8バイト) | XX | XX |
SW1、SW2にはステータスが入る。
取得したIDmとステータスのイメージ。
01 02 03 04 11 12 13 14 90 00
#ソースコード
とりあえず詳細はGitHubにおいてあります。
よかったら見てください。
C++は勉強中なので、コメントを頂けると幸いです。
#参考
・SDK for NFC ユーザーズマニュアルPC/SC編(Lite)
・winscard.h header
・[PASMO] FeliCa から情報を吸い出してみる - FeliCaの仕様編 [Android][Kotlin]
・技術レポート「非接触ICカード技術"FeliCa(フェリカ)"のIDm読み取り方法
・PC/SC APIを用いてSuicaカードの利用履歴情報の読み取り