📄 mifare.c.bak
字号:
//写售卡标志
unsigned char WriteSaleCardFlag(unsigned char Mode, unsigned char CardType)
{
unsigned char i;
gcSector = gstWorkCardInfomation.stCardStruct.cPublishSector;
gcBlock = gcSector * 4;
if (!AuthenCard(&glSerialNo, gcSector, MIF_READ)) return 0;
if (CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return 0;
gcMifBuffer[12] = Mode;
gcMifBuffer[13] = CardType;
gcMifBuffer[14] = glChargeMoney & 0xff;
gcMifBuffer[15] = 0;
for(i=0;i<15;i++)
gcMifBuffer[15] ^= gcMifBuffer[i];
if (CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return 0;
if (CardMFCRead16Bytes(gcBlock+1, gcMifBuffer)!=MI_OK) return 0;
memcpy(gcMifBuffer+8, gcNowTime, 4);
memcpy(gcMifBuffer+4, gcLimitDate, 4);
gcMifBuffer[15] = 0;
for(i=0;i<15;i++)
gcMifBuffer[15] ^= gcMifBuffer[i];
if (CardMFCWrite16Bytes(gcBlock+1, gcMifBuffer)!=MI_OK) return 0;
return 1;
}
//售卡
unsigned char SaleCard(unsigned long lSerialNo, unsigned long lChargeMoney, unsigned char cNewCardType, unsigned char *cLimitDate)
{
unsigned char i, tmpbuff[20];
unsigned long llSerialNo;
if(gcAuthenMode !=2) return ERR_POS_DEVICENOTAUTH;
gcNewCardType = cNewCardType;
if(gcNewCardType>0x1f) return ERR_POS_NOTCUMSCARD;
glChargeMoney = lChargeMoney;
memcpy(gcLimitDate, cLimitDate, 4);
if (gcAuthenMode ==2)
{
SPT_set(64);
for(i = 3;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;
if(gstWorkCardInfomation.cBlackListFlag == 0x04)
return ERR_POS_BLCARD;
memcpy(tmpbuff, gstWorkCardInfomation.cCityCode, 2);
memcpy(tmpbuff+2, gstWorkCardInfomation.cTradeCode, 2);
memcpy(tmpbuff+4, &gstWorkCardInfomation.lCardNo, 4);
if(findBlackList(tmpbuff)==ST_OK)
{
i = SetBlackListFlag(lSerialNo, 0x04);
if(i==ST_OK)
return ERR_POS_BLCARD;
else
return i;
}
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.cMoneySector;
gcBlock = gcSector * 4;
if(!AuthenCard(&lSerialNo, gcSector, MIF_READ)) return ERR_MIF_AUTEN;
memset(gcMifBuffer, 0, 16);
if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
gcBlock++;
memset(gcMifBuffer + 4, 0xff ,4);
gcMifBuffer[12] = gcSector;
gcMifBuffer[13] = 0xff - gcMifBuffer[12];
gcMifBuffer[14] = gcMifBuffer[12];
gcMifBuffer[15] = gcMifBuffer[13];
if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
gcBlock++;
if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
gcSector = gstWorkCardInfomation.stCardStruct.cPublicSector;
gcBlock = gcSector * 4;
if(!AuthenCard(&lSerialNo, gcSector, MIF_READ)) return ERR_MIF_AUTEN;
if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_READ;
gcMifBuffer[0] = 0x01;
gcMifBuffer[3] = 0x02;
gcMifBuffer[15] = 0;
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] = 0xff - 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_READ)) return ERR_MIF_AUTEN;
memset(gcMifBuffer, 0, 16);
if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
}
if(!WriteSaleCardFlag(0x02, cNewCardType))
return ERR_POS_MODIFYSTARTFLAG;
gcChargeType = CHARGETYPE_SALE;
if(BuildRecord()!=ST_OK) return ERR_POS_BUILDRECORD;
gstWorkCardInfomation.cGetInfoFinished &= MASK_SECTOR_PUBLISH;
// GetCardInformation(lSerialNo, SECTOR_PUBLISH);
}
else
return ERR_POS_NOCARD;
}
return ST_OK;
}
//退卡
unsigned char RecycleCard(unsigned long lSerialNo)
{
unsigned char i, tmpbuff[20];
unsigned long llSerialNo;
if(gcAuthenMode !=2) return ERR_POS_DEVICENOTAUTH;
SPT_set(64);
for(i = 3;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 > 0x1f)
return ERR_POS_NOTCUMSCARD;
if(gstWorkCardInfomation.cBlackListFlag == 0x04)
return ERR_POS_BLCARD;
if(gstWorkCardInfomation.cUsageFlag != 2)
return ERR_POS_CARDNOTSTART;
memcpy(tmpbuff, gstWorkCardInfomation.cCityCode, 2);
memcpy(tmpbuff+2, gstWorkCardInfomation.cTradeCode, 2);
memcpy(tmpbuff+4, &gstWorkCardInfomation.lCardNo, 4);
if(findBlackList(tmpbuff)==ST_OK)
{
i = SetBlackListFlag(lSerialNo, 0x04);
if(i==ST_OK)
return ERR_POS_BLCARD;
else
return i;
}
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.cDirSector;
gcBlock = gcSector * 4+1;
if(!AuthenCard(&lSerialNo, gcSector, MIF_READ)) return ERR_MIF_AUTEN;
if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_READ;
gcMifBuffer[7] = 0xff;
gcMifBuffer[8] = 0xff;
if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
gcSector = gstWorkCardInfomation.stCardStruct.cPublishSector;
gcBlock = gcSector * 4;
if(!AuthenCard(&lSerialNo, gcSector, MIF_READ)) return ERR_MIF_AUTEN;
if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_READ;
gcMifBuffer[0x0c] = 01;
gcMifBuffer[0x0d] = CARD_NEW_CARD;
gcMifBuffer[15] = 0;
for(i=0;i<15;i++)
gcMifBuffer[15] ^= gcMifBuffer[i];
if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
gcBlock++;
if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_READ;
memset(gcMifBuffer+8, 0, 8);
gcMifBuffer[15] = 0;
for(i=0;i<15;i++)
gcMifBuffer[15] ^= gcMifBuffer[i];
if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
gcSector = gstWorkCardInfomation.stCardStruct.cMoneySector;
gcBlock = gcSector * 4;
if(!AuthenCard(&lSerialNo, gcSector, MIF_READ)) return ERR_MIF_AUTEN;
memset(gcMifBuffer, 0, 16);
if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
gcBlock++;
memset(gcMifBuffer + 4, 0xff ,4);
gcMifBuffer[12] = gcSector;
gcMifBuffer[13] = 0xff - gcMifBuffer[12];
gcMifBuffer[14] = gcMifBuffer[12];
gcMifBuffer[15] = gcMifBuffer[13];
if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
gcBlock++;
if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_WRITE;
glChargeMoney = gstWorkCardInfomation.lMoney;
gcChargeType = CHARGETYPE_RETURN;
if(BuildRecord()!=ST_OK) return ERR_POS_BUILDRECORD;
gcSector = gstWorkCardInfomation.stCardStruct.cPublicSector;
gcBlock = gcSector * 4;
if(!AuthenCard(&lSerialNo, gcSector, MIF_READ)) return ERR_MIF_AUTEN;
if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_READ;
gcMifBuffer[0] = 0x01;
gcMifBuffer[3] = 0x02;
gcMifBuffer[15] = 0;
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_READ)) 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 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;
void *p;
char flag;
unsigned long totalNum;
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;
}
memset(cReturnBuffer, 0, 4);
memcpy(cReturnBuffer+4, gcPSAMNo, 4);
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(memcmp(cBuffer+1, "123456", cBuffer[0])==0)
{
//操作员编号
memcpy(gcWorkerNo, cBuffer + 7, 4);
OverTurnString(&gstWorkCardInfomation.lMoney, gcWorkerNo, 4);
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_READ)) 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;
*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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -