unit u_datamodule;

interface

uses
  SysUtils, Classes, DB, DBClient, ScktComp;

type
  Tfrmdm = class(TDataModule)
    cdsRfid: TClientDataSet;
    cdsPublic: TClientDataSet;
    clntsckt: TClientSocket;
  private
    { Private declarations }
  public
    { Public declarations }

    //豸
    function LoadDevice(addr:string;port:Integer):Boolean;

    //ر豸
    function CloseDevice:Boolean;

    //ͣǩ
    function StopReadingTag_Net(ReaderAddr:Byte):Boolean;

    //ȡǩ
    function ReadTag_Net(memBank:Byte;address:Byte;Length:Byte;var Data:string;ReaderAddr:Byte):Boolean;

    //дǩ
    function FastWriteTagID_Net(content:string;ReaderAddr:Byte):Boolean;

    //÷
    function SetLoginPassWord_Net(PassWord:String;ReaderAddr:Byte):Boolean;

    //
    function SetKillPassWord_Net(PassWord:String;ReaderAddr:Byte):Boolean;

    //ǩ
    function LockPassWordTag_Net(Password:string;LockType:Byte;ReaderAddr:Byte):Boolean;

    //ǩ
    function UnLockPassWordTag_Net(PassWord:string;LockType:Byte;ReaderAddr:Byte):Boolean;

  end;

var
  frmdm: Tfrmdm;

implementation

uses u_public;

{$R *.dfm}

//豸
function Tfrmdm.LoadDevice(addr:string;port:Integer):Boolean;
begin
   clntsckt.Active:=False;
   clntsckt.Host:=addr;
   clntsckt.Address:=addr;
   clntsckt.Port:=port;
   clntsckt.Active:=True;
   if clntsckt.Socket.Connected then
      Result:=True
   else
      Result:=False;
end;


//ر豸
function Tfrmdm.CloseDevice:Boolean;
begin
   clntsckt.Close;
   if not clntsckt.Socket.Connected then
      Result:=True
   else
      Result:=False;
end;


//ͣǩ
function Tfrmdm.StopReadingTag_Net(ReaderAddr:Byte):Boolean;
var buf:array[0..5] of Byte;
    cmdbuf:array[0..4] of Byte;
    chksum:Byte;
begin
   try
      Result:=False;
      FillChar(buf,SizeOf(buf),0);
      if clntsckt.Socket.Connected then
      begin
         cmdbuf[0]:=$A0;
         cmdbuf[1]:=$03;
         cmdbuf[2]:=$A8;
         cmdbuf[3]:=ReaderAddr;
         cmdbuf[4]:=CheckSum(cmdbuf,4);

         clntsckt.Socket.SendBuf(cmdbuf[0],SizeOf(cmdbuf));

         Sleep(300);

         if clntsckt.Socket.ReceiveBuf(buf,SizeOf(buf))=SizeOf(buf) then
         begin
            chksum:=0;
            chksum:=CheckSum(buf,5);
            if (buf[0]=$E0) and (buf[1]=$04) and (buf[2]=$A8) and  (buf[3]=ReaderAddr) and (buf[4]=$00) and (buf[5]=CheckSum(buf,5)) then
               Result:=True;
         end else
         begin
            Result:=False;
         end;
      end;
   finally
      //CloseDevice;
   end;
   
end;


function Tfrmdm.ReadTag_Net(memBank:Byte;address:Byte;Length:Byte;var Data:string;ReaderAddr:Byte):Boolean;
var cmdbuf:array[0..7] of Byte;
    revLen:Integer;
    bufrev:array[0..15] of Byte;
    i:Integer;
    retstring:string;
begin
    cmdbuf[0]:=$A0;
    cmdbuf[1]:=$06;
    cmdbuf[2]:=$80;
    cmdbuf[3]:=ReaderAddr;
    cmdbuf[4]:=memBank;
    cmdbuf[5]:=address;
    cmdbuf[6]:=Length;
    cmdbuf[7]:=CheckSum(cmdbuf,7);

    Result:=False;
    if clntsckt.Socket.Connected then
    begin
       clntsckt.Socket.SendBuf(cmdbuf[0],SizeOf(cmdbuf));
       Sleep(100);
       revLen:=Length*2+8;
       FillChar(bufrev,sizeof(bufrev),0);
       if clntsckt.Socket.ReceiveBuf(bufrev,revLen)=revLen then
       begin
          if (bufrev[0]=$E0) and (bufrev[2]=$80)  and
          (bufrev[revLen-1]=CheckSum(bufrev,revLen-1)) then
          begin
             data:='';
             retstring:='';
             for I := 7 to revLen-2 do
             begin
                 data:=data+inttohex(bufrev[i],2);
             end;
             Result:=True;
          end;
       end;
    end;
end;


function Tfrmdm.FastWriteTagID_Net(content:string;ReaderAddr:Byte):Boolean;
var cmdbuf:array of Byte;
    sCmd:string;
    recData:array [0..5] of Byte;
    cntbuf:TByteArr;
    i:Integer;
begin
    cntbuf:=GetHexByteArr(content);
    SetLength(cmdbuf,High(cntbuf)+7);
    cmdbuf[0]:=$A0;
    cmdbuf[1]:=Byte(High(cntbuf)+5);
    cmdbuf[2]:=$9C;
    cmdbuf[3]:=ReaderAddr;


    cmdbuf[4]:=Byte((high(cntbuf)+1) div 2);

    for i := 5 to  (high(cntbuf)+7)-2 do
    begin
        cmdbuf[i]:=cntbuf[i-4];
    end;

    cmdbuf[(high(cntbuf)+7)-1]:=CheckSum(cmdbuf,(High(cntbuf)+7)-1);

    sCmd:=GetHexString(cmdbuf);
      
    Result:=False;
    if clntsckt.Socket.Connected then
    begin
       clntsckt.Socket.SendBuf(cmdbuf[0],Length(cmdbuf));
       Sleep(300);
       if clntsckt.Socket.ReceiveBuf(recData,SizeOf(recdata))=SizeOf(recdata) then
       begin
          if (recData[0]=$E0) and (recData[1]=$04) and (recData[2]=$9C) and (recData[3]=ReaderAddr) and (recData[4]=$00) and
          (recData[5]=CheckSum(recData,5)) then
             Result:=True;
       end;
    end;
end;


function Tfrmdm.SetLoginPassWord_Net(PassWord:String;Readeraddr:Byte):Boolean;
var cmdbuf:array[0..12] of Byte;
    buf:array[0..5] of Byte;
    pwdbuf:TByteArr;
begin
    //scmd:='A00B810401000202'+StringToHex(PassWord);
    pwdbuf:=GetHexByteArr(PassWord);
    cmdbuf[0]:=$A0;
    cmdbuf[1]:=$0B;
    cmdbuf[2]:=$81;
    cmdbuf[3]:=ReaderAddr;
    cmdbuf[4]:=$01;
    cmdbuf[5]:=$00;
    cmdbuf[6]:=$02;
    cmdbuf[7]:=$02;
    cmdbuf[8]:=pwdbuf[0];
    cmdbuf[9]:=pwdbuf[1];
    cmdbuf[10]:=pwdbuf[2];
    cmdbuf[11]:=pwdbuf[3];
    cmdbuf[12]:=CheckSum(cmdbuf,12);

    Result:=False;
    if clntsckt.Socket.Connected then
    begin
       //cmdbuf:=FormatCommand(scmd);
       clntsckt.Socket.SendBuf(cmdbuf[0],SizeOf(cmdbuf));
       Sleep(300);
       FillChar(buf,SizeOf(buf),0);
       if clntsckt.Socket.ReceiveBuf(buf,SizeOf(buf))=SizeOf(buf) then
       begin
          if (buf[0]=$E0) and (buf[1]=$04) and (buf[2]=$81) and (buf[3]=ReaderAddr) and (buf[4]=$00) and
          (buf[5]=CheckSum(buf,5)) then
             Result:=True;
       end;
    end;
end;


function Tfrmdm.SetKillPassWord_Net(PassWord:String;ReaderAddr:Byte):Boolean;
var cmdbuf:array[0..12] of Byte;
    buf:array[0..5] of Byte;
    pwdbuf:TByteArr;

