📄 mifare.c
字号:
gcSector = gstWorkCardInfomation.stCardStruct.cEveTimesSector;
cMarsterBlock = gcTimesMarsterBlock;
if ((gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_PURTIMES)||(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_DECTIMES)||(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_INCTIMES))
cOperMode = cMode;
else
cOperMode = 'B';
}
else
break;
}
gcBlock = gcSector * 4;
switch(cOperMode)
{
case 'A':
// clr_scr();
// move_cursor(0,0);
// puts("Step A");
// getch();
if(!AuthenCard(&glSerialNo,gcSector,MIF_WRITE)) return 0;
switch(CompareBlock(gcSector, gcBlock+2-cMarsterBlock, gcBlock+cMarsterBlock+1, 0))
{
case 0:
return 0;
case 1:
cFlag2 = IsValidMoney(gcSector, gcBlock+2-cMarsterBlock);
if (!cFlag2) return 2;
if(!CopyBlock(gcSector, gcBlock+2-cMarsterBlock, gcBlock+cMarsterBlock+1, 0)) return 0;
default:
break;
}
gcSector = gstWorkCardInfomation.stCardStruct.cPublicSector;
gcBlock = gcSector * 4;
if(!AuthenCard(&glSerialNo,gcSector,MIF_WRITE)) return 0;
if(!CopyBlock(gcSector, gcBlock+1, gcBlock, 1)) return 0;
break;
case 'B':
// clr_scr();
// move_cursor(0,0);
// puts("Step B");
// getch();
if(!AuthenCard(&glSerialNo,gcSector,MIF_WRITE)) return 0;
cFlag1 = IsValidMoney(gcSector, gcBlock+cMarsterBlock+1);
if (!cFlag1) return 2;
switch(CompareBlock(gcSector, gcBlock+cMarsterBlock+1, gcBlock+2-cMarsterBlock, 0))
{
case 0:
return 0;
case 1:
if(!CopyBlock(gcSector, gcBlock+cMarsterBlock+1, gcBlock+2-cMarsterBlock, 0)) return 0;
default:
break;
}
gcSector = gstWorkCardInfomation.stCardStruct.cPublicSector;
gcBlock = gcSector * 4;
if(!AuthenCard(&glSerialNo,gcSector,MIF_WRITE)) return 0;
if(!CopyBlock(gcSector, gcBlock, gcBlock+1, 1)) return 0;
break;
case 'C':
// clr_scr();
// move_cursor(0,0);
// puts("Step C");
// getch();
if(!AuthenCard(&glSerialNo,gcSector,MIF_WRITE)) return 0;
cFlag1 = IsValidMoney(gcSector, gcBlock+cMarsterBlock+1);
cFlag2 = IsValidMoney(gcSector, gcBlock+2-cMarsterBlock);
if ((cFlag1)&&(cFlag2))
{
i = CompareBlock(gcSector, gcBlock+cMarsterBlock+1, gcBlock+2-cMarsterBlock, 0);
if (i==0)
return 0;
else if (i == 1)
goto StepD;
if(!CopyBlock(gcSector, gcBlock+2-cMarsterBlock, gcBlock+cMarsterBlock+1, 0)) return 0;
gcSector = gstWorkCardInfomation.stCardStruct.cPublicSector;
gcBlock = gcSector * 4;
if(!AuthenCard(&glSerialNo,gcSector,MIF_WRITE)) return 0;
if(!CopyBlock(gcSector, gcBlock+1, gcBlock, 1)) return 0;
}
else if((cFlag1)&&(!cFlag2))
{
CopyBlock(gcSector, gcBlock+cMarsterBlock+1, gcBlock+2-cMarsterBlock, 0);
}
else if((!cFlag1)&&(cFlag2))
{
CopyBlock(gcSector, gcBlock+2-cMarsterBlock, gcBlock+cMarsterBlock+1, 0);
}
else
{
return 2;
}
break;
case 'D':
StepD:
// clr_scr();
// move_cursor(0,0);
// puts("Step D");
// getch();
if(!AuthenCard(&glSerialNo, gcSector,MIF_WRITE)) return 0;
if(CardMFCRead16Bytes(gcBlock+cMarsterBlock+1,gcMifBuffer)!=MI_OK) return 0;
// memcpy(&lMoney2, gcMifBuffer, 4);
OverTurnString(&lMoney2, gcMifBuffer, 4);
if ((gstWorkCardInfomation.cHistoryChargeType== CHARGETYPE_INCMONEY)||(gstWorkCardInfomation.cHistoryChargeType== CHARGETYPE_INCTIMES))
{
lMoney1 -= gstWorkCardInfomation.lHistoryChargeMoney;
}
else if ((gstWorkCardInfomation.cHistoryChargeType== CHARGETYPE_DECMONEY)||(gstWorkCardInfomation.cHistoryChargeType== CHARGETYPE_DECTIMES)||(gstWorkCardInfomation.cHistoryChargeType== CHARGETYPE_PURMONEY)||(gstWorkCardInfomation.cHistoryChargeType== CHARGETYPE_PURTIMES))
{
lMoney1 += gstWorkCardInfomation.lHistoryChargeMoney;
}
if(CardMFCRead16Bytes(gcBlock+2-cMarsterBlock, gcMifBuffer)!=MI_OK) return 0;
// memcpy(&lMoney2, gcMifBuffer, 4);
OverTurnString(&lMoney2, gcMifBuffer, 4);
if(lMoney1 == lMoney2)
{
if (gstWorkCardInfomation.iMoneyTotleTimes>0)
gstWorkCardInfomation.iMoneyTotleTimes --;
else
gstWorkCardInfomation.iMoneyTotleTimes = 0xffff;
gcSector = gstWorkCardInfomation.stCardStruct.cPublicSector;
gcBlock = gcSector * 4;
if(!AuthenCard(&glSerialNo,gcSector,MIF_WRITE)) return 0;
if(CardMFCRead16Bytes(gcBlock,gcMifBuffer)!=MI_OK) return 0;
gcMifBuffer[0] = gstWorkCardInfomation.cHisCharge2;
// memcpy(gcMifBuffer+1, &gstWorkCardInfomation.iMoneyTotleTimes, 2);
OverTurnString(gcMifBuffer+1, &gstWorkCardInfomation.iMoneyTotleTimes, 2);
// memcpy(gcMifBuffer+4, &gstWorkCardInfomation.iTimesTotleTimes, 2);
OverTurnString(gcMifBuffer+4, &gstWorkCardInfomation.iTimesTotleTimes, 2);
if(CardMFCWrite16Bytes(gcBlock,gcMifBuffer)!=MI_OK) return 0;
if ((gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_PURMONEY)||(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_DECMONEY)||(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_INCMONEY))
{
gcSector = gstWorkCardInfomation.stCardStruct.cMoneySector;
cMarsterBlock = gcMoneyMarsterBlock;
}
else if ((gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_PURTIMES)||(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_DECTIMES)||(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_INCTIMES))
{
gcSector = gstWorkCardInfomation.stCardStruct.cEveTimesSector;
cMarsterBlock = gcTimesMarsterBlock;
}
else
return 1;
gcBlock = gcSector * 4;
if(!AuthenCard(&glSerialNo,gcSector,MIF_WRITE)) return 0;
if(!CopyBlock(gcSector, gcBlock+2-cMarsterBlock, gcBlock+cMarsterBlock+1, 0)) return 0;
}
else
return 2;
break;
}
gstWorkCardInfomation.cGetInfoFinished &= (MASK_SECTOR_PUBLIC&MASK_SECTOR_MONEY&MASK_SECTOR_HISTORY);
}
return 1;
}
//写售卡标志
unsigned char WriteSaleCardFlag(unsigned char Mode, unsigned char CardType)
{
unsigned char i;
gcSector = gstWorkCardInfomation.stCardStruct.cPublishSector;
gcBlock = gcSector * 4;
if (!AuthenCard(&glSerialNo, gcSector, MIF_WRITE)) 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 = 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;
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_WRITE)) 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_WRITE)) 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_WRITE)) 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 = 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;
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_WRITE)) 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_WRITE)) 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_WRITE)) return ERR_MIF_AUTEN;
if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_READ;
if(gstWorkCardInfomation.cCardType >= 0xA0)
memset(gcMifBuffer, 0, 16);
gcMifBuffer[0] = 0x01;
gcMifBuffer[3] = 0x02;
gcMifBuffer[15] = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -