📄 devicebase03.cpp
字号:
}
//清检查卡
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 + -