?? mifare.c
字號:
for(i=0;i<15;i++)
gcMifBuffer[15] ^= gcMifBuffer[i];
if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
gcBlock++;
for(i=0;i<16;i++)
gcMifBuffer[i] = ~gcMifBuffer[i];
if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
for(i = 0;i<9;i++)
{
gcSector = i / 3;
gcBlock = i % 3;
gcSector = gstWorkCardInfomation.stCardStruct.cHistorySector[gcSector];
gcBlock += gcSector * 4;
if(!AuthenCard(&lSerialNo, gcSector, MIF_WRITE)) return ERR_MIF_AUTEN;
memset(gcMifBuffer, 0, 16);
if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
}
gstWorkCardInfomation.cGetInfoFinished &= MASK_SECTOR_ALL;
GetCardInformation(lSerialNo, SECTOR_ALL);
}
else
return ERR_POS_NOCARD;
return ST_OK;
}
//生成控制卡
unsigned char NewControlCard(unsigned long lSerialNo, unsigned char cNewCardType, unsigned char *cControlBuf)
{
unsigned char i, k;
unsigned long llSerialNo;
if(gcAuthenMode !=2) return ERR_POS_DEVICENOTAUTH;
SPT_set(64);
for(i = 10;i;)
{
if (!SPT_read())
{
SPT_set(64);
i --;
}
if(CardTypeARequest(PICC_REQIDL,gcATQ) == MI_OK)
break;
}
if(i!=0)
{
CardTypeAAnticollLevel1((unsigned char*)&llSerialNo);
CardTypeASelectLevel1((unsigned char*)&llSerialNo, gcATS);
if ((llSerialNo != glSerialNo)||(gcGetKeyFinished != 4))
{
GetCardKey(llSerialNo);
}
if (gstWorkCardInfomation.cGetInfoFinished != SECTOR_ALL)
if (GetCardInformation(llSerialNo, SECTOR_ALL)!=1)
return ERR_POS_GETCARDINFO;
// gstWorkCardInfomation.cGetInfoFinished = 0;
if (lSerialNo != llSerialNo)
return ERR_POS_NOTSAMECARD;
if(gstWorkCardInfomation.cCardType != CARD_NEW_CARD)
return ERR_POS_NOTCUMSCARD;
// guDate.l_word = RTC_read_date();
// guTime.l_word = RTC_read_time();
// sprintf(gcASCDateTime, "%04d%02d%02d%02d%02d%02d", guDate.fields.year, guDate.fields.month, guDate.fields.day, guTime.fields.hour, guTime.fields.minute, guTime.fields.second);
getBCDDateTime(gcASCDateTime);
memcpy(gcNowTime, ASC2BCD(gcASCDateTime,14), 7);
for(i=0;i<3;i++)
gcHexNowTime[i] = (gcNowTime[i] >> 4) * 10 + (gcNowTime[i] & 0x0f);
i = CompareDate(gcNowTime, (unsigned char*)gstWorkCardInfomation.cLimitDate);
if (i == 2)
return ERR_POS_OUTOFLIMIT;
gcSector = gstWorkCardInfomation.stCardStruct.cPublishSector;
gcBlock = gcSector*4;
if(!AuthenCard(&lSerialNo, gcSector, MIF_WRITE)) return ERR_MIF_AUTEN;
for(k=0;k<3;k++)
if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)==MI_OK) break;
if(k==3) return ERR_MIF_READ;
gcMifBuffer[0x0d] = cNewCardType;
gcMifBuffer[15] = 0;
for(i=0;i<15;i++)
gcMifBuffer[15]^=gcMifBuffer[i];
for(k=0;k<3;k++)
if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)==MI_OK) break;
if(k==3) return ERR_MIF_WRITE;
gcSector = gstWorkCardInfomation.stCardStruct.cPublicSector;
gcBlock = gcSector*4;
if(!AuthenCard(&lSerialNo, gcSector, MIF_WRITE)) return ERR_MIF_AUTEN;
for(k=0;k<3;k++)
if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)==MI_OK) break;
if(k==3) return ERR_MIF_READ;
memcpy(gcMifBuffer, cControlBuf, 8);
for(k=0;k<3;k++)
if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)==MI_OK) break;
if(k==3) return ERR_MIF_WRITE;
for(i=0;i<16;i++)
gcMifBuffer[i]= 0xff - gcMifBuffer[i];
for(k=0;k<3;k++)
if(CardMFCWrite16Bytes(gcBlock+1, gcMifBuffer)==MI_OK) break;
if(k==3) return ERR_MIF_WRITE;
gstWorkCardInfomation.cGetInfoFinished &= MASK_SECTOR_PUBLIC;
GetCardInformation(lSerialNo, SECTOR_PUBLIC);
}
else
return ERR_POS_NOCARD;
return ST_OK;
}
//命令執行
unsigned char POSExecuteCommand(unsigned char cCommand, unsigned short iLength, unsigned char *cBuffer, unsigned short *iReturnLength, unsigned char *cReturnBuffer)
{
struct sttSysRunTime srt;
unsigned char cReturnVal;
unsigned long lSerialNo;
unsigned long lChargeMoney;
unsigned char cTempBuffer[1000];
unsigned char i;
int isrl;
short shRet;
unsigned short recLen;
struct sttPacketHead pHead;
struct sttBlackListHead pBLHead;
switch(cCommand)
{
case CMD_AUTHEN:
if (gcAuthenMode == 2)
{
cReturnBuffer[0] = ERR_POS_ALREADYAUTH;
*iReturnLength = 1;
return CMD_ERROR;
}
if(cBuffer[0] == 0)
{
if(!GetChallenge(gcRandom))
{
cReturnBuffer[0] = ERR_POS_GETRANDOM;
*iReturnLength = 1;
return CMD_ERROR;
}
memcpy(cReturnBuffer, gcSAMNo, 8);
memcpy(cReturnBuffer+8, gcRandom, 8);
gcAuthenMode = 1;
*iReturnLength = 16;
}
else if(cBuffer[0] ==1)
{
if (gcAuthenMode == 1)
{
if(memcmp(gcRandom, cBuffer+1, 8)!=0)
{
cReturnBuffer[0] = ERR_POS_NOTSAMERANDOM;
gcAuthenMode = 0;
*iReturnLength = 1;
return CMD_ERROR;
}
memcpy(gcWorkerNo, cBuffer+17, 8);
if(ExternalAuth(cBuffer+9, 0x02))
{
gcAuthenMode = 2;
*iReturnLength = 0;
}
else
{
gcAuthenMode = 0;
cReturnBuffer[0] = ERR_PSAM_AUTHEN;
//beep(1, 5);
*iReturnLength = 1;
return CMD_ERROR;
}
}
else
{
cReturnBuffer[0] = ERR_POS_NOAUTHREQUEST;
*iReturnLength = 1;
return CMD_ERROR;
}
}
break;
case CMD_LOGON:
if(VerifyPIN(cBuffer[0], cBuffer+1))
{
//操作員編號
memcpy(&gstWorkCardInfomation.lMoney, ASC2BCD(gcWorkerNo, 8), 4);
//機具編號
memcpy(&glChargeMoney, "\x00\x00\x01", 3); // for debug
gcChargeType = CHARGETYPE_LOGON;
if(BuildRecord()!=ST_OK) return ERR_POS_BUILDRECORD;
// for debug
// gcSector = gstWorkCardInfomation.stCardStruct.cPublicSector;
// gcBlock = gcSector * 4;
// if(!AuthenCard(&glSerialNo, gcSector, MIF_WRITE)) return 0;
// for(i=0;i<3;i++)
// if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)==MI_OK) break;
// if(i==3)
// {
// gcAuthenMode = 0;
// cReturnBuffer[0] = ERR_MIF_READ;
// *iReturnLength = 1;
// return CMD_ERROR;
// }
// gstWorkCardInfomation.iMoneyTotleTimes++;
// OverTurnString(gcMifBuffer+1, &gstWorkCardInfomation.iMoneyTotleTimes, 2);
// gcMifBuffer[15] = 0;
// for(i=0;i<15;i++)
// gcMifBuffer[15] ^= gcMifBuffer[i];
// for(i=0;i<3;i++)
// if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)==MI_OK) break;
// if(i==3)
// {
// gcAuthenMode = 0;
// cReturnBuffer[0] = ERR_MIF_WRITE;
// *iReturnLength = 1;
// return CMD_ERROR;
// }
// for debug
gcAuthenMode = 2;
memcpy(gcWorkerNo, cBuffer+9, 8);
*iReturnLength = 0;
}
else
{
gcAuthenMode = 0;
cReturnBuffer[0] = ERR_PSAM_PINAUTH;
*iReturnLength = 1;
return CMD_ERROR;
}
break;
case CMD_M1PASS:
memcpy(&lSerialNo, cBuffer,4);
if(GetCardKey(lSerialNo))
{
*iReturnLength = 0;
}
else
{
cReturnBuffer[0] = ERR_POS_GETCARDKEY;
*iReturnLength = 1;
return CMD_ERROR;
}
break;
case CMD_M1INFO:
cReturnBuffer[0] = ReturnCardInfomation(cReturnBuffer+1, iReturnLength);
if(cReturnBuffer[0]==ST_OK)
{
memcpy(cReturnBuffer, cReturnBuffer+1, *iReturnLength);
}
else
{
*iReturnLength = 1;
return CMD_ERROR;
}
break;
case CMD_PURCHASE:
case CMD_CHARGE:
// clr_scr();
// move_cursor(0,0);
// set_console_english();
// puts("CMD_CHARGE");
// getch();
// set_console_chinese();
memcpy(&lSerialNo, cBuffer,4);
// memcpy(&lChargeMoney, cBuffer+5,4);
OverTurnString(&lChargeMoney, cBuffer+5,4);
cReturnBuffer[0] = ChargeMoneyOrTimes(cBuffer[4], lSerialNo, lChargeMoney, cBuffer+9);
if(cReturnBuffer[0]!=ST_OK)
{
*iReturnLength = 1;
return CMD_ERROR;
}
else
{
memcpy(cReturnBuffer, &gstWorkChargeRecord, 40);
*iReturnLength = 40;
}
break;
case CMD_GETDATA:
// clr_scr();
// move_cursor(0,0);
// puts("CMD_GETDATA");
// getch();
isrl = 0;
shRet = 0;
do
{
memset(cTempBuffer, 0, sizeof(cTempBuffer));
shRet = wrapTradeRecord(cTempBuffer, isrl, &srt);
for(i=0;i<3;i++)
{
if(UART_send(cTempBuffer, shRet*40+sizeof(pHead))==0)
break;
}
if(i==3)
{
shRet = -2;
break;
}
if(updateSysRunTime(&srt)!=0) //回寫系統運行時參數
{
shRet = -1;
break;
}
isrl ++;
}while(shRet>0);
if(shRet<0)
{
if(shRet==-2)
{
cReturnBuffer[0] = ERR_COM_TIMEOUT;
}
else if(shRet==-1)
{
cReturnBuffer[0] = ERR_CHG_READEEPROM;
}
*iReturnLength = 1;
return CMD_ERROR;
}
else
{
*iReturnLength = 0;
}
break;
case CMD_SETBLACKLIST:
memcpy(cTempBuffer, cBuffer, iLength);
shRet = updateBlackList(cTempBuffer);
// if(shRet ==0)
// {
// do
// {
// memset(cTempBuffer, 0, sizeof(cTempBuffer));
// for(i=0;i<3;i++)
// {
// if(UART_receive(cTempBuffer, &recLen)==0)
// break;
// }
// if(i==3)
// {
// shRet = -2;
// break;
// }
// iLength = 0;
// memcpy(&recLen, cTempBuffer+1, 2);
// memcpy(cTempBuffer, cTempBuffer+4, recLen);
// shRet = updateBlackList(cTempBuffer);
// if(recLen==sizeof(pBLHead)) break;
// }while(shRet>0);
// }
if(shRet<0)
{
if(shRet==-2)
{
cReturnBuffer[0] = ERR_COM_TIMEOUT;
}
else if(shRet==-1)
{
cReturnBuffer[0] = ERR_CHG_WRITEEEPROM;
}
*iReturnLength = 1;
return CMD_ERROR;
}
else
{
*iReturnLength = 0;
}
break;
case CMD_RESTORECARD:
if(CardRestore(cBuffer[0])==1)
{
*iReturnLength = 0;
}
else
{
cReturnBuffer[0] = ERR_POS_CARDRESTORE;
*iReturnLength = 1;
return CMD_ERROR;
}
break;
case CMD_SALECARD:
memcpy(&lSerialNo, cBuffer,4);
// memcpy(&lChargeMoney, cBuffer+4,4);
OverTurnString(&lChargeMoney, cBuffer+4,4);
cReturnBuffer[0] = SaleCard(lSerialNo, lChargeMoney, cBuffer[8], cBuffer+9);
if(cReturnBuffer[0]!=ST_OK)
{
*iReturnLength = 1;
return CMD_ERROR;
}
else
{
memcpy(cReturnBuffer, &gstWorkChargeRecord, 40);
*iReturnLength = 40;
}
break;
case CMD_GETDATETIME:
guDate.l_word = RTC_read_date();
guTime.l_word = RTC_read_time();
sprintf(gcASCDateTime, "%04d%02d%02d%02d%02d%02d", guDate.fields.year, guDate.fields.month, guDate.fields.day, guTime.fields.hour, guTime.fields.minute, guTime.fields.second);
// getBCDDateTime(gcASCDateTime);
memcpy(gcNowTime, ASC2BCD(gcASCDateTime,14), 7);
memcpy(cReturnBuffer, gcNowTime, 7);
*iReturnLength = 7;
break;
case CMD_SETDATETIME:
memcpy(gcNowTime, cBuffer, 7);
if(!IsValidDate(gcNowTime))
{
cReturnBuffer[0] = ERR_POS_TIMESPARM;
*iReturnLength = 1
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -