⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mifare.c

📁 以上几个手持机的初始化程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		CardTypeAAnticollLevel1((unsigned char*)&llSerialNo);
//		Dispbcd(0,4, &llSerialNo, 4);
		CardTypeASelectLevel1((unsigned char*)&llSerialNo, gcATS);
		if ((llSerialNo != gstWorkCardKey.lSerialNo)||(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; 

//for debug
//		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;
//		}
//for debug
		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);
/*		clr_scr();
		Dispbcd(0,0, gcASCDateTime, 14);
		Dispbcd(0,4, gcNowTime, 7);
		Dispbcd(0,6, gstWorkCardInfomation.cLimitDate, 4);
*/		i = CompareDate(gcNowTime, (unsigned char*)gstWorkCardInfomation.cLimitDate);

		if (i == 2)
			return ERR_POS_OUTOFLIMIT;
		if(gcChargeMode2 == PICC_DECREMENT)
		{
			if((gcChargeType != CHARGETYPE_PURMONEY)&&(gcChargeType != CHARGETYPE_PURTIMES))
			{
				if(((gcChargeType == CHARGETYPE_DECMONEY)&&(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_INCMONEY))||((gcChargeType == CHARGETYPE_DECTIMES)&&(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_INCTIMES)))
				{
	
					if ((gstWorkCardInfomation.lHistoryChargeMoney != glChargeMoney)||(memcmp(gstWorkCardInfomation.cHistoryPSAMNo, gcPSAMNo, 4) != 0))
						return ERR_CHG_CANNOTCHARGEN;
				}
				else 
					return ERR_CHG_CANNOTCHARGEN;
			}
			else
			{
				if(gcChargeMode == MODE_CHARGE_MONEY)
				{
					if(gstWorkCardInfomation.lMoney<glChargeMoney)
						return ERR_POS_NOTENOUGHMONEY;
				}
			}			
		}
		
		if (!WriteChargeStep(1)) return ERR_POS_WRITECHRSTEP;
		
		if(gcChargeMode == MODE_CHARGE_MONEY)	
		{
			gcSector = gstWorkCardInfomation.stCardStruct.cMoneySector;
			gcBlock = gcSector * 4;
			if(!ModifyMoney(gcChargeMode2, gcBlock + gcMoneyMarsterBlock + 1, glChargeMoney)) return ERR_POS_MODIFYMONEY;
			if(!IsValidMoney(gcSector, gcBlock + gcMoneyMarsterBlock + 1)) return ERR_POS_MODIFYMONEY;

			if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_READ;
			if (gcChargeMode2 == PICC_INCREMENT)
			{
				gstWorkCardInfomation.lMoneySum += glChargeMoney;
				gstWorkCardInfomation.lCurMoney = gstWorkCardInfomation.lMoney + glChargeMoney;
			}
			else
			{
				gstWorkCardInfomation.lMoneySum -= glChargeMoney;
				gstWorkCardInfomation.lCurMoney = gstWorkCardInfomation.lMoney - glChargeMoney;
			}
//			memcpy(gcMifBuffer, &gstWorkCardInfomation.lMoneySum, 4);
			OverTurnString(gcMifBuffer, &gstWorkCardInfomation.lMoneySum, 4);
//			memcpy(gcMifBuffer+4, &gstWorkCardInfomation.lCurMoney, 4);
			OverTurnString(gcMifBuffer+4, &gstWorkCardInfomation.lCurMoney, 4);
			memcpy(gcMifBuffer+8, gcPSAMNo, 4);
			memset(gcMifBuffer+12, 0, 4);
			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;

			if(!ModifyPoint()) return ERR_POS_WRITECHRPOINT;

			if(!WriteChargeStep(0x02)) return ERR_POS_WRITECHRSTEP;

			CopyBlock(gcSector, gcBlock, gcBlock+1, 1);

			gcSector = gstWorkCardInfomation.stCardStruct.cMoneySector;
			gcBlock = gcSector * 4;
			AuthenCard(&lSerialNo, gcSector, MIF_WRITE);
			CopyBlock(gcSector, gcBlock + gcMoneyMarsterBlock + 1, gcBlock + 2 - gcMoneyMarsterBlock, 0);
		}
		
//		clr_scr();
//		move_cursor(0,0);
//		set_console_english();
//		puts("BuildRecord");
//		getch();
//		set_console_chinese();
		if(BuildRecord()!=ST_OK) return ERR_POS_BUILDRECORD;
		if(gcChargeMode == MODE_CHARGE_MONEY)
		{
			gstWorkCardInfomation.cGetInfoFinished &= (MASK_SECTOR_MONEY&MASK_SECTOR_HISTORY&MASK_SECTOR_PUBLIC);
//			GetCardInformation(lSerialNo, SECTOR_MONEY|SECTOR_HISTORY|SECTOR_PUBLIC);
		}		
	}
	else
		return ERR_POS_NOCARD;
	return ST_OK;
}
//卡片恢复
unsigned char CardRestore(unsigned char cMode)
{
	unsigned char cFlag1, cFlag2, i, k, cMarsterBlock, cOperMode;
	unsigned long lMoney1, lMoney2;	


	for (k=0;k<2;k++)
	{
		if (k==0)	
		{
			gcSector = gstWorkCardInfomation.stCardStruct.cMoneySector;
			cMarsterBlock = gcMoneyMarsterBlock;
			if ((gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_PURMONEY)||(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_DECMONEY)||(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_INCMONEY))	
				cOperMode = cMode;
			else
				cOperMode = 'B';
		}
		else
		{
			if(gstWorkCardInfomation.stCardStruct.cEveTimesSector!=0xff)
			{
				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_READ)) 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(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(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);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -