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

📄 devicebase03.cpp

📁 shuibiao danpianji chengxu
💻 CPP
📖 第 1 页 / 共 4 页
字号:
 }

//清检查卡
int CDeviceBase03::DClear_jc()
{
	return(DClear_fx());
}

//清消费卡
int CDeviceBase03::DClear_xf(long KnID,long yhmm)
{
        BYTE zhuanzf[10];
        int zhuansz;
        
		if(testview)
		{
	        char xxinfo[100];
	        wsprintf(xxinfo,"KnID=%ld,yhmm=%ld",KnID,yhmm);    
            MessageBox( NULL,xxinfo,"写入数据显示窗口",0); 
		}

		zhuansz=m_YhmmCoding(yhmm);
        numtostr(&zhuansz,zhuanzf);

		//将加密卡清空
		return (clearjmcard(zhuanzf));
}

//读消费卡
int CDeviceBase03::DKxXfqr(long KnID,           //用户ID号
                        long yhmm,              //用户密码
                        struct XFCZSJ * qbsj,   //气表数据
                        struct XFCZSJ * dbsj,   //电表数据
                        struct XFCZSJ * sb1sj,  //水表1数据
                        struct XFCZSJ * sb2sj   //水表2数据
                        )
{
        BYTE zhuanzf[10];
        int i,errno,zhuansz;
        struct XFZT xfzt[4];

        if(testview)
		{
	        char xxinfo[100];
			wsprintf(xxinfo,"ID=%ld\nyhmm=%ld",KnID,yhmm);    
			MessageBox( NULL,xxinfo,"写入数据显示窗口",0); 
		}

        //设置为读加密卡
		errno=Set_modecode(modejmzc);
        if (errno!=0) return errcase(errno);

        //设置读卡密码
		zhuansz=m_YhmmCoding(yhmm);
        numtostr(&zhuansz,zhuanzf);
        errno=Set_pass(zhuanzf);
        if (errno!=0) return errcase(errno);

        //读卡
		errno=rd_dat(1,7,rdbuff);
        if (errno!=0) return errcase(errno);

		Set_pass(mm_clear);
		Set_modecode(modezc);

		//校验卡密码
		if(*(unsigned int *)&rdbuff[24]!=*(unsigned int *)zhuanzf)
			return errcase(0x10);	//卡未加密
		
        errno=0;
		for(i=0;i<4;i++)
        {
            Xfqr(nCurrDeviceNum[i],i,&xfzt[i],rdbuff);
			if(xfzt[i].xfyx==1) errno++;
        }
		
		qbsj->bnye=xfzt[0].xfsl;
        qbsj->hdcs=xfzt[0].xfcs;
        qbsj->bnerr=xfzt[0].xferr;

        dbsj->bnye=xfzt[1].xfsl;
        dbsj->hdcs=xfzt[1].xfcs;
        dbsj->bnerr=xfzt[1].xferr;

        sb1sj->bnye=xfzt[2].xfsl;
        sb1sj->hdcs=xfzt[2].xfcs;
        sb1sj->bnerr=xfzt[2].xferr;

        sb2sj->bnye=xfzt[3].xfsl;
        sb2sj->hdcs=xfzt[3].xfcs;
        sb2sj->bnerr=xfzt[3].xferr;
		
		if(errno==0) return(10);	//非正常消费卡
        return 0;
}

//写消费卡
int CDeviceBase03::DKxWrxfk(long KnID,              //用户ID
							long yhmm,              //用户密码
							struct XFCZSJ * qbsj,   //气表数据
							struct XFCZSJ * dbsj,   //电表数据
							struct XFCZSJ * sb1sj,  //水表1数据
							struct XFCZSJ * sb2sj   //水表2数据
                        )
{
        BYTE zhuanzf[10];
        int errno,i,zhuansz;
        struct XFZT xfzt[4];

        if(testview)
		{
	        char xxinfo[200];
			wsprintf(xxinfo,"ID=%ld,yhmm=%ld\ndbsl=%ld,dbcs=%ld,dbyx=%ld\nqbsl=%ld,qbcs=%ld,qbyx=%ld\nsb1sl=%ld,sb1cs=%ld,sb1yx=%ld\nsb2sl=%ld,sb2cs=%ld,sb2yx=%ld\n"
						,KnID,yhmm,dbsj->xfsl,dbsj->xfcs,dbsj->xfyx,qbsj->xfsl,qbsj->xfcs,qbsj->xfyx,sb1sj->xfsl,sb1sj->xfcs,sb1sj->xfyx,sb2sj->xfsl,sb2sj->xfcs,sb2sj->xfyx);
			MessageBox( NULL,xxinfo,"写入数据显示窗口",0); 
		}

        if (resrand==1)
        {
            resrand =0;
            srand((unsigned)time(NULL));
        }

        //数据传递
        xfzt[0].xfsl=qbsj->xfsl;
        xfzt[0].xfcs=qbsj->xfcs;
        xfzt[0].xfyx=qbsj->xfyx;
		xfzt[0].xferr=qbsj->bnerr;

        xfzt[1].xfsl=dbsj->xfsl;
        xfzt[1].xfcs=dbsj->xfcs;
        xfzt[1].xfyx=dbsj->xfyx;
		xfzt[1].xferr=dbsj->bnerr;

        xfzt[2].xfsl=sb1sj->xfsl;
        xfzt[2].xfcs=sb1sj->xfcs;
        xfzt[2].xfyx=sb1sj->xfyx;
		xfzt[2].xferr=sb1sj->bnerr;

        xfzt[3].xfsl=sb2sj->xfsl;
        xfzt[3].xfcs=sb2sj->xfcs;
        xfzt[3].xfyx=sb2sj->xfyx;
		xfzt[3].xferr=sb2sj->bnerr;

        //数据有效性判断        
        for(i=0;i<4;i++)
        {
            if((xfzt[i].xfsl>0xffffff || xfzt[i].xfsl<0) || 
				(xfzt[i].xfcs>255 || xfzt[i].xfcs<0) ||
				(xfzt[i].xfyx!=0 && xfzt[i].xfyx!=1))
                    return 2;
        }

		//读卡内数据
        errno=Set_modecode(modejmzc);
        if(errno!=0) return errcase(errno);

        zhuansz=m_YhmmCoding(yhmm);
        numtostr(&zhuansz,zhuanzf);
        errno=Set_pass(zhuanzf);
        if(errno!=0) return errcase(errno);

        errno=rd_dat(1,7,wrbuff);
        if(errno!=0) return errcase(errno);

		//校验卡密码
		if(*(unsigned int *)&wrbuff[24]!=*(unsigned int *)zhuanzf)
			return errcase(0x10);	//卡未加密

		//准备写卡数据
		for(i=0;i<4;i++)
        {
            errno=Wrxfk(nCurrDeviceNum[i],i, &xfzt[i],wrbuff);
			if(errno!=0) return(errno); 
        }

        //写卡
		errno=wr_dat(1,6,wrbuff);
        if (errno!=0) return errcase(errno);

		//读卡	
		errno=rd_dat(1,6,rdbuff);
        if (errno!=0) errno=rd_dat(1,6,rdbuff);
        if (errno!=0) return 1;

		Set_pass(mm_clear);
		Set_modecode(modezc);

		for(i=0;i<24;i++)
        {
			if(wrbuff[i]!=rdbuff[i]) return 1;
        }
        return 0;
}

//读发行卡/检测卡
int CDeviceBase03::DKxRdFxk(long * KnID,   //卡内ID
							long * yhmm,   //用户密码
							struct FXCZSJ * fxsj   //发行卡表数据
							)
{
        BYTE zhuanzf[10];
        int errno,zhuansz;

        if(testview)
		{
	        char xxinfo[100];
			wsprintf(xxinfo,"ID=%ld\n",*KnID);  
			MessageBox( NULL,xxinfo,"写入数据显示窗口",0); 
		}

		//设置为加密方式
        errno=Set_modecode(modejmzc);
        if(errno!=0) return errcase(errno);

        //告之卡密码
		zhuansz=faxingmm;
        numtostr(&zhuansz,zhuanzf);
        errno=Set_pass(zhuanzf);
        if(errno!=0) return errcase(errno);
	
		//读卡	
        errno=rd_dat(1,7,rdbuff);
        if(errno!=0) return errcase(errno);

		Set_pass(mm_clear);
		Set_modecode(modezc);

		//校验卡密码
		if(*(unsigned int *)&rdbuff[24]!=*(unsigned int *)zhuanzf)
			return errcase(0x10);	//卡未加密
		
		//分析各个表的发行状态		
		fxsj->fxmode=0;

		errno=0;
		fxsj->qbjz=-1;
        if((rdbuff[0]==0xf1) || (rdbuff[0]==0xf8))
		{
			if(nCurrDeviceNum[0]==430004001)
				fxsj->qbjz=0;
			else
				fxsj->qbjz=rdbuff[4]+rdbuff[5]*256;
			
			if((fxsj->fxmode==0) && (rdbuff[0]==0xf8))
				fxsj->fxmode=1;

			errno++;
		}

        fxsj->dbjz=-1;
        if((rdbuff[1]==0xf1) || (rdbuff[1]==0xf8))
		{
			if(nCurrDeviceNum[1]==430004001)
				fxsj->dbjz=0;
			else
				fxsj->dbjz=rdbuff[6]+rdbuff[7]*256;

			if((fxsj->fxmode==0) && (rdbuff[1]==0xf8))
				fxsj->fxmode=1;
			
			errno++;
		}

        fxsj->sb1jz=-1;
        if((rdbuff[2]==0xf1) || (rdbuff[2]==0xf8))
		{
			if(nCurrDeviceNum[2]==430004001)
				fxsj->sb1jz=0;
			else
				fxsj->sb1jz=rdbuff[8]+rdbuff[9]*256;
			
			if((fxsj->fxmode==0) && (rdbuff[2]==0xf8))
				fxsj->fxmode=1;

			errno++;
		}

        fxsj->sb2jz=-1;
        if((rdbuff[3]==0xf1) || (rdbuff[3]==0xf8))
		{
			if(nCurrDeviceNum[3]==430004001)
				fxsj->sb2jz=0;
			else
				fxsj->sb2jz=rdbuff[10]+rdbuff[11]*256;

			if((fxsj->fxmode==0) && (rdbuff[3]==0xf8))
				fxsj->fxmode=1;
	
			errno++;
		}
	
		if(errno==0) return(10);	//无效卡
		
		//读用户卡号
        strznum.strzh[3]=rdbuff[12];
        strznum.strzh[2]=rdbuff[14];
        strznum.strzh[1]=rdbuff[15];
        strznum.strzh[0]=rdbuff[21];
        *KnID=strznum.numzh;

		//读消费密码        
		zhuanzf[0]=rdbuff[22];
        zhuanzf[1]=rdbuff[19];
        zhuanzf[2]=rdbuff[16];
        zhuanzf[3]=rdbuff[13];

        strtonum(&zhuansz,zhuanzf);
        zhuansz=zhuansz^faxingmm;
        zhuansz=zhuansz^0xE52A7002;
        *yhmm=m_YhmmCoding(zhuansz);

        return 0;
}

//检查卡数据分析
int CDeviceBase03::JckFenXi(BYTE * Kasj,
							struct JCCZSJ * Jcsj)
{       
        //判断表所使用的类型号
        switch(Kasj[4])
        {
        case 0x1A:	//老式气表
        case 0x2A:	//带版本号的气表
		case 0x2F:	//内置式气表
                Jcsj->blbNum=430001001;
                break;
        case 0x1B:	//电表(新、老)
                Jcsj->blbNum=430002001;
                break;
        case 0x1C:	//老式水表
        case 0x2C:	//带版本号的水表
		case 0x3C:	//无线抄表的水表
                Jcsj->blbNum=430003001;
                break;
        case 0x1D:	//老式计时表
                Jcsj->blbNum=430004001;
                break;
		default:
				return 0x11;	//卡内没有有效的数据
        }

        Jcsj->blb=Kasj[4];		//表类别
		Jcsj->yhid=0x00000000;	//用户号

        switch(Kasj[4])
        {
        case 0x1A:	//老式气表
        case 0x2A:	//带版本号的气表
		case 0x2F:	//内置式气表
        case 0x1C:	//老式水表
        case 0x2C:	//带版本号的水表
		case 0x3C:	//无线抄表的水表
        case 0x1D:	//老式计时表
                Jcsj->bnerr=Kasj[6]+Kasj[5]*256;	//表内特征码
                Jcsj->xfcs=Kasj[11];	//消费次数
				
				strznum.strzh[0]=Kasj[8];
				strznum.strzh[1]=Kasj[9];
				strznum.strzh[2]=Kasj[10];
				strznum.strzh[3]=0x00;
                Jcsj->bnye=strznum.numzh;	//表内余额
                if(Jcsj->bnerr & 1) Jcsj->bnye=-1*Jcsj->bnye;	//处理余额为0标志

				strznum.strzh[0]=Kasj[12];
				strznum.strzh[1]=Kasj[13];
				strznum.strzh[2]=Kasj[14];
				strznum.strzh[3]=0x00;
                Jcsj->bnlj=strznum.numzh;	//表内累加

				if(Kasj[4]==0x2F)	//内置式气表
				{
					Jcsj->bnbcz=Kasj[18]+Kasj[19]*256-1000;	//表内误差值
					Jcsj->jbqs=Kasj[16]+Kasj[17]*256;	//每转升数
				}
				else
				{
					Jcsj->bnbcz=0;	//表内补偿值
					Jcsj->jbqs=0;	//基表圈数
				}
				Jcsj->qdcs=0;	//返回窃电次数
				Jcsj->tzcs=0;	//机表特征常数
				break;
        case 0x1B:	//电表(新、老)
                Jcsj->bnerr=Kasj[11]+Kasj[5]*256;	//表内特征码
                Jcsj->xfcs=Kasj[16];	//消费次数

				strznum.strzh[0]=Kasj[13];
				strznum.strzh[1]=Kasj[14];
				strznum.strzh[2]=Kasj[15];
				strznum.strzh[3]=0x00;
                Jcsj->bnye=strznum.numzh;	//表内余额
                if(Jcsj->bnerr & 1) Jcsj->bnye=-1*Jcsj->bnye;	//处理余额为0标志

				strznum.strzh[0]=Kasj[17];
				strznum.strzh[1]=Kasj[18];
				strznum.strzh[2]=Kasj[19];
				strznum.strzh[3]=0x00;
                Jcsj->bnlj=strznum.numzh;	//表内累加

                Jcsj->bnbcz=0;				//表内补偿值
                Jcsj->jbqs=Kasj[8];

				strznum.strzh[0]=Kasj[7];	//常显值
				strznum.strzh[1]=Kasj[6];	
				strznum.strzh[2]=Kasj[9];	//超载常数
				strznum.strzh[3]=0x00;
                Jcsj->tzcs=strznum.numzh;   //机表特征常数
                break;
        }

        switch(Kasj[4])
        {
        case 0x2A:	//带版本号的气表
        case 0x2C:	//带版本号的水表
		case 0x3C:	//无线抄表的水表
				strznum.strzh[0]=Kasj[19];	//取表内用户号
				strznum.strzh[1]=Kasj[18];
				strznum.strzh[2]=Kasj[17];
				strznum.strzh[3]=Kasj[16];
				Jcsj->yhid=strznum.numzh;
				break;
		}        
		return 0 ;
}
							
//读检查卡
int CDeviceBase03::DKxRdjck(long * KnID,        //返回用户ID号
							long * nDrvID,      //表版本号
							struct JCCZSJ * jcsj //返回表内数据
							)
{
        BYTE zhuanzf[10];
        int errno,zhuansz;
        
        if(testview)

⌨️ 快捷键说明

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