⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mifare_test_mini.c

📁 pos机contactless源码
💻 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 + -