久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5900|回復: 8
打印 上一主題 下一主題
收起左側

STM32 RFID-RC522修改卡的密碼?求指教

[復制鏈接]
跳轉到指定樓層
樓主
ID:511461 發表于 2019-10-19 15:45 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
      近期,在RFID-RC522模塊,能夠讀取卡的ID,也會向卡讀寫數據,但關于修改密碼方面,不是很懂,希望大神能指教一番。


#include "stm32f10x.h"
#include "bsp_SysTick.h"
#include "bsp_usart1.h"
#include "rc522_config.h"
#include "rc522_function.h"
#include <stdbool.h>
#include "bsp_lcd.h"



void IC_test ( void )
{
        char cStr [ 30 ];
  u8 ucArray_ID [ 4 ];                                                                                             //先后存放IC卡的類型和UID(IC卡序列號)
        u8 ucStatusReturn;                                                                                               //返回狀態
  static u8 ucLineCount = 0;
               
  while ( 1 )
  {
                if ( ( ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ) ) != MI_OK )                                    //尋卡
                        ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID );                                                                 //若失敗再次尋卡

                if ( ucStatusReturn == MI_OK  )
                {
                        if ( PcdAnticoll ( ucArray_ID ) == MI_OK )                                                                   //防沖撞(當有多張卡進入讀寫器操作范圍時,防沖突機制會從其中選擇一張進行操作)
                        {
                                sprintf ( cStr, "The Card ID is: %02X%02X%02X%02X", ucArray_ID [ 0 ], ucArray_ID [ 1 ], ucArray_ID [ 2 ], ucArray_ID [ 3 ] );                                
                                printf ( "%s\r\n",cStr );
                                ucLineCount ++;
                                
                                if ( ucLineCount == 17 ) ucLineCount = 0;                                                               
                        }                        
                }
  }        
}




/**
  * @brief  主函數
  * @param  無
  * @retval 無
  */
int main ( void )
{
        SysTick_Init ();   //滴答時鐘初始化
        
        USART1_Config ();  //USART1 配置模式為 115200 8-N-1,中斷接收
        
        RC522_Init ();     //RC522模塊所需外設的初始化配置

        printf ( "WF-RC522 Test\n" );
               
        PcdReset ();
        M500PcdConfigISOType ( 'A' );//設置工作方式
        
        
  while ( 1 )
  {
    IC_test ();//IC卡檢測        
                //printf ( "11111111111");
  }        
}

讀卡器stm32RCT6.7z

210.6 KB, 下載次數: 39

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:174087 發表于 2019-10-21 17:16 | 只看該作者
S50卡的密碼存放在每個扇區的第三塊,想要修改扇區密碼要先確保KEYA和KEYB是默認的,然后使用默認密碼去進行讀寫,讀寫操作步驟和向卡寫數據的步驟是一樣的,需要先驗證密碼,注意不要修改到密碼控制字節,否則可能將該扇區鎖死
回復

使用道具 舉報

板凳
ID:235200 發表于 2019-10-21 22:19 | 只看該作者
有兩個密碼,分別是密碼A和密碼B,根據第3塊的存取控制能夠對密碼A或密碼B進行修改,但不是任何一個存取控制都能修改密碼,如C13 C23 C33為010 110 101 111 不能修改密碼A和密碼B  
回復

使用道具 舉報

地板
ID:511461 發表于 2019-10-23 19:09 | 只看該作者
修改密碼的我會了,但是我發現我修改了A的密碼,比如說改為存在NEWKEY數組里,但是此時我的B的密碼就不是他之前的密碼了,我也不知道改為啥了,試了A的新密碼也不對
回復

使用道具 舉報

5#
ID:511461 發表于 2019-10-23 19:11 | 只看該作者
但是我改完B的密碼,存在NEWKEYB數組里,此時A的密碼也變了,也不是之前的了,變成B的新密碼了,
嗯。。,我說的比較繞,但就是這個意思,希望有大佬幫忙解決一下
回復

使用道具 舉報

6#
ID:174087 發表于 2019-10-24 11:49 | 只看該作者
aaaaaa。 發表于 2019-10-23 19:09
修改密碼的我會了,但是我發現我修改了A的密碼,比如說改為存在NEWKEY數組里,但是此時我的B的密碼就不是他 ...

你用來存放密碼的數組多大的,修改密碼時必須是密碼A密碼B控制字全部寫進去,也就是你的數組格式應該是【新的密碼A控制字新的密碼B】,這樣寫進去才會是你想要的密碼,不然的話另一個密碼就是0或者亂碼
回復

使用道具 舉報

7#
ID:511461 發表于 2019-10-24 13:01 | 只看該作者
這是總的程序
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "rc522_function.h"
#include "rc522_config.h"


//u8 KEYA[6]={8,8,8,8,8,8};   //管理員卡秘鑰A (管理員權限)
//u8 KEYB[6]={6,5,4,3,2,1};   //管理員卡秘鑰B (管理員權限)
u8 KEYA[6]={0xff,0xff,0xff,0xff,0xff,0xff};

u8 NEWKEYA[6]={1,2,3,4,5,6};
u8 NEWKEYB[6]={0x11,0x22,0x33,0x44,0x55,0x66};
u8 NEW[6]={0x66,0x55,0x44,0x33,0x22,0x11};
u8 KEYB[6]={0xff,0xff,0xff,0xff,0xff,0xff};
u8 writedata[6]={0x11,0x26,0x11,0x28};
u8 ucArray_ID [ 4 ];
u8 pdataread[10];



int KEYA_in(int block)//選定卡片并輸出密碼A,///輸入卡片塊地址(0-63)
{
        u8 pan,bat,cad;
        PcdSelect(ucArray_ID);//選定卡片
        pan=0;
        printf("正在輸入密碼..............\r\n");
        pan=PcdAuthState(0x60, block ,NEWKEYB,ucArray_ID);//輸入密碼
        if(pan==0x26)
        {
                printf("密碼正確\r\n");
          //PcdWrite(block+1,NEWKEYB);                return 1;
        }
        else
        {
                printf("密碼錯誤\r\n");
                return 0;
        }
}

void KEYB_in(int block)//選定卡片并輸出密碼A,///輸入卡片塊地址(0-63)
{
        int t=0;
        u8 pan;
        PcdSelect(ucArray_ID);//選定卡片
        t=0;
        pan=0;
        printf("正在輸入密碼..............\r\n");
        while(t<5&&pan!=0x26)
        {
                t++;
                pan=PcdAuthState(0x61, block ,NEWKEYB,ucArray_ID);//輸入密碼
        }
        if(pan==0x26)
        {
                printf("SUCCESS\r\n");
                //PcdWrite(block+1,NEWKEYB);
        }
        else
        {
                printf("FAIL\r\n");
        }
}


void write_kuai(int address,u8 * pdata)//在一個塊寫數據
{
        u8 pan=0;
        printf("正在對塊%d寫入數據..............\r\n",address);       
        pan=PcdWrite(address,pdata);
        if(pan==0x26)
        {
                printf("寫入成功\r\n");
        }
        else
        {
                printf("寫入失敗\r\n");
        }
}


void read_kuai(int address)//讀出數據塊并打印數據到串口
{
        u8 pan=0;
        char num[10];
        //u8 unum[10];
        printf("正在對扇區%d讀取數據..............\r\n",address);       
        pan=PcdRead(address,pdataread);
        sprintf (num,"%2X%2X%2X%2X",pdataread [ 0 ],pdataread [ 1 ],pdataread [ 2 ],pdataread [ 3 ]);
        //unum[0]=num[0];unum[1]=num[1];unum[2]=num[2];unum[3]=num[3];unum[4]=num[4];unum[5]=num[5];unum[6]=num[6];unum[7]=num[7];
        if(pan==0x26)
        {
                printf("讀取成功\r\n數據為%s\r\n",num);
        }
        else
        {
                printf("讀取失敗\r\n");
        }
}

u8 IC_test ( void )
{
        char cStr [ 30 ];
  //u8 ucArray_ID [ 4 ];                                                                                             //先后存放IC卡的類型和UID(IC卡序列號)
        u8 ucStatusReturn;                                                                                               //返回狀態
  static u8 ucLineCount = 0;
               
  while ( 1 )
  {
                if( ( ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ) ) != MI_OK )       //尋卡
                {
                        ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID );                                  //若失敗再次尋卡
                }
                if ( ucStatusReturn == MI_OK  )
                {
                        if ( PcdAnticoll ( ucArray_ID ) == MI_OK )         //防沖撞(當有多張卡進入讀寫器操作范圍時,防沖突機制會從其中選擇一張進行操作)
                        {
                                sprintf ( cStr, "The Card ID is: %02X%02X%02X%02X", ucArray_ID [ 0 ], ucArray_ID [ 1 ], ucArray_ID [ 2 ], ucArray_ID [ 3 ] );
                                                               
                                printf ( "%s\r\n",cStr );                                
                                ucLineCount ++;                               
                                if ( ucLineCount == 17 ) ucLineCount = 0;       
        return 1;                               
                        }                       
                }               
  }       
}

int main(void)
{
   u8 flag=0;
        delay_init();                     //延時函數初始化          
        uart_init(115200);                 //串口初始化為9600
        LED_Init();                                  //初始化與LED連接的硬件接口
        //LCD_Init();
       
        RC522_Init ();     //RC522模塊所需外設的初始化配置         

        printf ( "WF-RC522 Test\r\n" );
               
        PcdReset ();
        M500PcdConfigISOType ( 'A' );//設置工作方式
        while(1)
        {
                 flag=IC_test ();
     if(flag==1)//IC卡檢測,返回UID
                 {
                         flag=0;
                         KEYA_in(26);
                         //KEYB_in(26);
//                         write_kuai(1,writedata);
//                         read_kuai(1);
                 }       
                 LED0=!LED0;         
                 delay_ms(1000);       
        }
}

以下只是修改密碼那部分的內容
u8 KEYA[6]={0xff,0xff,0xff,0xff,0xff,0xff};
u8 NEWKEYA[6]={1,2,3,4,5,6};
u8 NEWKEYB[6]={0x11,0x22,0x33,0x44,0x55,0x66};
u8 KEYB[6]={0xff,0xff,0xff,0xff,0xff,0xff};

int KEYA_in(int block)//選定卡片并輸出密碼A,///輸入卡片塊地址(0-63)
{
        u8 pan,bat,cad;
        PcdSelect(ucArray_ID);//選定卡片
        pan=0;
        printf("正在輸入密碼..............\r\n");
        pan=PcdAuthState(0x60, block ,NEWKEYB,ucArray_ID);//輸入密碼
        if(pan==0x26)
        {
                printf("密碼正確\r\n");
          //PcdWrite(block+1,NEWKEYB);                return 1;
        }
        else
        {
                printf("密碼錯誤\r\n");
                return 0;
        }
}

KEYA_in(6);   // 修改的是第二扇區的密碼,也就是對數據塊7進行修改,修改密碼的數組長度為6,里面存儲著A的新密碼,
大佬,那你的意思是不是如果要修改密碼,就定義一個長度為16的數組,其中A占前六個,中間4個為控制字,后6個是B的新密碼,是不是這樣子呢??如果是的話,那在修改密碼前,進行驗證的時候,是不是A和B的原密碼都要驗證呢??是先A后B,還是和修改時一樣,定義長度為16的數組,一起驗證


回復

使用道具 舉報

8#
ID:235200 發表于 2019-10-24 13:03 | 只看該作者
woshige 發表于 2019-10-24 11:49
你用來存放密碼的數組多大的,修改密碼時必須是密碼A密碼B控制字全部寫進去,也就是你的數組格式應該是【 ...

建立16個元素的數組,A密碼存在0-5 控制字存在6-9,B密碼存在10-15,修改A密碼時,第6-15的元素不能改,然后整個數組寫入某扇區的第3塊即可
回復

使用道具 舉報

9#
ID:511461 發表于 2019-10-24 20:15 | 只看該作者
csmyldl 發表于 2019-10-24 13:03
建立16個元素的數組,A密碼存在0-5 控制字存在6-9,B密碼存在10-15,修改A密碼時,第6-15的元素不能改,然后整 ...

那修改之前還要進行驗證的吧,驗證的時候要對A和B扇區都要驗證嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 麻豆av片 | 最新中文在线视频 | 一级黄色淫片 | 精品在线观看入口 | 欧美精品在线免费 | 欧美在线播放一区 | 国产日韩一区 | 国产精品欧美一区二区 | 毛片一区二区三区 | 精品一区二区三区免费视频 | 精品少妇一区二区三区在线播放 | 色综合一区二区三区 | 日韩欧美中文字幕在线观看 | 好好的日在线视频 | 中文成人在线 | 中文字幕日韩一区 | 久久丁香 | 午夜一区二区三区在线观看 | 国产成人短视频在线观看 | 欧美一级免费看 | 中文字幕乱码一区二区三区 | 人人爽人人爽 | 九九热精品视频 | 99免费精品| 艹逼网 | 91精产国品一二三区 | 日本 欧美 国产 | 国产精品久久av | 日韩一区二区在线视频 | 天堂久| 一区二区三区不卡视频 | 亚洲精品成人在线 | 可以在线观看av的网站 | 一区视频在线 | 在线观看黄色电影 | 亚洲视频一区 | 久久精品视频在线播放 | 国产在线精品一区 | 国产乱码精品一区二区三区忘忧草 | 亚洲精品免费在线观看 | 国产午夜精品视频 |