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

📄 readcard.c

📁 基于单片机的SIM卡类CPU卡读写器源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <api.h>
#include <ExEH0218.h>
#include "Health.h"

int Select_File(unsigned char * FileName)
{
    unsigned short SW, rc;
    unsigned short pSW, P1;
    unsigned char tbuff[40];
    int filesze;
	
    tbuff[0]=FileName[0];
    tbuff[1]=FileName[1];
    rc = ICC_T0_TPDU(0,0xA0,0xA4,0,0,2,tbuff,&SW);
    if (rc)
    {
    	clr_scr();
	DispStr_CE(0,3,"Select Error",DISP_CENTER|DISP_CLRSCR);
        delay_and_wait_key( 1, EXIT_KEY_ALL, 0 );
        return(0);            
    }
    pSW = SW;
    if (pSW >> 8 != 0x009F)
    {
    	clr_scr();
	DispStr_CE(0,3,"Select 1 Error",DISP_CENTER|DISP_CLRSCR);
	dump_memory(&SW, 2, 5);
        delay_and_wait_key( 1, EXIT_KEY_ALL, 0 );
        return(0);            
    }
    pSW = SW;
    P1 = 15;
    rc = ICC_T0_TPDU(1,0xA0,0xC0,0,0,P1,tbuff,&SW);
    
    if (rc)
    {
    	clr_scr();
	DispStr_CE(0,3,"Select 2 Error",DISP_CENTER|DISP_CLRSCR);
        delay_and_wait_key( 1, EXIT_KEY_ALL, 0 );   
        return(0);         
    }
    
    //(unsigned short * )&pSW = SW;
    
    if (SW != 0x9000)
    {
    	clr_scr();
	DispStr_CE(0,3,"Select 3 Error",DISP_CENTER|DISP_CLRSCR);
	dump_memory(&SW, 2, 5);
        delay_and_wait_key( 1, EXIT_KEY_ALL, 0 );  
        return(0);          
    }
    
    filesze = tbuff[2] * 256 + tbuff[3];
    return(filesze);
    
}

void Verify_Adm()
{
    unsigned short SW, rc;
    unsigned short pSW;
    unsigned char tbuff[40];
    int filesze;
	
    tbuff[0]=0x39;
    tbuff[1]=0x62;
    tbuff[2]=0x60;
    tbuff[3]=0x33;
    tbuff[4]=0x67;
    tbuff[5]=0x61;
    tbuff[6]=0x35;
    tbuff[7]=0xBA;

    rc = ICC_T0_TPDU(0,0xA0,0x20,0,0x0B,8,tbuff,&SW);

/*    if (rc)
    {
    	clr_scr();
	DispStr_CE(0,3,"Select Error",DISP_CENTER|DISP_CLRSCR);
        delay_and_wait_key( 1, EXIT_KEY_ALL, 0 );
        return(0);            
    }
    pSW = SW;
    if (pSW >> 8 != 0x009F)
    {
    	clr_scr();
	DispStr_CE(0,3,"Select 1 Error",DISP_CENTER|DISP_CLRSCR);
	dump_memory(&SW, 2, 5);
        delay_and_wait_key( 1, EXIT_KEY_ALL, 0 );
        return(0);            
    }
    pSW = SW;
    filesze = (pSW - 0x9F00);
    
    rc = ICC_T0_TPDU(1,0xA0,0xC0,0,0,filesze,tbuff,&SW);
    if (rc)
    {
    	clr_scr();
	DispStr_CE(0,3,"Select 2 Error",DISP_CENTER|DISP_CLRSCR);
        delay_and_wait_key( 1, EXIT_KEY_ALL, 0 );   
        return(0);         
    }
    //(unsigned short * )&pSW = SW;
    if (SW != 0x9000)
    {
    	clr_scr();
	DispStr_CE(0,3,"Select 3 Error",DISP_CENTER|DISP_CLRSCR);
	dump_memory(&SW, 2, 5);
        delay_and_wait_key( 1, EXIT_KEY_ALL, 0 );  
        return(0);          
    }
    filesze = tbuff[2] * 256 + tbuff[3];
    return(filesze);
  */  
}

int Read_File(unsigned char * FileName, unsigned char * DataStr)
{
    unsigned short SW, rc, pSW;
    unsigned char tbuff[260];
    unsigned char tempbuff[260];
    int filesze;
    int cnt = 0;
    int leftcnt;
    unsigned char P1, P2, P3, P4, P5;
    int rcode;
    unsigned char abuff[1640];
    unsigned char alen;
    //*********************20060911********************
    //char testbuf1[16],testbuf2[16];
    //*********************20060911********************
    bzero(DataStr, sizeof(DataStr));
    ICC_interface_power(ICC_POWER_ON);
    ICC_select_sock(ICC_SOCK_MAIN);   
    //ICC_select_sock(ICC_SOCK_SAM);
    rcode = ICC_cpucard_ATR(abuff,&alen, ICC_CLOCK_4M, ICC_VOLTAGE_5, 0x11, 0);
    rcode = ICC_cpucard_ATR(abuff,&alen, ICC_CLOCK_4M, ICC_VOLTAGE_5, 0x11, 0);
    if (rcode) 
        return(-1);
    //Verify_Adm();
    filesze = Select_File(FileName);
    
    if (!filesze)
    	return(-1);
    leftcnt = filesze;
    P5=0;
    while (leftcnt > 0)
    {
  
    	P1 = floor(cnt /2);
    	P2 = (cnt - P1 * 2)*128;
    	if (leftcnt < 129 )
    	{
    	    P3 = leftcnt;
    	    P4=P3;
    	    leftcnt = 0;
    	}
    	else
    	{
    	    P3 = 128;
    	    P4=P3;
    	    leftcnt = leftcnt - 128;
    	    cnt = cnt + 1;
    	}
    	memset(tbuff,0,sizeof(tbuff));  
    	rc = ICC_T0_TPDU(1,0xA0,0xB0,P1,P2,P3,tbuff,&SW); 
    	//*********************20060911********************
    	//memcpy(testbuf1[16],tbuff,16);
    	//memcpy(testbuf2[16],tbuff+112,16);
    	//DispStr_CE(0,0,testbuf1,DISP_POSITION|DISP_CLRSCR);
    	//DispStr_CE(0,3,testbuf2,DISP_POSITION);
    	//delay_and_wait_key( 10, EXIT_KEY_ALL, 0 );
    	//*********************20060911********************
    	if (rc)
    	{
    		ICC_interface_power(ICC_POWER_OFF);
	     	clr_scr();
		DispStr_CE(0,3,"Read Error",DISP_CENTER|DISP_CLRSCR);
	        delay_and_wait_key( 1, EXIT_KEY_ALL, 0 );   
	        return(-1);
	}
	pSW = SW;
	pSW = pSW >> 8;
	if ((pSW != 0x009F) && (pSW != 0x0090))         
    	{
    		ICC_interface_power(ICC_POWER_OFF);
	     	clr_scr();
		DispStr_CE(0,3,"Read 1 Error",DISP_CENTER|DISP_CLRSCR);
		dump_memory(&SW, 2, 5);
        	delay_and_wait_key( 1, EXIT_KEY_ALL, 0 );   
	        return(-1);
	}
	pSW = SW;
	P1 = 0;
	P2 = 0;
	pSW = pSW - 0x9000;
	P3 = pSW;
   	//memcpy(&DataStr[strlen(DataStr)],tbuff,(strlen(tbuff)-2));
   	memcpy(&DataStr[P5],tbuff,P4);
   	P5+=P4;
    }
   ICC_interface_power(ICC_POWER_OFF);

   return(0);		
   			
   			
   			
}

//please insert read card function

//get Demograhic info
int Read_Per_Info(char *Card_Read_Buff)
{
	//Please Insert Function 
	//Card Reset;
	//select Adf
	//Read Bin
	//memcpy(Card_Read_Buff ,"8ef3ec8a-59c2-4693-a569-313038da47e4|Dunegan|John11|k|||11/24/2005 12:00:00 AM|125456544|M|1234567||1333 Corporate Dr.|suite 360|||Irving|TX|75038||8664886633|123456456489484|8889990000|||jdunegan@healthmeans.com||Catholic|Japanese|healthmeans|1234 abc drive|suite 123|dallas|TX|75038|sales|12/28/2005 12:00:00 AM|False|English||||Single|Full Time|1/18/2006 10:37:04 AM",340);
	if(Read_File("\x6F\x91", Card_Read_Buff) != 0)
	   return (1);
	//return 1;//read card error
	return 0;//read card right
}


//get RELATIVES info
int NextOfKinInfo(char *Card_Read_Buff)
{
	//Please Insert Function 
	//Card Reset;
	//select Adf
	//Read Bin
	//memcpy(Card_Read_Buff ,"Aaron|John|k|||11/24/2005 12:00:00 AM|125456544|F|1234567||1333 Corporate Dr.|suite 360|Irving|TX|75038||8664886633|123456456489484|8889990000||12344321|jdunegan@healthmeans.com|Catholic|Japanese|healthmeans|1234 abc drive|suite 123|dallas|TX|75038|sales|12/28/2005 12:00:00 AM|False|English|Wife|fff|Single|Full Time",340);
	if(Read_File("\x6F\x92", Card_Read_Buff) != 0)
	   return (1);
	//return 1;//read card error
	return 0;//read card right
		
}
int GuarantorInfo(char *Card_Read_Buff)
{
	//Please Insert Function 
	//Card Reset;
	//select Adf
	//Read Bin
	//memcpy(Card_Read_Buff ,"Adeline|Alice|k|||11/24/2005 12:00:00 AM|125456544|F|1234567||1333 Corporate Dr.|suite 360|Irving|TX|75038||8664886633|123456456489484|8889990000||12344321|jdunegan@healthmeans.com|Catholic|Japanese|healthmeans|1234 abc drive|suite 123|dallas|TX|75038|sales|12/28/2005 12:00:00 AM|False|English|Wife|fff|Single|Full Time",340);
	if(Read_File("\x6F\x93", Card_Read_Buff) != 0)
	   return (1);
	//return 1;//read card error
	return 0;//read card right
		
}
int EmergencyInfo(char *Card_Read_Buff)
{
	//Please Insert Function 
	//Card Reset;
	//select Adf
	//Read Bin
	//memcpy(Card_Read_Buff ,"Christopher|Peter|k|||11/24/2005 12:00:00 AM|125456544|M|1234567||1333 Corporate Dr.|suite 360|Irving|TX|75038||8664886633|123456456489484|8889990000||12344321|jdunegan@healthmeans.com|Catholic|Japanese|healthmeans|1234 abc drive|suite 123|dallas|TX|75038|sales|12/28/2005 12:00:00 AM|False|English|Wife|fff|Single|Full Time",340);
	if(Read_File("\x6F\x94", Card_Read_Buff) != 0)
	   return (1);
	//return 1;//read card error
	return 0;//read card right
		
}

int Insurance1Info(char *Card_Read_Buff)
{
	char strtmp[2000],tmp[16];
	int i=0,ret;
	memset(strtmp,0,2000);
	ret=InsuranceInfo(strtmp);
	if (ret==1)	return 1;
	for (i=0;i<2000;i++)
	{
		if (strtmp[i]==0x01)
		{
			//sprintf(tmp,"i=%4d",i);
			//DispStr_E(0,0,tmp,DISP_POSITION|DISP_CLRSCR);
			//delay_and_wait_key( 10, EXIT_KEY_ALL, 0 );
			break;
		}//break;	
		
	}
	if (i>500) return 1;
	memcpy(Card_Read_Buff,strtmp,i);
	//return 1;//read card error
	return 0;//read card right
		
}

int Insurance2Info(char *Card_Read_Buff)
{
	char strtmp[2000],tmp[16];
	int i=0,m=0,n,p,ret;
	memset(strtmp,0,2000);
	
	ret=InsuranceInfo(strtmp);
	if (ret==1)	return 1;
	for (i=0;i<2000;i++)
	{
		if (strtmp[i]==0x01)
		{
			m++;
			if (m==1) n=i+1;
			if (m==2) p=i;
			
			if (m==2) break;
		}//	
		
	}
	
	memcpy(Card_Read_Buff,strtmp+n,p-n);

	return 0;//read card right
		
}
int Insurance3Info(char *Card_Read_Buff)
{
	//Please Insert Function 
	//Card Reset;
	//select Adf
	//Read Bin
	//memcpy(Card_Read_Buff ,"Caichanchina|hongyun|3456789012|Dragon3|121234345656|lastname|firstname|K|11/24/2005 12:00:00 AM|M|1333 Corporate Dr.|suite 360|Irving|TX|75038|112-233-4455|8664886633|123456456489484|jdunegan@healthmeans.com|Catholic| |||||||||||||||dragon|",340);
	char strtmp[2000],tmp[16];
	int i=0,m=0,n,p,ret;
	memset(strtmp,0,2000);
	
	ret=InsuranceInfo(strtmp);
	if (ret==1)	return 1;
	for (i=0;i<2000;i++)
	{
		if (strtmp[i]==0x01)
		{
			m++;
			if (m==2) n=i+1;
			if (m==3) p=i;
			if (m==3) break;	
		}	
	}
	
	memcpy(Card_Read_Buff,strtmp+n,p-n);
	//return 1;//read card error

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -