2014-09-21 123 views
1

我正在使用ACR122U NFC讀取器來密碼保護NTAG213 NFC標籤。我想我已經設法正確地設置了密碼,但之後我無法驗證並更改標籤。我對認證的代碼如下所示:無法驗證NTAG213

#include <winscard.h> 
#include <iostream> 
#pragma comment(lib, "winscard.lib") 

const char *ReaderName = "ACS ACR122 0"; 
unsigned Password = 0x12345678; 

int main() 
{ 
    //Establish context 
    SCARDCONTEXT    hContext; 
    DWORD SCard_Status1 = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hContext); 
    if(SCard_Status1 != SCARD_S_SUCCESS) 
    return 1; 

    //connect to the card 
    SCARDHANDLE hCardHandle; 
    DWORD Protocol; 
    DWORD SCard_Status2 = SCardConnect(hContext, ReaderName, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T1, &hCardHandle, &Protocol); 
    if(SCard_Status2 != SCARD_S_SUCCESS) 
    { 
    SCardReleaseContext(hContext); 
    return 1; 
    } 

    SCARD_IO_REQUEST Request; 
    Request.dwProtocol = Protocol; 
    Request.cbPciLength = sizeof(SCARD_IO_REQUEST); 
    BYTE TxData[] = 
    { 
    0xFF, //CLA 
    0x00, //INS 
    0x00, //P1 
    0x00, //P2 
    0x08, //LC 
    0xD4, 
    0x40, 
    0x01, 
    0x1B, //PWD_AUTH (See data sheet) 
    Password, 
    Password >> 8, 
    Password >> 16, 
    Password >> 24, 
    }; 

    BYTE RxData[254]; 
    unsigned long RxLength = sizeof(RxData); 
    DWORD SCard_Status3 = SCardTransmit(hCardHandle, &Request, TxData, sizeof(TxData), NULL, RxData, &RxLength); 
    std::cout << "SCard_Status = " << SCard_Status3 << std::endl; 
    std::cout << "RxLength = " << RxLength << std::endl; 

    SCardDisconnect(hCardHandle, SCARD_EJECT_CARD); 
    SCardReleaseContext(hContext); 
    return 0; 
} 

這應該發送PWD_AUTH命令與PWD的NTAG213。如果密碼錯誤,我預計會收到一個錯誤消息,如果密碼正確,我希望收到一個錯誤消息。但之後SCard_Status爲SCARD_S_SUCCESS,RxLength爲0。如果我嘗試寫入標籤,則會出現錯誤。

我無法找到任何示例顯示如何執行此操作。任何人都可以看到我做錯了什麼?

+0

如果SCardTransmit返回「SCARD_S_SUCCESS」,則RxData應該是「9000」。 – vikky 2014-09-22 11:58:36

+0

是的,但RxData不是寫成RxLength爲0. – 2014-09-22 12:08:57

+0

如果RxData爲空,這意味着在SCardTransmit.Con中存在一些問題,您發佈了所有代碼? – vikky 2014-09-22 12:20:29

回答

2

我會自己回答這個問題。我設法使其通過改變TXDATA此工作:

BYTE TxData[] = 
{ 
    0xFF, //CLA 
    0x00, //INS 
    0x00, //P1 
    0x00, //P2 
    0x07, //LC 
    0xD4, 0x42, //InCommunicateThru 
    0x1B, //PWD_AUTH (See data sheet) 
    Password, 
    Password >> 8, 
    Password >> 16, 
    Password >> 24, 
}; 

我發現命令InCommunicateThru(D4 42)作爲用於InDataExchange(D4 40)在數據表中的PN532,它是NFC處理器的替換在ACR122U內部。