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

📄 mifare.c

📁 是上一个SMS消费机的充值机程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		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] = ~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;
		}
		gstWorkCardInfomation.cGetInfoFinished &= MASK_SECTOR_ALL;
		GetCardInformation(lSerialNo, SECTOR_ALL);
	}
	else
		return ERR_POS_NOCARD;
	return ST_OK;
}

//生成控制卡
unsigned char NewControlCard(unsigned long lSerialNo, unsigned char cNewCardType, unsigned char *cControlBuf)
{
	unsigned char  i, k;
	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;
//			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.cPublishSector;
		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[0x0d] = cNewCardType;
		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;

		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;
		memcpy(gcMifBuffer, cControlBuf, 8);
		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.cGetInfoFinished &= MASK_SECTOR_PUBLIC;
		GetCardInformation(lSerialNo, SECTOR_PUBLIC);
	}
	else
		return ERR_POS_NOCARD;
	return ST_OK;
}

//命令执行
unsigned char POSExecuteCommand(unsigned char cCommand, unsigned short iLength, unsigned char *cBuffer, unsigned short *iReturnLength, unsigned char *cReturnBuffer)
{
	struct sttSysRunTime srt;
	unsigned char cReturnVal;
	unsigned long lSerialNo;
	unsigned long lChargeMoney;
	unsigned char cTempBuffer[1000];
	unsigned char i;
	int isrl;
	short shRet;
	unsigned short recLen;	
	struct sttPacketHead pHead;
	struct sttBlackListHead pBLHead;
		
	switch(cCommand)
	{
	case CMD_AUTHEN:
		if (gcAuthenMode == 2) 
		{
			cReturnBuffer[0] = ERR_POS_ALREADYAUTH;
			*iReturnLength = 1;
			return CMD_ERROR;
		}
		if(cBuffer[0] == 0)
		{
			if(!GetChallenge(gcRandom))
			{
				cReturnBuffer[0] = ERR_POS_GETRANDOM;
				*iReturnLength = 1;
				return CMD_ERROR;
			}
			memcpy(cReturnBuffer, gcSAMNo, 8);
			memcpy(cReturnBuffer+8, gcRandom, 8);
			gcAuthenMode = 1;
			*iReturnLength = 16;

		}
		else if(cBuffer[0] ==1)
		{
			if (gcAuthenMode == 1)
			{
				if(memcmp(gcRandom, cBuffer+1, 8)!=0)
				{
					cReturnBuffer[0] = ERR_POS_NOTSAMERANDOM;
					gcAuthenMode = 0;
					*iReturnLength = 1;
					return CMD_ERROR;
				}

				memcpy(gcWorkerNo, cBuffer+17, 8);
				if(ExternalAuth(cBuffer+9, 0x02))
				{
					gcAuthenMode = 2;
					*iReturnLength = 0;
				}
				else
				{
					gcAuthenMode = 0;
					cReturnBuffer[0] = ERR_PSAM_AUTHEN;
					//beep(1, 5);
					*iReturnLength = 1;
					return CMD_ERROR;
				}
			}
			else
			{
				cReturnBuffer[0] = ERR_POS_NOAUTHREQUEST;
				*iReturnLength = 1;
				return CMD_ERROR;
			}				
		}		
		break;
	case CMD_LOGON:
		if(VerifyPIN(cBuffer[0], cBuffer+1))
		{
			//操作员编号
			memcpy(&gstWorkCardInfomation.lMoney, ASC2BCD(gcWorkerNo, 8), 4);
			//机具编号
			memcpy(&glChargeMoney, "\x00\x00\x01", 3); // for debug
			
			gcChargeType = CHARGETYPE_LOGON;
			if(BuildRecord()!=ST_OK) return ERR_POS_BUILDRECORD;	
// for debug
//			gcSector = gstWorkCardInfomation.stCardStruct.cPublicSector;
//			gcBlock = gcSector * 4;
//			if(!AuthenCard(&glSerialNo, gcSector, MIF_WRITE)) return 0;
//			for(i=0;i<3;i++)
//			if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)==MI_OK) break;
//			if(i==3)
//			{
//				gcAuthenMode = 0;
//				cReturnBuffer[0] = ERR_MIF_READ;
//				*iReturnLength = 1;
//				return CMD_ERROR;
//			}	
//			gstWorkCardInfomation.iMoneyTotleTimes++;
//			OverTurnString(gcMifBuffer+1, &gstWorkCardInfomation.iMoneyTotleTimes, 2);
//			gcMifBuffer[15] = 0;
//			for(i=0;i<15;i++)
//				gcMifBuffer[15] ^= gcMifBuffer[i];
//			for(i=0;i<3;i++)
//				if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)==MI_OK) break;
//			if(i==3)
//			{
//				gcAuthenMode = 0;
//				cReturnBuffer[0] = ERR_MIF_WRITE;
//				*iReturnLength = 1;
//				return CMD_ERROR;
//			}	
// for debug			
			gcAuthenMode = 2;
			memcpy(gcWorkerNo, cBuffer+9, 8);
			*iReturnLength = 0;
		}
		else
		{
			gcAuthenMode = 0;
			cReturnBuffer[0] = ERR_PSAM_PINAUTH;
			*iReturnLength = 1;
			return CMD_ERROR;
		}	
		break;
	case CMD_M1PASS:
		memcpy(&lSerialNo, cBuffer,4);
		if(GetCardKey(lSerialNo))
		{
			*iReturnLength = 0;
		}
		else
		{
			cReturnBuffer[0] = ERR_POS_GETCARDKEY;
			*iReturnLength = 1;
			return CMD_ERROR;
		}
		break;
	case CMD_M1INFO:
		cReturnBuffer[0] = ReturnCardInfomation(cReturnBuffer+1, iReturnLength);
		if(cReturnBuffer[0]==ST_OK)
		{
			memcpy(cReturnBuffer, cReturnBuffer+1, *iReturnLength);
		}
		else
		{
			*iReturnLength = 1;
			return CMD_ERROR;
		}	
		break;
	case CMD_PURCHASE:
	case CMD_CHARGE:
//		clr_scr();
//		move_cursor(0,0);
//		set_console_english();
//		puts("CMD_CHARGE");
//		getch();
//		set_console_chinese();
		memcpy(&lSerialNo, cBuffer,4);
//		memcpy(&lChargeMoney, cBuffer+5,4);
		OverTurnString(&lChargeMoney, cBuffer+5,4);
		cReturnBuffer[0] = ChargeMoneyOrTimes(cBuffer[4], lSerialNo, lChargeMoney, cBuffer+9);
		if(cReturnBuffer[0]!=ST_OK)
		{
			*iReturnLength = 1;
			return CMD_ERROR;
		}
		else
		{
			memcpy(cReturnBuffer, &gstWorkChargeRecord, 40);
			*iReturnLength = 40;
		}
		break;
	case CMD_GETDATA:
//		clr_scr();	
//		move_cursor(0,0);
//		puts("CMD_GETDATA");
//		getch();
	
		isrl = 0;
		shRet = 0;
		do
		{
			memset(cTempBuffer, 0, sizeof(cTempBuffer));
			shRet = wrapTradeRecord(cTempBuffer, isrl, &srt);
			for(i=0;i<3;i++)
			{
				if(UART_send(cTempBuffer, shRet*40+sizeof(pHead))==0)
					break;
			}
			if(i==3)
			{
				shRet = -2;
				break;
			}
			if(updateSysRunTime(&srt)!=0)                    //回写系统运行时参数
			{
				shRet = -1;
				break;
			}			
			isrl ++;
		}while(shRet>0);
		if(shRet<0)
		{
			if(shRet==-2)
			{
				cReturnBuffer[0] = ERR_COM_TIMEOUT;
			}
			else if(shRet==-1)
			{
				cReturnBuffer[0] = ERR_CHG_READEEPROM;
			}
			*iReturnLength = 1;
			return CMD_ERROR;
		}
		else
		{
			*iReturnLength = 0;
		}	
		break;
	case CMD_SETBLACKLIST:
		memcpy(cTempBuffer, cBuffer, iLength);
		shRet = updateBlackList(cTempBuffer);
//		if(shRet ==0)
//		{
//			do
//			{
//				memset(cTempBuffer, 0, sizeof(cTempBuffer));
//				for(i=0;i<3;i++)
//				{
//					if(UART_receive(cTempBuffer, &recLen)==0)
//						break;
//				}
//				if(i==3)
//				{
//					shRet = -2;
//					break;
//				}
//				iLength = 0;
//				memcpy(&recLen, cTempBuffer+1, 2);
//				memcpy(cTempBuffer, cTempBuffer+4, recLen);				
//				shRet = updateBlackList(cTempBuffer);
//				if(recLen==sizeof(pBLHead)) break;
//			}while(shRet>0);
//		}
		if(shRet<0)
		{
			if(shRet==-2)
			{
				cReturnBuffer[0] = ERR_COM_TIMEOUT;
			}
			else if(shRet==-1)
			{
				cReturnBuffer[0] = ERR_CHG_WRITEEEPROM;
			}
			*iReturnLength = 1;
			return CMD_ERROR;
		}
		else
		{
			*iReturnLength = 0;
		}	
		break;
	case CMD_RESTORECARD:
		if(CardRestore(cBuffer[0])==1)
		{
			*iReturnLength = 0;
		}
		else
		{
			cReturnBuffer[0] = ERR_POS_CARDRESTORE;
			*iReturnLength = 1;
			return CMD_ERROR;
		}
		break;
	case CMD_SALECARD:
		memcpy(&lSerialNo, cBuffer,4);
//		memcpy(&lChargeMoney, cBuffer+4,4);
		OverTurnString(&lChargeMoney, cBuffer+4,4);
		cReturnBuffer[0] = SaleCard(lSerialNo, lChargeMoney, cBuffer[8], cBuffer+9);
		if(cReturnBuffer[0]!=ST_OK)
		{
			*iReturnLength = 1;
			return CMD_ERROR;
		}
		else
		{
			memcpy(cReturnBuffer, &gstWorkChargeRecord, 40);
			*iReturnLength = 40;
		}
		break;
	case CMD_GETDATETIME:
		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);
		memcpy(cReturnBuffer, gcNowTime, 7);
		*iReturnLength = 7;
		break;
	case CMD_SETDATETIME:
		memcpy(gcNowTime, cBuffer, 7);
		if(!IsValidDate(gcNowTime))
		{
			cReturnBuffer[0] = ERR_POS_TIMESPARM;
			*iReturnLength = 1

⌨️ 快捷键说明

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