📄 commtran.c
字号:
case 0x51: //DecrementPurse
case 0x52: //DecrementPurseFile
block_n=(sector_n<<2)+1;
*(uchar *)&money1=ComBuffer[6];
*((uchar *)&money1+1)=ComBuffer[7];
*((uchar *)&money1+2)=ComBuffer[8];
*((uchar *)&money1+3)=ComBuffer[9];
Status=MF1_read(keytest,block_n,buf);//
if(Status==MI_OK)
{
*(uchar *)&money2=buf[3];
*((uchar *)&money2+1)=buf[2];
*((uchar *)&money2+2)=buf[1];
*((uchar *)&money2+3)=buf[0];
if(money1>money2)
{
SendResponse(0xA0,1,buf); //not enough money
return;
}
money2=money2-money1;
temp[3]=*((uchar *)&money2);
temp[2]=*((uchar *)&money2+1);
temp[1]=*((uchar *)&money2+2);
temp[0]=*((uchar *)&money2+3);
*(uchar *)&money2=*((uchar *)&money1+3);
*((uchar *)&money2+1)=*((uchar *)&money1+2);
*((uchar *)&money2+2)=*((uchar *)&money1+1);
*((uchar *)&money2+3)=*((uchar *)&money1);
Status=Mf500PiccValue(PICC_DECREMENT,block_n,(uchar *)&money2,block_n); //PI
if(Status==MI_OK)
{
Status=MF1_read(keytest,block_n,buf);
if(Status==MI_OK)
{
if(memcmp(temp,buf,4)==0)
{
SendResponse(0x01,5,buf);
return;
}
}
}
}
SendResponse(0xA1,1,buf);
break;
/***********************************************************/
case 0x59: //IncrementPurse 2002.7.17
case 0x60: //IncrementPurseFile
block_n=(sector_n<<2)+1;
*(uchar *)&money1=ComBuffer[6];
*((uchar *)&money1+1)=ComBuffer[7];
*((uchar *)&money1+2)=ComBuffer[8];
*((uchar *)&money1+3)=ComBuffer[9];
Status=MF1_read(keytest,block_n,buf);
if(Status==MI_OK)
{
*(uchar *)&money2=buf[3];
*((uchar *)&money2+1)=buf[2];
*((uchar *)&money2+2)=buf[1];
*((uchar *)&money2+3)=buf[0];
money2=money2+money1;
temp[3]=*((uchar *)&money2);
temp[2]=*((uchar *)&money2+1);
temp[1]=*((uchar *)&money2+2);
temp[0]=*((uchar *)&money2+3);
/****************************************************************/
*(uchar *)&money2=*((uchar *)&money1+3);
*((uchar *)&money2+1)=*((uchar *)&money1+2);
*((uchar *)&money2+2)=*((uchar *)&money1+1);
*((uchar *)&money2+3)=*((uchar *)&money1);
Status=Mf500PiccValue(PICC_INCREMENT,block_n,(uchar *)&money2,block_n);
if(Status==MI_OK)
{
Status=MF1_read(keytest,block_n,buf);
if(Status==MI_OK)
{
if(memcmp(temp,buf,4)==0)
{
SendResponse(0x01,5,buf);
return;
}
}
}
}
SendResponse(0xA1,1,buf);
break;
/************************************************************************/
case 0x53: //CheckPurseFormat
case 0x54: //CheckPurseFileFormat
//"ComBuffer[6]为钱包类型 主钱包0x00备份钱包0x01
block_n=(sector_n<<2)+1+ComBuffer[6];
Status=MF1_read(keytest,block_n,buf);
if(Status!=MI_OK)
{
SendResponse(0x80,1,buf);
return;
}
if((buf[0]==~buf[4])&&(buf[1]==~buf[5])&&(buf[2]==~buf[6])&&(buf[3]==~buf[7]))
{
SendResponse(0x01,5,buf);
}
else
{
SendResponse(0xA2,1,buf); //PurseFormatError
}
break;
/*****************************************************************************/
case 0x55: //RestorePurse
case 0x56: //RestorePurseFile
//"ComBuffer[6]为钱包类型 主钱包0x00,备份钱包0x01
if(ComBuffer[6]==0x01)
{
block_n=(sector_n<<2)+1;
key_index=block_n+1;
}
else
{
block_n=(sector_n<<2)+2;
key_index=block_n-1;
}
for(i=0;i<10;i++)
{
Status=MF1_read(keytest,block_n,buf2);
if(Status==MI_OK)
{
Status=Mf500PiccValue(PICC_RESTORE,block_n,buf2,key_index);
if(Status==MI_OK)
{
Status=MF1_read(keytest,key_index,buf);
if(Status==MI_OK)
{
if(memcmp(buf2,buf,16)==0) break;
}
}
}
}
if(i>=10)
{
SendResponse(0x80,1,buf);
}
else
{
SendResponse(0x01,1,buf);
}
break;
/************************************************************************************/
case 0x20: /*open card*/
Requestmode=ComBuffer[3]; //0X52 ALL OR 0X26 IDLE
for(i=0;i<10;i++)
{
Status=Mf500PiccRequest(Requestmode,buf);
if(Status==MI_OK) break;
}
if(Status!=MI_OK)
{
SendResponse(0x00,1,buf);
return;
}
Status=Mf500PiccAnticoll (0,snr);
if(Status==MI_OK)
{
Status=Mf500PiccSelect(snr,buf);
if(Status==MI_OK)
{
snr[4]=buf[0]; //Card type
SendResponse(0x01,6,snr);
return;
}
}
SendResponse(0x80,1,buf);
break;
case 0x24: //authi mode1
if(ComBuffer[3]==0x01) //0x01 for the keyB
{
keytest=PICC_AUTHENT1B;
}
keytest=PICC_AUTHENT1A;
sector_n=ComBuffer[4];
block_n=ComBuffer[5];
Status=Mf500PiccAuth(keytest,sector_n,block_n); // modify1
if(Status==MI_OK)
{
SendResponse(0x01,1,buf);
}
else
{
SendResponse(0x80,1,buf);
}
break;
case 0x25: //readblock
block_n=ComBuffer[3];
memset(buf,0xff,20);
Status=Mf500PiccRead(block_n,buf);
if(Status==MI_OK)
{
SendResponse(0x01,17,buf);
}
else
{
SendResponse(0x80,1,buf);
}
break;
case 0x26: //writeblock
block_n=ComBuffer[3];
memcpy(buf,ComBuffer+4,16);
Status=Mf500PiccWrite(block_n,buf);
if(Status==MI_OK)
{
SendResponse(0x01,1,buf);
}
else
{
SendResponse(0x80,1,buf);
}
break;
case 0x27: /*PICC_value */
piccvaluecmd=ComBuffer[3];
block_n=ComBuffer[4];
block_ob=ComBuffer[5];
*(uchar *)&money1=ComBuffer[9];
*((uchar *)&money1+1)=ComBuffer[8];
*((uchar *)&money1+2)=ComBuffer[7];
*((uchar *)&money1+3)=ComBuffer[6];
Status=Mf500PiccValue(piccvaluecmd,block_n,(uchar *)&money1,block_ob);//modify1
if(Status==MI_OK)
{
SendResponse(0x01,1,buf);
}
else
{
SendResponse(0x80,1,buf);
}
break;
case 0x28: //MF1_authkey
if(ComBuffer[3]==0x01)
{
key_type=PICC_AUTHENT1B;
}
key_type=PICC_AUTHENT1A;
block_n=ComBuffer[4];
memcpy(key,ComBuffer+5,6);
Status=MF1_authkey(key_type,key,block_n);
SendResponse(Status,0x01,buf);
break;
/*************************************************************************************/
case 0xb0: //"蜂鸣器参数控制
//"格式:60 04 b0 (循环次数)响声次数()
// 0 1 2 3 4
key_index=ComBuffer[3];
*((uchar *)&freq)=ComBuffer[4];
*((uchar *)&freq+1)=ComBuffer[5];
Beep(key_index,freq);
SendResponse(0x01,1,buf);
break;
case 0x3e: /* get reader info */
SendResponse(0x01,12,version_number);
break;
/****************************************************************************************/
case 0x73: //speakout
//"格式:60 04 b0 (响的次数1字节)(频率2字节)
// 0 1 2 3 4 5
key_index=ComBuffer[3];
*((uchar *)&freq)=ComBuffer[4];
*((uchar *)&freq+1)=ComBuffer[5];
Beep(key_index,freq);
SendResponse(0x01,1,buf);
break;
case 0x74: //writeE2ROM of watchdog
*(uchar *)&RAM_address=ComBuffer[3];
*((uchar *)&RAM_address+1)=ComBuffer[4];
if(RAM_address>512)
{
SendResponse(0x00,1,buf);
return;
}
if(RAM_address>=0x0000&RAM_address<=0x001f) //0x0000~~0x001f E2ROM FOR THE KEY OF 105
{
SendResponse(0x00,1,buf);
return;
}
LEN1=ComBuffer[5];
i=0;
j=16-(RAM_address%16);
if(j!=16)
{
Status=Write_Ram_byte(RAM_address,ComBuffer+6,j);
RAM_address+=j;
i=j;
LEN1-=j;
}
while(LEN1>16)
{
Status=Write_Ram_byte(RAM_address,ComBuffer+6+i,16);
RAM_address+=16;
LEN1-=16;
i+=16;
}
Status=Write_Ram_byte(RAM_address,ComBuffer+6+i,LEN1);
SendResponse(0x01,1,buf);
break;
case 0x75: //ReadE2ROM of watchdog
*(uchar *)&RAM_address=ComBuffer[3];
*((uchar *)&RAM_address+1)=ComBuffer[4];
if(RAM_address>512)
{
SendResponse(0x00,1,buf);
return;
}
if(RAM_address>=0x0000&RAM_address<=0x001f) //0x0000~~0x001f E2ROM FOR THE KEY OF 105
{
SendResponse(0x00,1,buf);
return;
}
LEN1=ComBuffer[5];
i=0;
while(LEN1>16)
{
Read_Ram(RAM_address,ComBuffer+9+i,LEN1);
RAM_address+=16;
LEN1-=16;
i+=16;
}
Read_Ram(RAM_address,ComBuffer+9+i,LEN1);
SendResponse(0x01,1+17+LEN1+i,buf);
break;
/*************************************************************************************/
/*************************************************************************************/
case 0x7C:
ModifyBaudrate12();
break;
/*************************************************************************************/
case 0x7E: //RESET the reader, for test
SFCF&=0XFD;
SFCF|=0X02;
break;
/*********************************************************************/
case 0xe0: /* send message again */
SendMessage();
break;
default:
SendMsError();
}
memset(ComBuffer,0xff,30);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -