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

📄 ko.dpr

📁 预付费表读卡写卡程序 使用明华的读卡器
💻 DPR
📖 第 1 页 / 共 4 页
字号:
          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 + -