📄 mifare_test_mini.c
字号:
/*Mifare Test program
Wang Yue 2004-11-12
*/
#include <stdio.h>
#include <stdlib.h>
#include <api.h>
#include <ExEH0218.h>
#include <contactless.h>
#include "common.h"
unsigned char dummy_key[6] = "\xFF\xFF\xFF\xFF\xFF\xFF";
unsigned char g_sector = 1; //operation sector
void rf_read_card(void);
int read_sector( int sec_num,unsigned char *rdata);
char MyCardAccessMultiBlocks( unsigned char auth_mode,
unsigned char WR_mode,
unsigned char sector,
unsigned char Block,
unsigned char BlockCnt,
unsigned char* rdata,
unsigned char* wdata );
int mifare_test(void)
{
short ret;
BROWINFO INFO_main;
unsigned char menu_info[50];
if(Get_Language()==LANG_CHN)
{
strcpy(menu_info,"1.Mifare读 2.Mifare写 ");
}
else
{
strcpy(menu_info,"1.Mifare Read 2.Mifare Write ");
}
clr_scr();
INFO_main.lPtr = 0;
INFO_main.cPtr = 0;
while(1)
{
clr_scr();
INFO_main.iStr = menu_info;
INFO_main.mInt = 2;
INFO_main.lineMax = 16;
INFO_main.sFont = 0;
INFO_main.numEnable = 0;
INFO_main.qEvent = EXIT_KEY_F1|EXIT_AUTO_QUIT;
INFO_main.autoexit = 0;
ret = brow_select(&INFO_main);
switch( ret )
{
case 0:
rf_read_card();
break;
case 1:
rf_write_card();
break;
default:
return -1;
break;
}
}
//RCX_Close();
return 0;
}
void rf_read_card( void )
{
BROWINFO bi;
GETSTR_PARAM gs;
unsigned char dumpstr[25*8],str[20];
int x,y;
unsigned char sector = 0;
unsigned char rdata[1030];
char str1[20];
if(Get_Language()==LANG_CHN)
{
strcpy(str1,"扇区号(0-15):");
}
else
{
strcpy(str1,"SEC(0-15):");
}
clr_scr();
sprintf( dumpstr, "%d", sector );
gs.qx = 0;
gs.qy = 0;
gs.pPrompt = str1;
gs.sFont = 0;
gs.alpha = 0;
gs.nullEnable = 0;
gs.csChar = '_';
gs.pwChar = 0;
gs.spChar = 0;
gs.pStr = dumpstr;
gs.maxNum = 2;
gs.minNum = 1;
gs.minValue = 0;
gs.maxValue = 15;
gs.retNum = strlen(dumpstr);
gs.qEvent = EXIT_KEY_F1;
if ( !huGetStr_E(&gs) )
{
sector = gs.retValue;
if ( read_sector(sector,rdata))
{
return;
}
for ( y=0; y<6; y++ )
{
for ( x=0; x<8; x++ )
{
sprintf( dumpstr+y*24+x*3, "%02X ", rdata[y*8+x] );
}
}
if(Get_Language()==LANG_CHN)
{
sprintf( str, "[扇区 %d]", gs.retValue );
}
else
{
sprintf( str, "[SEC %d]", gs.retValue );
}
DispStr_CE(0,0,str,DISP_POSITION|DISP_CLRSCR);
bi.iStr = dumpstr;
bi.mInt = 6;
bi.lineMax = 18;
bi.sFont = 1;
bi.startLine = 2;
bi.dispLines = 6;
bi.qEvent = EXIT_KEY_F1;
brow_info(&bi);
}
}
int read_sector( int sec_num,unsigned char *rdata)
{
unsigned char cntr, card_read_ok;
unsigned char TempStatus, str[20];
char str1[20],str2[20],str3[20];
if(Get_Language()==LANG_CHN)
{
strcpy(str1,"卡接口错误!");
strcpy(str2,"请在10秒内刷卡");
strcpy(str3,"未读到合法卡!");
}
else
{
strcpy(str1,"INTERFACE ERR!");
strcpy(str2,"Put Card:10 Secs");
strcpy(str3,"NO CARD!");
}
if( InitMC530(TYPE_A_ISO14443)!=RCX_OK )
{
//MC530Off();
DispStr_CE(0,3,str1,DISP_POSITION|DISP_CLRSCR);
delay_and_wait_key( 5, EXIT_KEY_ALL, 0 );
return -1;
}
DispStr_CE(0,0,str2,DISP_POSITION|DISP_CLRSCR);
SPT_set(64);
for ( card_read_ok=0,cntr=10; cntr&&!card_read_ok; )
{
if (!SPT_read())
{
cntr--;
if(Get_Language()==LANG_CHN)
{
sprintf( str, "请在%d秒内刷卡", cntr );
}
else
{
sprintf( str, "Put Card:%d Secs", cntr );
}
DispStr_CE(0,0,str,DISP_POSITION|DISP_CLRLINE);
SPT_set(64);
}
TempStatus = MyCardAccessMultiBlocks( PICC_AUTHENT1A, PICC_ReadBlock, sec_num, 0, 3, rdata,NULL);
if ( TempStatus==MI_OK )
{
card_read_ok = 1;
}
}
if ( !card_read_ok )
{
//MC530Off();
DispStr_CE(0,3,str3,DISP_POSITION|DISP_CLRLINE);
delay_and_wait_key( 5, EXIT_KEY_ALL, 0 );
return 1;
}
//MC530Off();
return 0;
}
int rf_write_card(void)
{
unsigned char cntr, card_write_ok;
unsigned char TempStatus,str[20];
GETSTR_PARAM gs;
unsigned char rdata[1030];
unsigned char fp_data[1030];
unsigned char sector = 0;
char str1[20],str2[20],str3[20],str4[20],str5[20],str6[20];
if(Get_Language()==LANG_CHN)
{
strcpy(str1,"扇区号(0-15):");
strcpy(str2,"请输入写入内容:");
strcpy(str3,"卡接口错误!");
strcpy(str4,"请在10秒内刷卡");
strcpy(str5,"写卡成功!");
strcpy(str6,"写卡错误!");
}
else
{
strcpy(str1,"SEC(0-15):");
strcpy(str2,"PLS INPUT");
strcpy(str3,"INTERFACE ERR!");
strcpy(str4,"Put Card:10 Secs");
strcpy(str5,"WRITE CARD OK!");
strcpy(str6,"WRITE CARE ERR!");
}
clr_scr();
sprintf( str, "%d", sector );
gs.qx = 0;
gs.qy = 0;
gs.pPrompt = str1;
gs.sFont = 0;
gs.alpha = 0;
gs.nullEnable = 0;
gs.csChar = '_';
gs.pwChar = 0;
gs.spChar = 0;
gs.pStr = str;
gs.maxNum = 2;
gs.minNum = 1;
gs.minValue = 0;
gs.maxValue = 15;
gs.retNum = strlen(str);
gs.qEvent = EXIT_KEY_F1;
if ( huGetStr_E(&gs)<0 )
{
return 0;
}
sector = gs.retValue;
DispStr_CE(0,2,str2,DISP_POSITION);
gs.qx = 0;
gs.qy = 4;
gs.pPrompt = "";
gs.sFont = 0;
gs.alpha = 0;
gs.nullEnable = 0;
gs.csChar = '_';
gs.pwChar = 0;
gs.spChar = 0;
gs.pStr = fp_data;
gs.maxNum = 16;
gs.minNum = 1;
gs.minValue = -1;
gs.maxValue = -1;
gs.retNum = 0;
gs.qEvent = EXIT_KEY_F1;
if ( huGetStr_E(&gs)<0 )
{
return 0;
}
if( InitMC530(TYPE_A_ISO14443)!=MI_OK )
{
//MC530Off();
DispStr_CE(0,6,str3,DISP_POSITION|DISP_CLRLINE);
delay_and_wait_key( 5, EXIT_KEY_ALL, 0 );
return -1;
}
DispStr_CE(0,6,str4,DISP_POSITION|DISP_CLRLINE);
SPT_set(64);
for ( card_write_ok=0,cntr=10; cntr&&!card_write_ok; )
{
if ( !SPT_read() )
{
cntr--;
if(Get_Language()==LANG_CHN)
{
sprintf( str, "请在%d秒内刷卡", cntr );
}
else
{
sprintf( str, "Put Card:%d Secs", cntr );
}
DispStr_CE(0,6,str,DISP_POSITION|DISP_CLRLINE);
SPT_set(64);
}
TempStatus = MyCardAccessMultiBlocks( PICC_AUTHENT1A, PICC_WriteBlock, sector, 0, 1, rdata,fp_data );
if ( TempStatus==MI_OK )
{
card_write_ok = 1;
}
}
//MC530Off();
if ( card_write_ok )
{
DispStr_CE(0,6,str5,DISP_POSITION|DISP_CLRLINE);
delay_and_wait_key( 5, EXIT_KEY_ALL, 0 );
return 0;
}
else
{
DispStr_CE(0,6,str6,DISP_POSITION|DISP_CLRLINE);
delay_and_wait_key( 5, EXIT_KEY_ALL, 0 );
return 1;
}
}
char MyCardAccessMultiBlocks(unsigned char auth_mode,unsigned char WR_mode,
unsigned char sector,unsigned char block,
unsigned char blockcnt,unsigned char* rdata,
unsigned char* wdata)
{
char ret;
unsigned char ATQ[3]; //ATQ(2 bytes)
unsigned char PICCsnr[5]; //Serial number(4 bytes)
unsigned char ATS[2]; //mifare1:0x08(1 byte)
unsigned char newauth; //need authentication again?
//check parameters
ret = MI_OK;
if( (auth_mode!=PICC_AUTHENT1A)&&(auth_mode!=PICC_AUTHENT1B) )
{
ret = RCX_ERROR_PARAM;
}
else if( (WR_mode!=PICC_ReadBlock)&&(WR_mode!=PICC_WriteBlock) )
{
ret = RCX_ERROR_PARAM;
}
else if( (sector>15)||(block>2)||((sector+(block+blockcnt-1)/3)>15) )
{
ret = RCX_ERROR_PARAM;
}
if( (WR_mode==PICC_ReadBlock)&&(rdata==NULL) )
{
ret = RCX_ERROR_PARAM;
}
else if( (WR_mode==PICC_WriteBlock)&&(wdata==NULL) )
{
ret = RCX_ERROR_PARAM;
}
newauth = 1; //first authtication
while( (blockcnt>0)&&(ret==MI_OK) )
{
if(newauth==1)
{
ret = CardTypeARequest(PICC_REQALL,ATQ); //maybe Halt
if(ret!=MI_OK)
{
ret = CardTypeARequest(PICC_REQALL,ATQ);//maybe active
}
if(ret==MI_OK)
{
ret = CardTypeAAnticollLevel1(PICCsnr);
}
if(ret==MI_OK)
{
ret = CardTypeASelectLevel1(PICCsnr,ATS);
if(ATS[0]!= 0x08)
{
ret = RCX_ERROR_CARDTYPE;
}
}
if(ret==MI_OK)
{
ret = CardMFCAuthKey(PICC_AUTHENT1A,PICCsnr,dummy_key,(4*sector+block));
}
newauth = 0;
}
if(ret==MI_OK)
{
if(WR_mode==PICC_ReadBlock)
{
ret = CardMFCRead16Bytes(4*sector+block,rdata);
rdata += 16;
}
else
{
ret = CardMFCWrite16Bytes(4*sector+block,wdata);
wdata += 16;
}
block++;
if(block>2)
{
sector++;
block = 0;
newauth = 1; //new sector
}
}
blockcnt--;
}
return ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -