📄 devicebase03.cpp
字号:
//清卡
for(i=0;i<50;i++) wrbuff[i]=0x00;
errno=wr_dat(1,7,wrbuff);
if (errno!=0) return errcase(errno);
//校验
errno=rd_dat(1,7,rdbuff);
if (errno!=0) return 1;
for(i=0;i<28;i++)
{
if(rdbuff[i]!=0x00) return 1;
}
return 0;
}
//制作发行卡/检测卡
int CDeviceBase03::DKxZfxk (long KnID, //用户ID号
long yhmm, //用户密码
struct FXCZSJ * fxczsj //发行卡表数据
)
{
BYTE zhuanzf[10],nCheckNum,fxmode;
int i,errno,zhuansz,fxsj[4];
if(testview)
{
char xxinfo[200];
wsprintf(xxinfo,"ID=%X\nyhmm=%ld\ndbjz=%ld\nqbjz=%ld\nsb1jz=%ld\nsb2jz=%ld\n"
,KnID,yhmm,fxczsj->dbjz,fxczsj->qbjz,fxczsj->sb1jz,fxczsj->sb2jz);
MessageBox(NULL,xxinfo,"写入数据显示窗口",0);
}
if(resrand==1)
{
resrand=0;
srand((unsigned)time(NULL));
}
//用户密码加密运算
zhuansz=m_YhmmCoding(yhmm);
zhuansz^=0xE52A7002;
zhuansz^=faxingmm;
numtostr(&zhuansz,zhuanzf);
//准备写卡数据
for(i=0;i<50;i++) wrbuff[i]=0x00;
//用随机数填充卡数据区(不含1,7区)
for(i=4;i<24;i++) wrbuff[i]=rand()%256;
fxsj[0]=fxczsj->qbjz;
fxsj[1]=fxczsj->dbjz;
fxsj[2]=fxczsj->sb1jz;
fxsj[3]=fxczsj->sb2jz;
strznum.numzh=fxczsj->fxmode;
fxmode=strznum.strzh[0];
errno=0;
for(i=0;i<4;i++)
{
if(fxsj[i]>=0)
{
if(fxsj[i]>0xFFFF) return 2;
wrbuff[i]=(fxmode==0x00) ? 0xF1 : 0xF8;
wrbuff[i*2+4]=fxsj[i]%256;
wrbuff[i*2+5]=(fxsj[i]/256)%256;
errno++;
}
}
if(errno==0) return 2; //没有表要发行
//参与用户密码计算的4字节
wrbuff[22]=zhuanzf[0];
wrbuff[19]=zhuanzf[1];
wrbuff[16]=zhuanzf[2];
wrbuff[13]=zhuanzf[3];
//用户ID号
strznum.numzh=KnID;
wrbuff[12]= strznum.strzh[3];
wrbuff[14]= strznum.strzh[2];
wrbuff[15]= strznum.strzh[1];
wrbuff[21]= strznum.strzh[0];
for(i=0;i<4;i++)
{
//对于计时表,将对应的表基值改为0x0101
if((nCurrDeviceNum[i]==430004001) && (wrbuff[i]==0xF1))
{
//月份初始化为 0年1月1日
wrbuff[i*2+4]=0x01;
wrbuff[i*2+5]=0x01;
wrbuff[20]=0;
}
}
//计算校验和
nCheckNum=0;
for(i=0;i<23;i++)
{
nCheckNum+=wrbuff[i];
}
wrbuff[23]=nCheckNum;
zhuansz=faxingmm;
numtostr(&zhuansz,zhuanzf);
for(i=0;i<4;i++) wrbuff[24+i]=zhuanzf[i];
//将空卡新制成加密卡
errno=makenewcard(wrbuff);
return errno;
}
//制做空白消费卡
int CDeviceBase03::DKxFsxk(long KnID,long yhmm)
{
BYTE zhuanzf[10];
int i,errno,zhuansz;
if(testview)
{
char xxinfo[100];
wsprintf(xxinfo,"KnID=%ld,mima=%ld",KnID,yhmm);
MessageBox( NULL,xxinfo,"写入数据显示窗口",0);
}
//准备写卡数据
wrbuff[0]=0x13;
wrbuff[1]=0x13;
wrbuff[2]=0x13;
wrbuff[3]=0x13;
for(i=4;i<50;i++) wrbuff[i]=0x00;
zhuansz=m_YhmmCoding(yhmm);
numtostr(&zhuansz,zhuanzf);
for(i=0;i<4;i++) wrbuff[24+i]=zhuanzf[i];
//将空卡新制成加密卡
errno=makenewcard(wrbuff);
return errno;
}
//制做检查卡
int CDeviceBase03::DKxZjck (long KnID)
{
BYTE zhuanzf[10];
int i,errno,zhuansz;
if(testview)
{
char xxinfo[100];
wsprintf(xxinfo,"KnID=%ld",KnID);
MessageBox( NULL,xxinfo,"写入数据显示窗口",0);
}
//准备写卡数据
wrbuff[0]=0xF4;
wrbuff[1]=0x0F;
wrbuff[2]=0x00;
wrbuff[3]=0x03;
for(i=4;i<50;i++) wrbuff[i]=0x00;
zhuansz=faxingmm;
numtostr(&zhuansz,zhuanzf);
for(i=0;i<4;i++) wrbuff[24+i]=zhuanzf[i];
//将空卡新制成加密卡
errno=makenewcard(wrbuff);
return errno;
}
//制作功能卡
int CDeviceBase03::DKxZjckEx (long KnCs)
{
BYTE zhuanzf[10];
int i,errno,zhuansz;
if(testview)
{
char xxinfo[100];
wsprintf(xxinfo,"KnCs=%4X",KnCs);
MessageBox( NULL,xxinfo,"写入数据显示窗口",0);
}
strznum.numzh=KnCs;
if((strznum.strzh[2]!=0) || (strznum.strzh[3]!=0)) return 2;
//准备数据
wrbuff[0]=0xF4;
wrbuff[1]=strznum.strzh[1];
wrbuff[2]=strznum.strzh[0];
wrbuff[3]=wrbuff[0]+wrbuff[1]+wrbuff[2];
for(i=4;i<50;i++) wrbuff[i]=0x00;
zhuansz=faxingmm;
numtostr(&zhuansz,zhuanzf);
for(i=0;i<4;i++) wrbuff[24+i]=zhuanzf[i];
//将空卡新制成加密卡
errno=makenewcard(wrbuff);
return errno;
}
//制作单显水表补偿卡
int CDeviceBase03::DKxZbck(struct CZBCSJ * buchang)
{
return 1;
/*
BYTE zhuanzf[10],CheckNum;
BYTE rdbuff[100],wrbuff[100];
int i,errno,zhuansz;
if(testview)
{
char xxinfo[100];
wsprintf(xxinfo,"buchang=%ld",buchang->bcz);
MessageBox( NULL,xxinfo,"写入数据显示窗口",0);
}
//准备写卡数据
for(i=0;i<50;i++) wrbuff[i]=0;
switch(buchang->blb)
{
case 0x1C:
wrbuff[0]=0xF5;
wrbuff[4]=0x1C;
if(buchang->bcz<-5 || buchang->bcz>5) return 2;
wrbuff[0]=0xF5;
wrbuff[4]=buchang->blb%256;
wrbuff[5]=0x0C; //加、减数标志
if (buchang->bcz<0)
wrbuff[5]=0x0A; //负偏差需每隔n个数跳一个
else if (buchang->bcz>0)
wrbuff[5]=0x0B; //正偏差需每隔n个数停一个
switch(buchang->bcz)
{
case -10:
wrbuff[6]=9;
break;
case -9:
wrbuff[6]=10;
break;
case -8:
wrbuff[6]=11;
break;
case -7:
wrbuff[6]=13;
break;
case -6:
wrbuff[6]=16;
break;
case -5:
wrbuff[6]=19;
break;
case -4:
wrbuff[6]=24;
break;
case -3:
wrbuff[6]=32;
break;
case -2:
wrbuff[6]=49;
break;
case -1:
wrbuff[6]=99;
break;
case 0:
wrbuff[6]=00;
break;
case 1:
wrbuff[6]=101;
break;
case 2:
wrbuff[6]=51;
break;
case 3:
wrbuff[6]=34;
break;
case 4:
wrbuff[6]=26;
break;
case 5:
wrbuff[6]=21;
break;
case 6:
wrbuff[6]=18;
break;
case 7:
wrbuff[6]=15;
break;
case 8:
wrbuff[6]=14;
break;
case 9:
wrbuff[6]=12;
break;
case 10:
wrbuff[6]=11;
break;
default:
wrbuff[6]=255;
break;
}
if (wrbuff[5]==0x0C) //无需补偿
wrbuff[6]=20;
break;
}
CheckNum=0x00;
for (i=0;i<15;i++) CheckNum+=wrbuff[i];
wrbuff[15]=CheckNum;
zhuansz=faxingmm;
numtostr(&zhuansz,zhuanzf);
for(i=0;i<4;i++) wrbuff[24+i]=zhuanzf[i];
//将空卡新制成加密卡
errno=makenewcard(wrbuff);
return errno;
*/
}
//制作电表校验卡
int CDeviceBase03::DKxZjyk(struct CZJYSJ * jysj)
{
BYTE zhuanzf[10],nCheckNum;
int i,errno,zhuansz;
if(jysj->blb!=0x1B) return 2; //表标志不符
if(jysj->fzcs<0 || (jysj->fzcs%256)>=60) return 2; //超载常数
if(jysj->jbqs<=0 || jysj->jbqs>255) return 2; //基表常数
if(jysj->jysl<0 || jysj->jysl>0xffffff) return 2; //校检数量
if(jysj->xscs<0 || jysj->xscs>65535) return 2; //常显数量
//准备数据
for(i=0;i<50;i++) wrbuff[i]=0;
wrbuff[0]=0xF6;
wrbuff[4]=0x1B;
strznum.numzh=jysj->xscs;
wrbuff[5]=strznum.strzh[1];
wrbuff[6]=strznum.strzh[0];
strznum.numzh=jysj->jbqs;
wrbuff[7]=strznum.strzh[0];
strznum.numzh=jysj->fzcs;
wrbuff[8]=strznum.strzh[0];
if(strznum.strzh[1]) wrbuff[10]=0x10; //10度报警关阀标志
wrbuff[11]=0x30;
strznum.numzh=jysj->jysl;
wrbuff[12]=strznum.strzh[0];
wrbuff[13]=strznum.strzh[1];
wrbuff[14]=strznum.strzh[2];
zhuansz=faxingmm;
numtostr(&zhuansz,zhuanzf);
for(i=0;i<4;i++) wrbuff[24+i]=zhuanzf[i];
//计算校验和
nCheckNum=0;
for(i=0;i<15;i++) nCheckNum+=wrbuff[i];
wrbuff[15]=nCheckNum;
//将空卡新制成加密卡
errno=makenewcard(wrbuff);
return errno;
}
//读电表校验卡
int CDeviceBase03::DKxRdjyk(struct CZJYSJ * jysj)
{
BYTE zhuanzf[10],nCheckNum;
int i,errno,zhuansz;
//设置为加密方式
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); //卡未加密
//检查校验和
nCheckNum=0;
for(i=0;i<15;i++) nCheckNum+=rdbuff[i];
if(rdbuff[15]!=nCheckNum) return(0x11); //卡内没有有效的数据
jysj->jbqs=rdbuff[7];
jysj->fzcs=rdbuff[8];
jysj->xscs=rdbuff[6]+rdbuff[5]*256;
jysj->jysl=rdbuff[12]+rdbuff[13]*256;
strznum.strzh[0]=rdbuff[4]; //表类别
strznum.strzh[1]=rdbuff[10]; //10度报警关阀标志
strznum.strzh[2]=rdbuff[14]; //校验控制
strznum.strzh[3]=0x00;
jysj->blb=strznum.numzh;
return 0;
}
//清发行卡
int CDeviceBase03::DClear_fx()
{
BYTE zhuanzf[10];
int zhuansz;
zhuansz=faxingmm;
numtostr(&zhuansz,zhuanzf);
//将加密卡清空
return(clearjmcard(zhuanzf));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -