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

📄 mifare.c

📁 以上几个手持机的初始化程序
💻 C
📖 第 1 页 / 共 5 页
字号:
			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 + -