📄 mifare.c
字号:
gstWorkCardInfomation.cChargeStep = 0x00;
}
else
gstWorkCardInfomation.cChargeStep = gcMifBuffer[3];
gstWorkCardInfomation.cHisCharge = gcMifBuffer[0] - 1;
if (gstWorkCardInfomation.cHisCharge > 0)
gstWorkCardInfomation.cHisCharge2 = gstWorkCardInfomation.cHisCharge - 1;
else
gstWorkCardInfomation.cHisCharge2 = 8;
// memcpy(&gstWorkCardInfomation.iMoneyTotleTimes, gcMifBuffer + 1, 2);
OverTurnString(&gstWorkCardInfomation.iMoneyTotleTimes, gcMifBuffer + 1, 2);
// memcpy(&gstWorkCardInfomation.iTimesTotleTimes, gcMifBuffer + 4, 2);
OverTurnString(&gstWorkCardInfomation.iTimesTotleTimes, gcMifBuffer + 4, 2);
gstWorkCardInfomation.cBlackListFlag = gcMifBuffer[6];
gstWorkCardInfomation.cFileFlag = gcMifBuffer[7];
gstWorkCardInfomation.cGetInfoFinished |= SECTOR_PUBLIC;
}
if(((cSectorFlag&SECTOR_HISTORY)==SECTOR_HISTORY)&&((gstWorkCardInfomation.cGetInfoFinished & SECTOR_HISTORY)!=SECTOR_HISTORY))
{
// clr_scr();
// move_cursor(0,0);
// puts("cHistorySector");
// getch();
gcSector = gstWorkCardInfomation.cHisCharge2 / 3;
gcBlock = gstWorkCardInfomation.cHisCharge2 % 3;
gcSector = gstWorkCardInfomation.stCardStruct.cHistorySector[gcSector];
gcBlock += gcSector * 4;
if (!AuthenCard(&lSerialNo, gcSector, MIF_READ)) return 0;
if (CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return 0;
gstWorkCardInfomation.cHistoryChargeType = gcMifBuffer[11];
if (gstWorkCardInfomation.cHistoryChargeType != 0x00)
{
memcpy(gstWorkCardInfomation.cHistoryTime, gcMifBuffer, 4);
// memcpy(&gstWorkCardInfomation.lHistoryMoney, gcMifBuffer+4, 4);
OverTurnString(&gstWorkCardInfomation.lHistoryMoney, gcMifBuffer+4, 4);
gstWorkCardInfomation.lHistoryChargeMoney = 0;
// memcpy(&gstWorkCardInfomation.lHistoryChargeMoney, gcMifBuffer+8, 3);
gstWorkCardInfomation.lHistoryChargeMoney = 0;
OverTurnString((unsigned char*)&gstWorkCardInfomation.lHistoryChargeMoney+1, gcMifBuffer+8, 3);
memcpy(gstWorkCardInfomation.cHistoryPSAMNo, gcMifBuffer + 12, 4);
}
else
{
memset(gstWorkCardInfomation.cHistoryTime, 0 ,4);
gstWorkCardInfomation.lHistoryMoney = 0;
gstWorkCardInfomation.lHistoryChargeMoney = 0;
gstWorkCardInfomation.cHistoryChargeType = 0;
memset(gstWorkCardInfomation.cHistoryPSAMNo, 0 ,4);
}
gstWorkCardInfomation.cGetInfoFinished |= SECTOR_HISTORY;
}
if(((cSectorFlag&SECTOR_MONEY)==SECTOR_MONEY)&&((gstWorkCardInfomation.cGetInfoFinished & SECTOR_MONEY)!=SECTOR_MONEY))
{
// clr_scr();
// move_cursor(0,0);
// puts("cMoneySector");
// getch();
gcSector = gstWorkCardInfomation.stCardStruct.cMoneySector;
gcBlock = gcSector * 4;
if (!AuthenCard(&lSerialNo, gcSector, MIF_READ)) return 0;
if (CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return 0;
// memcpy(&gstWorkCardInfomation.lMoneySum, gcMifBuffer, 4);
OverTurnString(&gstWorkCardInfomation.lMoneySum, gcMifBuffer, 4);
// memcpy(&gstWorkCardInfomation.lCurMoney, gcMifBuffer+4, 4);
OverTurnString(&gstWorkCardInfomation.lCurMoney, gcMifBuffer+4, 4);
memcpy(gstWorkCardInfomation.cChargeDevice, gcMifBuffer + 8, 4);
if (CardMFCRead16Bytes(gcBlock+1, gcMifBuffer)!=MI_OK) return 0;
//memcpy(&gstWorkCardInfomation.lMoney, gcMifBuffer, 4);
OverTurnString(&gstWorkCardInfomation.lMoney, gcMifBuffer, 4);
if (CardMFCRead16Bytes(gcBlock+2, gcMifBuffer)!=MI_OK) return 0;
// memcpy(&gstWorkCardInfomation.lMoneyBak, gcMifBuffer, 4);
OverTurnString(&gstWorkCardInfomation.lMoneyBak, gcMifBuffer, 4);
if(gstWorkCardInfomation.cChargeStep == 0x01)
{
if(gstWorkCardInfomation.cHistoryChargeType==CHARGETYPE_INCMONEY)
{
if(gstWorkCardInfomation.lMoney>gstWorkCardInfomation.lMoneyBak)
{
gstWorkCardInfomation.lMoney = gstWorkCardInfomation.lMoneyBak;
gcMoneyMarsterBlock = 1;
}
else
{
gstWorkCardInfomation.lMoneyBak = gstWorkCardInfomation.lMoney;
gcMoneyMarsterBlock = 0;
}
}
else
{
if(gstWorkCardInfomation.lMoney<gstWorkCardInfomation.lMoneyBak)
{
gstWorkCardInfomation.lMoney = gstWorkCardInfomation.lMoneyBak;
gcMoneyMarsterBlock = 1;
}
else
{
gstWorkCardInfomation.lMoneyBak = gstWorkCardInfomation.lMoney;
gcMoneyMarsterBlock = 0;
}
}
}
else
{
if(gstWorkCardInfomation.cHistoryChargeType==CHARGETYPE_INCMONEY)
{
if(gstWorkCardInfomation.lMoney<gstWorkCardInfomation.lMoneyBak)
{
gstWorkCardInfomation.lMoney = gstWorkCardInfomation.lMoneyBak;
gcMoneyMarsterBlock = 1;
}
else
{
gstWorkCardInfomation.lMoneyBak = gstWorkCardInfomation.lMoney;
gcMoneyMarsterBlock = 0;
}
}
else
{
if(gstWorkCardInfomation.lMoney>gstWorkCardInfomation.lMoneyBak)
{
gstWorkCardInfomation.lMoney = gstWorkCardInfomation.lMoneyBak;
gcMoneyMarsterBlock = 1;
}
else
{
gstWorkCardInfomation.lMoneyBak = gstWorkCardInfomation.lMoney;
gcMoneyMarsterBlock = 0;
}
}
}
gstWorkCardInfomation.cGetInfoFinished |= SECTOR_MONEY;
}
if(((cSectorFlag&SECTOR_TIMES)==SECTOR_TIMES)&&((gstWorkCardInfomation.cGetInfoFinished & SECTOR_TIMES)!=SECTOR_TIMES))
{
gstWorkCardInfomation.cGetInfoFinished |= SECTOR_TIMES;
}
// set_console_chinese();
return 1;
}
//返回卡片信息
unsigned char ReturnCardInfomation(unsigned char *cReturnBuffer, unsigned short *iReturnLength)
{
unsigned char i, j, k;
unsigned long llSerialNo;
SPT_set(16);
for(i = 10;i;)
{
if (!SPT_read())
{
SPT_set(16);
i --;
}
if(CardTypeARequest(PICC_REQIDL,gcATQ) == MI_OK)
break;
}
if(i!=0)
{
CardTypeAAnticollLevel1((unsigned char*)&llSerialNo);
// Dispbcd(0,4, &llSerialNo, 4);
CardTypeASelectLevel1((unsigned char*)&llSerialNo, gcATS);
if ((llSerialNo != gstWorkCardKey.lSerialNo)||(gcGetKeyFinished != 4))
{
if(!GetCardKey(llSerialNo))
return ERR_POS_GETCARDKEY;
}
// for debug
// if((gstWorkCardInfomation.cKeyVerision==0xff)||(gstWorkCardInfomation.cKeyVerision==0xA0))
// {
// i = 0;
// }
// else
// for debug
if(GetCardInformation(llSerialNo, SECTOR_ALL))
{
memcpy(cReturnBuffer, &gstWorkCardInfomation.lSerialNo, 4);
memcpy(cReturnBuffer+4, gstWorkCardInfomation.cCityCode, 2);
memcpy(cReturnBuffer+6, gstWorkCardInfomation.cTradeCode, 2);
memcpy(cReturnBuffer+8, &gstWorkCardInfomation.lCardNo, 4);
cReturnBuffer[12] = gstWorkCardInfomation.cCardType;
k = 13;
if(gstWorkCardInfomation.cCardType>0x20)
{
switch(gstWorkCardInfomation.cCardType)
{
case CARD_DATA_GATHER:
case CARD_DEV_SET:
case CARD_NUMBER_SET:
case CARD_TOLL_START:
case CARD_TIME_SET:
case CARD_LEV_BUS:
case CARD_ARV_BUS:
case CARD_AUTHEN_DEV:
case CARD_MONTH_STA:
case CARD_NEW_CARD:
break;
case CARD_DRIVER_BUS:
case CARD_CLERK_BUS:
gcSector = gstWorkCardInfomation.stCardStruct.cHistorySector[0];
gcBlock = gcSector * 4;
if (!AuthenCard(&llSerialNo, gcSector, MIF_READ)) return ERR_MIF_AUTEN;
if (CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_READ;
memcpy(cReturnBuffer+k, gcMifBuffer, 8);
k += 8;
break;
}
}
else
{
memcpy(cReturnBuffer+k, gstWorkCardInfomation.cLimitDate, 4);
k+=4;
OverTurnString(cReturnBuffer+k, &gstWorkCardInfomation.lMoney, 4);
k+=4;
}
*iReturnLength = k;
cReturnBuffer[*iReturnLength] = gstWorkCardInfomation.cBlackListFlag;
*iReturnLength = *iReturnLength + 1;
return ST_OK;
}
}
return ERR_POS_ERRORCHKCARD;
}
//设置黑名单标志
unsigned char SetBlackListFlag(unsigned long lSerialNo, unsigned char cNewCardFlag)
{
unsigned char i, k;
unsigned long llSerialNo;
if (gcAuthenMode ==2)
{
SPT_set(16);
for(i = 10;i;)
{
if (!SPT_read())
{
SPT_set(16);
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(cNewCardFlag == 0x04)
{
if(gstWorkCardInfomation.cBlackListFlag == 04)
{
return ERR_POS_ALREADYBLCARD;
}
}
else if(cNewCardFlag == 0x00)
{
if(gstWorkCardInfomation.cBlackListFlag == 0x00)
{
return ERR_POS_NOTBLCARD;
}
}
else
return ERR_POS_ERRORPARM;
// 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.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;
gcMifBuffer[6] = cNewCardFlag;
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;
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.cBlackListFlag = cNewCardFlag;
gstWorkCardInfomation.cGetInfoFinished &= MASK_SECTOR_PUBLIC;
GetCardInformation(lSerialNo, SECTOR_PUBLIC);
}
else
return ERR_POS_NOCARD;
}
return ST_OK;
}
//充值交易
//
//
unsigned char ChargeMoneyOrTimes(unsigned char Cmd, unsigned long lSerialNo, unsigned long lChargeMoney, unsigned char *cDate)
{
unsigned char i, j, k, tmpbuff[200];
unsigned long llSerialNo;
// clr_scr();
// Dispbcd(0,0, &lSerialNo, 4);
// DispLong(0,2, lChargeMoney);
if(gcAuthenMode !=2) return ERR_POS_DEVICENOTAUTH;
glChargeMoney = lChargeMoney;
switch(Cmd)
{
case CMD_CHARGE_MONEY:
gcChargeMode = MODE_CHARGE_MONEY;
gcChargeMode2 = PICC_INCREMENT;
gcChargeType = CHARGETYPE_INCMONEY;
break;
case CMD_CHARGE_SMONEY:
gcChargeMode = MODE_CHARGE_TIMES;
gcChargeMode2 = PICC_INCREMENT;
gcChargeType = CHARGETYPE_INCTIMES;
memcpy(gcChargeTimesDate, cDate, 3);
break;
case CMD_CHARGE_MONEYN:
gcChargeMode = MODE_CHARGE_MONEY;
gcChargeMode2 = PICC_DECREMENT;
gcChargeType = CHARGETYPE_DECMONEY;
break;
case CMD_CHARGE_SMONEYN:
gcChargeMode = MODE_CHARGE_TIMES;
gcChargeMode2 = PICC_DECREMENT;
gcChargeType = CHARGETYPE_DECTIMES;
memcpy(gcChargeTimesDate, cDate, 3);
break;
case CMD_PURCHASE_MONEY:
gcChargeMode = MODE_CHARGE_MONEY;
gcChargeMode2 = PICC_DECREMENT;
gcChargeType = CHARGETYPE_PURMONEY;
break;
case CMD_PURCHASE_TIMES:
gcChargeMode = MODE_CHARGE_TIMES;
gcChargeMode2 = PICC_DECREMENT;
gcChargeType = CHARGETYPE_PURTIMES;
memcpy(gcChargeTimesDate, cDate, 3);
break;
}
SPT_set(16);
for(i = 10;i;)
{
if (!SPT_read())
{
SPT_set(16);
i --;
}
if(CardTypeARequest(PICC_REQIDL,gcATQ) == MI_OK)
break;
}
if(i!=0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -