📄 ko.dpr
字号:
result:=st1;
exit;
end;
end
else
begin
result:=st;
exit;
end;
end;
//检测卡类型 AHandle:串口句柄 readstr:返回卡中数据(sharemem) card_id:返回命令码(卡类型)
function Check_Card(AHandle:THandle;var readstr:string;var card_id:integer):longint;stdcall;
var
hexstr_card:string;
bz:longint;
begin
readstr:='';
bz:=read_card_all(AHandle,hexstr_card);
if bz=0 then
begin
result:=0;
readstr:=hexstr_card;
card_id:=strtoint('$'+copy(READSTR,131,2));//先取返写区的命令码
if card_id=255 then card_id:=strtoint('$'+copy(hexstr_card,19,2));//如果返写区命令码=FF,就取购电区的命令码
end
else
begin
result:=bz;
exit;
end;
end;
//mima,hexstr:十六进制字符串 函数返回十六进制字符串
function data_encrypt(mima,hexstr:string):string;
var
temp1,temp2:string;db:ARRAY of byte;
k1,k2,len1,len2,i:integer;
begin
temp1:=mima;
len1:=length(temp1) div 2;//密码长度的一半
temp2:=hexstr;
len2:=length(temp2) div 2;//需要加密的字符串长度的一半
k1:=0;
k2:=0;
for I := 1 to len1 do
k1:=k1+strtoint('$'+copy(temp1,2*i-1,2));
for I := 1 to len1*2 do
k2:=k2+strtoint('$'+temp1[i]);
k1:=k1 mod 256;//加密因子1:各字节相加不计溢出部分
k2:=k2 mod 256;//加密因子2:各字节高低位相加不计溢出部分
setlength(db,len2); // 第一层加密:加密因子1异或要加密的十六进制字符串
for I := 1 to len2 do
db[i-1]:=k1 xor strtoint('$'+copy(temp2,2*i-1,2)); // 第二层加密:加密因子2异或要加密的十六进制字符串
for I := 1 to len2 do
db[i-1]:=k2 xor db[i-1];
result:='';
for I := 1 to len2 do
result:=result+inttohex(db[i-1],2);
end;
//mima,hexstr:十六进制字符串 函数返回十六进制字符串
function data_decrypt(mima,hexstr:string):string;
var
temp1,temp2:string;
db:ARRAY of byte;
k1,k2,len1,len2,i:integer;
begin
temp1:=mima;
len1:=length(temp1) div 2;
temp2:=hexstr;
len2:=length(temp2) div 2;
k1:=0;
k2:=0;
for I := 1 to len1 do // Iterate
k1:=k1+strtoint('$'+copy(temp1,2*i-1,2));
for I := 1 to len1*2 do // Iterate
k2:=k2+strtoint('$'+temp1[i]);
k1:=k1 mod 256;//加密因子1:各字节相加不计溢出部分
k2:=k2 mod 256;//加密因子2:各字节高低位相加不计溢出部分
setlength(db,len2);
// 第一层解密:加密因子1异或加密的十六进制字符串
for I := 1 to len2 do // Iterate
db[i-1]:=k2 xor strtoint('$'+copy(temp2,2*i-1,2));
// 第二层解密:加密因子2异或加密的十六进制字符串
for I := 1 to len2 do // Iterate
db[i-1]:=k1 xor db[i-1];
result:='';
for I := 1 to len2 do
result:=result+inttohex(db[i-1],2);
end;
//*************************清卡*************************************8
function Clear_Card(AHandle :THandle):LongInt; stdcall;
var
temp:string;
hexdata:array[0..127] of char;
I,OFFSET,k:INTEGER;
st1:smallint;
begin
TEMP:='';
hexdata:='';
for I := 1 to 256 do TEMP:=TEMP+'F';
offset:=0;
k:=128;
st1:=asc_hex(pchar(temp),hexdata,k);
if st1=0 then result:=swr_24c01a(AHandle,offset,k,hexdata)
else
begin
result:=st1;
exit;
end;
end;
//***********************读卡操作*****************************************
{function Read_Card(AHandle :THandle; APort :LongInt; AReadCardData :PReadCardData) :LongInt; stdcall;
var
bz:longint;
temp,temp1,readstr,temp_readstr,password_old,password_new,
goudianqu,fanxiequ,tempstr:string;
card_id,temp_card_id,i:integer;
ckflag:smallint;
dllname:string;
hdll:THANDLE;
rd: TRd_Card;
retval:integer;
begin
icdev:=auto_init(APort-1,9600); //串口不判断是否成功打开,反正下面读卡时有错误标识符返回
if icdev<0 then
begin
result:=-301;
exit;
end;
//******加检测卡函数*************
ckflag:=chk_card(icdev);
if ckflag=1 then
begin
try
//*************************
bz:=check_card(icdev,temp_readstr,temp_card_id); //temp_readstr为卡中所有数据未解密,检测卡
if bz<>0 then //如果检测卡失败
begin
result:=bz; //函数返回检测卡结果,见函数check_card
exit; //退出程序
end;
if bz=0 then //如果检测卡成功
begin
result:=0; //函数返回为0
readstr:=temp_readstr; //readstr为卡中所有数据(未解密)
AReadCardData^.Work_ID :=7; //厂商代码,我公司为"7"
AReadCardData^.Prog_ID :=78; //取DTSY2078最后1位"78"
//AReadCardData^.ReadStr:=temp_readstr; //卡中所有数据(未解密)
//AReadCardData^.ReadStred:=temp_readstr; //卡中所有数据(解密)
goudianqu:=copy(temp_readstr,1,128); //购电区所有数据
fanxiequ:=copy(temp_readstr,129,128); //返写区所有数据
card_id:=temp_card_id; //卡类型(命令码)
case card_id of
1:begin //开户卡
password_old:=copy(goudianqu,1,8); //原密码
password_new:=copy(goudianqu,9,8); //新密码
temp:=data_decrypt(password_new,copy(goudianqu,23,92)); //解密数据域
readstr:=copy(goudianqu,1,22)+temp+copy(goudianqu,115,4)
+copy(goudianqu,119,10)+fanxiequ; //解密后卡中所有数据
//AReadCardData^.ReadStred :=readstr; //解密后卡中所有数据
//*******************以下为标准数据项************************
if card_id=1 then AReadCardData^.Card_ID :=2;
if card_id=4 then AReadCardData^.Card_ID :=8;
if card_id=11 then AReadCardData^.Card_ID :=12; //卡型代码(最大2位十进制数字)
AReadCardData^.CBFlag :=false; //插表标识,未插表
tempstr:=copy(temp,83,10);
tempstr:='00'+rightstr('0000000000'+tempstr,10);
for I := 0 to 11 do AReadCardData^.User_ID[i]:=tempstr[i+1]; //用户号(最大12位十进制数字) 事实上卡欧表只用10位,取后面10位
AReadCardData^.User_ID[12]:=#0;
tempstr:=copy(temp,1,10);
//tempstr:=rightstr('000000000000'+tempstr,12);
for I := 0 to 9 do AReadCardData^.Comm_ID[i]:=tempstr[i+1]; //通讯号(最大12位十进制数字) 事实上卡欧表只用10位,取前面10位
AReadCardData^.Comm_ID [10]:=#0;
AReadCardData^.Comm_ID [11]:=#0;
AReadCardData^.Comm_ID [12]:=#0;
AReadCardData^.Meter_Const :=strtoint(copy(temp,17,6)); //表常数
AReadCardData^.WarnDL1 :=strtoint(copy(temp,11,6)); //报警电量
AReadCardData^.Max_HoardDL :=strtoint(copy(temp,35,6)); //囤积门限
AReadCardData^.Max_OverDL :=strtoint(copy(temp,29,6)); //赊欠门限
AReadCardData^.Max_Load :=strtoint(copy(temp,23,6)); //最大负荷(千瓦)
AReadCardData^.SaleDL :=strtoint(copy(temp,47,6)); //购电量
//AReadCardData^.Sale_Num :=strtoint(copy(temp,53,4)); //购电次数
AReadCardData^.Sale_Num_M :=strtoint(copy(temp,53,4));
AReadCardData^.OverZeroDL_M :=strtoint(copy(temp,75,6)); //过零电量
AReadCardData^.RemainDL_M :=strtoint(copy(temp,57,6)); //剩余电量
AReadCardData^.Power_Z_M :=strtoint(copy(temp,69,6)); //总用电量(累计用电量)
//************以下为扩展部分*********************************
if copy(temp,41,2)='11' then AReadCardData^.TZ_State:=true
else AReadCardData^.TZ_State:=false; //跳闸状态字 00:允许跳闸 11:禁止跳闸
AReadCardData^.CX_State:=true; //常显状态字 00:常显 11:不常显
if copy(temp,45,2)='11' then AReadCardData^.SQ_State:=true
else AReadCardData^.SQ_State:=false; //赊欠状态字 00:允许赊欠 11:禁止赊欠
//AReadCardData^.Acc_Salepower :=strtoint(copy(temp,63,6)); //累计购电量
exit;
end;
2:begin //售电卡(电量有效)
password_old:=copy(goudianqu,1,8); //原密码
password_new:=copy(goudianqu,9,8); //新密码
temp:=data_decrypt(password_new,copy(goudianqu,23,30)); //解密数据域
readstr:=copy(goudianqu,1,22)+temp+copy(readstr,53,4)
+copy(goudianqu,57,72)+fanxiequ; //解密后卡中所有数据
//AReadCardData^.ReadStred :=readstr; //解密后卡中所有数据
//*******************以下为标准数据项************************
if card_id=2 then AReadCardData^.Card_ID :=5;
if card_id=6 then AReadCardData^.Card_ID :=4;
if card_id=12 then AReadCardData^.Card_ID :=4; //卡型代码(最大2位十进制数字)
AReadCardData^.CBFlag :=false; //插表标识,未插表
tempstr:=copy(TEMP,21,10);
tempstr:='00'+rightstr('0000000000'+tempstr,10);
for I := 0 to 11 do AReadCardData^.User_ID[i]:=tempstr[i+1]; //用户号(最大12位十进制数字)
AReadCardData^.User_ID[12]:=#0;
tempstr:=copy(temp,1,10);
//tempstr:=rightstr('000000000000'+tempstr,12);
for I := 0 to 9 do AReadCardData^.Comm_ID[i]:=tempstr[i+1]; //通讯号(最大12位十进制数字)
AReadCardData^.Comm_ID [10]:=#0;
AReadCardData^.Comm_ID [11]:=#0;
AReadCardData^.Comm_ID [12]:=#0;
AReadCardData^.SaleDL :=strtoint(copy(temp,11,6)); //购电量
//AReadCardData^.Sale_Num :=strtoint(copy(temp,17,4)); //购电次数
AReadCardData^.Sale_Num_M :=strtoint(copy(temp,17,4));
exit;
end;
129:begin //售电返写卡
password_old:=copy(goudianqu,1,8); //原密码
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -