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

📄 mifare.c.bak

📁 用于小商品消费的SMS消费机程序
💻 BAK
📖 第 1 页 / 共 5 页
字号:
//			set_console_english();
//			puts("GetResponse");
//			getch();
//			set_console_chinese();
			
			if(!GetResponse(outbuf, i))
			{
				return 0;
			}

//			clr_scr();
//			move_cursor(0,0);
//			set_console_english();
//			Dispbcd(0,0, outbuf, 24);
//			set_console_chinese();

			delay_n_ms(2);
			memcpy(gstWorkCardKey.cKeyB[0], outbuf+24,6);
			memcpy(gstWorkCardKey.cKeyB[1], outbuf,6);
			memcpy(gstWorkCardKey.cKeyB[2], outbuf+6, 6);
			memcpy(gstWorkCardKey.cKeyB[6], outbuf+6, 6);
			gcGetKeyFinished = 2;
		case 2:		
			for(i=3;i<6;i++)
			{
				memcpy(gstWorkCardKey.cKeyB[i], outbuf+12, 6);
			}
			gcGetKeyFinished = 3;
		case 3:		
			memcpy(gstWorkCardKey.cKeyB[7], outbuf+18, 6);
			memcpy(gstWorkCardKey.cKeyB[8], outbuf+18, 6);
			gcGetKeyFinished = 4;
		}
	}
//	for(i=0;i<9;i++)
//	{
//		clr_scr();
//		move_cursor(0,0);
//		set_console_english();
//		printf("%d", i);
//		Dispbcd(0,1, &gstWorkCardKey.cKeyB[i], 6);
//		set_console_chinese();
//	}

	gstWorkCardKey.lSerialNo = lSerialNo;
	gstWorkCardInfomation.lSerialNo = lSerialNo;
	return 1;
}
*/
//获取卡片信息
unsigned char GetCardInformation(unsigned long lSerialNo, unsigned char cSectorFlag)
{
	unsigned char  i, sw, j;
	unsigned long  l1, l2;

/*	set_console_english();
	clr_scr();
	Dispbcd(0,0,&gstWorkCardInfomation.stCardStruct,7);
	Dispbcd(0,2,&lSerialNo,4);
	Dispbcd(0,3,&gstWorkCardKey.lSerialNo,4);
	Dispbcd(0,4,&gcGetKeyFinished,1);
	for(i=0;i<9;i++)
	{
		clr_scr();
		move_cursor(0,0);
		set_console_english();
		printf("%d", i);
		Dispbcd(0,1, &gstWorkCardKey.cKeyB[i], 6);
		set_console_chinese();
	}
*/	if ((lSerialNo != gstWorkCardKey.lSerialNo)||(gcGetKeyFinished!=4))
	{
		if (!GetCardKey(lSerialNo)) return 0;
	}	
	
	if ((gstWorkCardInfomation.lSerialNo == lSerialNo)&&((gstWorkCardInfomation.cGetInfoFinished & cSectorFlag)== cSectorFlag)) return 1;
	gstWorkCardInfomation.lSerialNo = lSerialNo;
	//if ((gstWorkCardInfomation.cKeyVerision == 0xff)||(gstWorkCardInfomation.cKeyVerision == 0xA0)) return 2; for debug
	if(((cSectorFlag&SECTOR_PUBLISH)==SECTOR_PUBLISH)&&((gstWorkCardInfomation.cGetInfoFinished & SECTOR_PUBLISH)!=SECTOR_PUBLISH))
	{
//		clr_scr();
//		move_cursor(0,0);	
//		puts("cPublishSector");
//		getch();

//		gcSector = gstWorkCardInfomation.stCardStruct.cPublishSector;
//		gcBlock = gcSector * 4;
//		if (!AuthenCard(&lSerialNo, gcSector, MIF_WRITE)) return 0;
//		if (CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return 0;
//		gcMifBuffer[12] = 0x02;
//		if (CardMFCWrite16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return 0;

		gcSector = gstWorkCardInfomation.stCardStruct.cPublishSector;
		gcBlock = gcSector * 4;
		if (!AuthenCard(&lSerialNo, gcSector, MIF_READ)) return 0;

		if (CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return 0;
		memcpy(gstWorkCardInfomation.cCityCode, gcMifBuffer, 2);						
		memcpy(gstWorkCardInfomation.cTradeCode, gcMifBuffer + 2, 2);					
		memcpy(&gstWorkCardInfomation.lCardNo, gcMifBuffer+4, 4);
		memcpy(gstWorkCardInfomation.cAuthenCode, gcMifBuffer + 8, 4);				
		gstWorkCardInfomation.cUsageFlag  = gcMifBuffer[12];							
		gstWorkCardInfomation.cCardType = gcMifBuffer[13];							
		gstWorkCardInfomation.cCardVer = gcMifBuffer[14];							

		if (CardMFCRead16Bytes(gcBlock+1, gcMifBuffer)!=MI_OK) return 0;
		memcpy(gstWorkCardInfomation.cNewDate, gcMifBuffer, 4);						
		memcpy(gstWorkCardInfomation.cLimitDate, gcMifBuffer + 4, 4);				
		memcpy(gstWorkCardInfomation.cUseDate, gcMifBuffer + 8, 4);					
	//	memcpy(&gstWorkCardInfomation.iPreMoney, gcMifBuffer + 12, 2);					
		OverTurnString(&gstWorkCardInfomation.iPreMoney, gcMifBuffer + 12, 2);					
		
		if (CardMFCRead16Bytes(gcBlock+2, gcMifBuffer)!=MI_OK) return 0;
		memcpy(gstWorkCardInfomation.cLastChargeDateTime, gcMifBuffer, 4);			
	//	memcpy(&gstWorkCardInfomation.lLastMoney, gcMifBuffer + 4, 4);					
		OverTurnString(&gstWorkCardInfomation.lLastMoney, gcMifBuffer + 4, 4);					
	//	memcpy(&gstWorkCardInfomation.iLastChargeMoney, gcMifBuffer + 8, 2);					
		OverTurnString(&gstWorkCardInfomation.iLastChargeMoney, gcMifBuffer + 8, 2);					
		memcpy(gstWorkCardInfomation.cLastChargeWorker, gcMifBuffer + 10, 2);		
		if(gstWorkCardInfomation.cCardType>0x20)
		{
			return 1;
		}
		gstWorkCardInfomation.cGetInfoFinished |= SECTOR_PUBLISH;
	}
	
	if(((cSectorFlag&SECTOR_PUBLIC)==SECTOR_PUBLIC)&&((gstWorkCardInfomation.cGetInfoFinished & SECTOR_PUBLIC)!=SECTOR_PUBLIC))
	{
//		clr_scr();
//		move_cursor(0,0);	
//		puts("cPublicSector");
//		getch();
	
		gcSector= gstWorkCardInfomation.stCardStruct.cPublicSector;
		gcBlock = gcSector * 4;
		if (!AuthenCard(&lSerialNo, gcSector, MIF_READ)) return 0;
		if (CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return 0;
		if ((gcMifBuffer[3]!=0x01)&&(gcMifBuffer[3]!=0x02))
		{
			if (CardMFCRead16Bytes(gcBlock+1, gcMifBuffer)!=MI_OK) return 0;
			for(i=0;i<16;i++)
				gcMifBuffer[i] = 0xff - gcMifBuffer[i];
			if (gcMifBuffer[0] < 9)
				gcMifBuffer[0] ++;
			else
				gcMifBuffer[0] = 1;
			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(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);
//		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(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(cNewCardFlag == 0x04)	
			{
				if(gstWorkCardInfomation.cBlackListFlag == 04)	
				{
					return ERR_POS_ALREADYBLCARD;
				}
			}
			else if(cNewCardFlag == 0x00)	
			{

⌨️ 快捷键说明

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