目录

前言

一. ST25R3911B芯片资料

1.1 公开的资料

二. 大致流程

2.1 读取二代卡流程

三. 修改地方 

3.1 demoPollNFCB修改后

3.2 demoPollNFCB修改前 

四. 读取的数据 

4.1 抓的交互数据包

五. 参考资料 

5.1 论坛

5.2 资料

前言

读取二代身份证的uid的流程的资料是公开的,参考了以下两篇文章,用ST25R3911B测试了下,也可以读出取二代卡的uid,接下来介绍下

软sim卡

利用PN532读取二代证UID

接下来让我们一起读取邪恶贝利亚的UID吧

一. ST25R3911B芯片资料

1.1 公开的资料

参考st论坛有没有ST25R3911B简单的对NFC卡进行读写的例子

帖子有网盘回复,里面有很多st官方的st25r3911的示例代码,可以下载参考。

st25r3911b开发板的资料

ST25R3911B NFC Board - Waveshare Wiki

提取这里的资源,下载后里面也有读取二代卡的例程,如下图

我试了下,我的二代卡可以读,但是这几年21年后生产的二代卡读不了。修改下demo.c里面的发送包方式就都可以读了

二. 大致流程

2.1 读取二代卡流程

1.读卡器发送 :05 00 00    (询卡命令)

二代卡回复:50 00 00 00 00 xx xx xx xx xx xx xx (代表询卡成功)

2.读卡器发送:1d 00 00 00 00 00 08 01 08 (对二代身份证进行选卡操作)

二代卡回复:08 xx xx  ( 回复的首字节为08 代表SELECT命令操作成功)

3.读卡器发送:00 36 00 00 08 (读取UID命令)

二代卡回复:xx xx xx xx xx xx xx xx 90 00 (90 00 为应答,前面8字节为卡片实际的UID)

三. 修改地方 

3.1 demoPollNFCB修改后

二代卡是typeB类型的卡,直接修改demo.c的demoPollNFCB例程就行(这里修改好了),我这里把logo打印有点问题,就直接删除了,直接拿串口打印printf函数调试,

bool demoPollNFCB( void )
{
    ReturnCode            err;
    rfalNfcbListenDevice  nfcbDev;
    bool                  found = false;
    uint8_t               devCnt = 0;
    
    /*******************************************************************************/
    /* ISO14443B/NFC_B_PASSIVE_POLL_MODE                                           */
    /*******************************************************************************/

    rfalNfcbPollerInitialize();   /* Initialize for NFC-B */
    rfalFieldOnAndStartGT();      /* Turns the Field On if not already and start GT timer */

    printf("this is nfc b\r\n");

    printf("begin---------------------\r\n");
    ///////////////////////这里新添加/////////////////////////////
    // err = rfalNfcbPollerTechnologyDetection(RFAL_COMPLIANCE_MODE_ISO, &nfcbDev.sensbRes, &nfcbDev.sensbResLen);
    // //没找到卡片
    // printf("rfalNfcbPollerTechnologyDetection---err=%d\r\n",err);

    {
      //1.读卡器发送 :05 00 00 (询卡命令)
      uint8_t ID_CMD[] = {0x05,0x00,0x00};
      uint16_t   rxLen;
      err =  rfalTransceiveBlockingTxRx( ID_CMD, sizeof(ID_CMD), gRxBuf.rxBuf, sizeof(gRxBuf.rxBuf), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, gDevProto.isoDepDev.info.FWT + gDevProto.isoDepDev.info.dFWT );
      printf("rfalTransceiveBlockingTxRx_ID_CMD1----------err=%d\r\n",err);
      
    }
    platformDelay(100);


    {
      //2.读卡器发送:1d 00 00 00 00 00 08 01 08 (对二代身份证进行选卡操作)
      uint8_t ID_CMD[] = {0x1d,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x08};
      uint16_t   rxLen;
      err =  rfalTransceiveBlockingTxRx( ID_CMD, sizeof(ID_CMD), gRxBuf.rxBuf, sizeof(gRxBuf.rxBuf), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, gDevProto.isoDepDev.info.FWT + gDevProto.isoDepDev.info.dFWT );
      printf("rfalTransceiveBlockingTxRx_ID_CMD1----------err=%d\r\n",err);
      
    }


    {
     //3.读卡器发送:00 36 00 00 08 (读取UID命令)
      uint8_t ID_CMD[] = {0x00,0x36,0x00,0x00,0x08};
      uint16_t   rxLen;
      /* Exchange APDUs */
      err =  rfalTransceiveBlockingTxRx( ID_CMD, sizeof(ID_CMD), gRxBuf.rxBuf, sizeof(gRxBuf.rxBuf), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, gDevProto.isoDepDev.info.FWT + gDevProto.isoDepDev.info.dFWT );
      printf("rfalTransceiveBlockingTxRx_ID_CMD2----------err=%d\r\n",err);
      if(err == 0)
      {
        printf("ID card found. 'UID': %s\r\n", hex2Str(gRxBuf.rxBuf, rxLen-2));//90 00 为应答,gRxBuf.rxBuf 的前面8字节为卡片实际的UID
      }
      

    }

  printf("end---------------------\r\n");
  platformDelay(500);
  return found;
}

3.2 demoPollNFCB修改前 

 未修改的例程,这里是前面那个网盘下载的源码,这个也可以读取UID,只是最新的二代卡读取不了,前面的demoPollNFCB修改后是可以直接读取的

/*!
 *****************************************************************************
 * \brief Poll NFC-B
 *
 * Configures the RFAL to NFC-B (ISO14443B) communication and polls for a nearby 
 * NFC-B device. 
 * If a device is found turns On a LED and logs its UID.
 * Additionally, if the Device supports ISO-DEP protocol (ISO144443-4) it will 
 * activate the device and try exchange some APDUs with PICC
 * 
 *  \return true    : NFC-B device found
 *  \return false   : No device found
 * 
 *****************************************************************************
 */
bool demoPollNFCB( void )
{
  ReturnCode            err;
  rfalNfcbListenDevice  nfcbDev;
  bool                  found = false;
  uint8_t               devCnt = 0;
  
  /*******************************************************************************/
  /* ISO14443B/NFC_B_PASSIVE_POLL_MODE                                           */
  /*******************************************************************************/

  rfalNfcbPollerInitialize();   /* Initialize for NFC-B */
  rfalFieldOnAndStartGT();      /* Turns the Field On if not already and start GT timer */

  
  err = rfalNfcbPollerCollisionResolution( RFAL_COMPLIANCE_MODE_NFC, 1, &nfcbDev, &devCnt );
  if( (err == ERR_NONE) && (devCnt > 0) ) 
  {
    /**********************************************/
    /* NFC-B card found                           */
    /* NFCID/UID is contained in: sensbRes.nfcid0 */
    found = true;
    platformLog("ISO14443B/NFC-B card found. UID: %s\r\n", hex2Str(nfcbDev.sensbRes.nfcid0, RFAL_NFCB_NFCID0_LEN));
    platformLedOn(PLATFORM_LED_B_PORT, PLATFORM_LED_B_PIN);
    
  }
  
  /* Check if device supports ISO14443-4/ISO-DEP */
  if( nfcbDev.sensbRes.protInfo.FsciProType & RFAL_NFCB_SENSB_RES_PROTO_ISO_MASK )
  {      
    
    /* Activate the ISO14443-4 / ISO-DEP layer */            
    rfalIsoDepInitialize();
    err = rfalIsoDepPollBHandleActivation((rfalIsoDepFSxI)RFAL_ISODEP_FSDI_DEFAULT, RFAL_ISODEP_NO_DID, RFAL_BR_424, RFAL_ISODEP_ATTRIB_REQ_PARAM1_DEFAULT, &nfcbDev, NULL, 0, &gDevProto.isoDepDev );
      
    if( err == ERR_NONE )
    {
      platformLog("ISO14443-4/ISO-DEP layer activated. \r\n");
      
      /* Exchange APDUs */
      demoSendAPDUs();
    }
  }
  else if(nfcbDev.sensbRes.nfcid0[0]==0 && nfcbDev.sensbRes.nfcid0[1] == 0 && nfcbDev.sensbRes.nfcid0[2] == 0 && nfcbDev.sensbRes.nfcid0[3] ==0)
  {
		
    rfalIsoDepInitialize();
    err = rfalIsoDepPollBHandleActivation((rfalIsoDepFSxI)RFAL_ISODEP_FSDI_DEFAULT, RFAL_ISODEP_NO_DID, RFAL_BR_106, RFAL_ISODEP_ATTRIB_REQ_PARAM1_DEFAULT, &nfcbDev, NULL, 0, &gDevProto.isoDepDev );
      
    if( err == ERR_NONE )
    {
      platformLog("ID card activated. \r\n");
      uint8_t ID_CMD[] = {0x00,0x36,0x00,0x00,0x08};
      uint16_t   rxLen;
      /* Exchange APDUs */
      err =  rfalTransceiveBlockingTxRx( ID_CMD, sizeof(ID_CMD), gRxBuf.rxBuf, sizeof(gRxBuf.rxBuf), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, gDevProto.isoDepDev.info.FWT + gDevProto.isoDepDev.info.dFWT );
      if( err == ERR_NONE )
      platformLog("ID card found. 'UID': %s\r\n", hex2Str(gRxBuf.rxBuf, rxLen-2));
     
    }
  }
  return found;
}

四. 读取的数据 

4.1 抓的交互数据包

这是demoPollNFCB修改后,使用读卡器发送数据包和二代卡回复数据包

五. 参考资料 

5.1 论坛

关于ST公司的NFC芯片ST25R3911b使用讨论

有没有ST25R3911B简单的对NFC卡进行读写的例子

5.2 资料

百度网盘 请输入提取码 提取码: 3j44)

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