begin
    //scmd:='A00B810401000102'+StringToHex(PassWord);
    pwdbuf:=GetHexByteArr(PassWord);
    cmdbuf[0]:=$A0;
    cmdbuf[1]:=$0B;
    cmdbuf[2]:=$81;
    cmdbuf[3]:=ReaderAddr;
    cmdbuf[4]:=$01;
    cmdbuf[5]:=$00;
    cmdbuf[6]:=$01;
    cmdbuf[7]:=$02;
    cmdbuf[8]:=pwdbuf[0];
    cmdbuf[9]:=pwdbuf[1];
    cmdbuf[10]:=pwdbuf[2];
    cmdbuf[11]:=pwdbuf[3];
    cmdbuf[12]:=CheckSum(cmdbuf,12);

    Result:=False;
    if clntsckt.Socket.Connected then
    begin
       //cmdbuf:=FormatCommand(scmd);
       clntsckt.Socket.SendBuf(cmdbuf[0],SizeOf(cmdbuf));
       Sleep(300);
       if clntsckt.Socket.ReceiveBuf(buf,SizeOf(buf))=SizeOf(buf) then
       begin
          if (buf[0]=$E0) and (buf[1]=$04) and (buf[2]=$81) and (buf[3]=ReaderAddr) and (buf[4]=$00) and
          (buf[5]=CheckSum(buf,5)) then
             Result:=True;
       end;
    end;
end;

function Tfrmdm.LockPassWordTag_Net(Password:string;LockType:Byte;ReaderAddr:Byte):Boolean;
var cmdbuf:array[0..9] of Byte;
    pwdBuf:TByteArr;
    buf:array[0..5] of Byte;
begin
    //scmd:='A007A5'+StringToHex(Password)+inttohex(LockType,2);
    pwdBuf:=GetHexByteArr(Password);
    cmdbuf[0]:=$A0;
    cmdbuf[1]:=$08;
    cmdbuf[2]:=$A5;
    cmdbuf[3]:=ReaderAddr;
    cmdbuf[4]:=pwdbuf[0];
    cmdbuf[5]:=pwdbuf[1];
    cmdbuf[6]:=pwdbuf[2];
    cmdbuf[7]:=pwdbuf[3];
    cmdbuf[8]:=LockType;
    cmdbuf[9]:=CheckSum(cmdbuf,9);

    Result:=False;
    if clntsckt.Socket.Connected then
    begin
       //cmdbuf:=FormatCommand(scmd);
       clntsckt.Socket.SendBuf(cmdbuf[0],SizeOf(cmdbuf));
       Sleep(300);
       if clntsckt.Socket.ReceiveBuf(buf,SizeOf(buf))=SizeOf(buf) then
       begin
          if (buf[0]=$E4) and (buf[1]=$03) and (buf[2]=$A5) and (buf[3]=ReaderAddr) and (buf[4]=$00) and
          (buf[5]=CheckSum(buf,5)) then
             Result:=True;
       end;
    end;
end;


function Tfrmdm.UnLockPassWordTag_Net(PassWord:string;LockType:Byte;ReaderAddr:Byte):Boolean;
var cmdbuf:array[0..9] of Byte;
    scmd:string;
    buf:array[0..5] of Byte;
    bufpwd:TByteArr;
begin
    scmd:='A007A6'+Password+inttohex(LockType,2);

    bufpwd:=GetHexByteArr(Password);

    cmdbuf[0]:=$A0;
    cmdbuf[1]:=$08;
    cmdbuf[2]:=$A6;
    cmdbuf[3]:=ReaderAddr;
    cmdbuf[4]:=bufpwd[0];
    cmdbuf[5]:=bufpwd[1];
    cmdbuf[6]:=bufpwd[2];
    cmdbuf[7]:=bufpwd[3];
    cmdbuf[8]:=LockType;
    cmdbuf[9]:=CheckSum(cmdbuf,9);

    Result:=False;
    if clntsckt.Socket.Connected then
    begin
       //cmdbuf:=FormatCommand(scmd);
       clntsckt.Socket.SendBuf(cmdbuf[0],SizeOf(cmdbuf));
       Sleep(300);
       if clntsckt.Socket.ReceiveBuf(buf,SizeOf(buf))=SizeOf(buf) then
       begin
          if (buf[0]=$E4) and (buf[1]=$04) and (buf[2]=$A6) and (buf[3]=ReaderAddr) and (buf[4]=$00) and
          (buf[5]=CheckSum(buf,5)) then
             Result:=True;
       end;
    end;
end;






end.