unit socketcomm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Sockets, StdCtrls, ExtCtrls,strutils, ScktComp; type TIPsend = class(TForm) Button1: TButton; ClientSocket1: TTcpClient; GroupBox1: TGroupBox; Command: TEdit; RangeType: TEdit; Reference: TEdit; Date: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Time: TEdit; Label5: TLabel; ServerIP: TEdit; Label6: TLabel; Port: TEdit; Label7: TLabel; GroupBox2: TGroupBox; Label8: TLabel; noofbytes: TLabel; Edit1: TEdit; Label9: TLabel; Timer1: TTimer; GroupBox3: TGroupBox; Label10: TLabel; strlist: TMemo; Edit2: TEdit; edListeningPort: TEdit; lblListeningPort: TLabel; btnStartListening: TButton; GroupBox4: TGroupBox; cbRangeOk: TCheckBox; edPrice1: TEdit; edBalls1: TEdit; edPrice2: TEdit; edBalls2: TEdit; edPrice3: TEdit; edBalls3: TEdit; lblPrice1: TLabel; lblBalls1: TLabel; lblPrice2: TLabel; lblBalls2: TLabel; lblPrice3: TLabel; lblBalls3: TLabel; edError: TEdit; lblError: TLabel; btnSendResponse: TButton; edResponse: TEdit; lblResponse: TLabel; edLen: TEdit; timerTimeout: TTimer; TcpServer1: TTcpServer; lblCardBalance: TLabel; edCardbalance: TEdit; lblCustomerName: TLabel; edCustomerName: TEdit; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Edit1Change(Sender: TObject); procedure CommandChange(Sender: TObject); procedure RangeTypeChange(Sender: TObject); procedure ReferenceChange(Sender: TObject); procedure DateChange(Sender: TObject); procedure TimeChange(Sender: TObject); procedure refreshmessage; function sendinput(id : string; RangeType : string) : integer; function sendvendstatus(id : string; RangeType : string) : integer; function sendcardvendstatus(id : string; RangeType : string; IssueGroup : Integer) : integer; procedure ClientSocket1Receive(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer); procedure ClientSocket1Send(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer); procedure cbRangeOkClick(Sender: TObject); procedure edPrice1Change(Sender: TObject); procedure edBalls1Change(Sender: TObject); procedure edPrice2Change(Sender: TObject); procedure edBalls2Change(Sender: TObject); procedure edPrice3Change(Sender: TObject); procedure edBalls3Change(Sender: TObject); procedure btnSendResponseClick(Sender: TObject); procedure timerTimeoutTimer(Sender: TObject); procedure btnStartListeningClick(Sender: TObject); procedure TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient); procedure edCardbalanceChange(Sender: TObject); procedure edCustomerNameChange(Sender: TObject); private intmessagelength : smallint; messagestring : string; text ,decimalmarker: string; timeoutIsRunning : boolean; procedure updateResponse(); public localport : integer; remoteserver,remoteport, CustomerName : string; IPerror, instring : string; RangeOK,number1,number2,number3,number4 : integer; CardBalance, Price1, Price2, Price3, Price4, topup1, topup2, topup3, topup4, topup5 : double; transdate, transtime : string; end; var IPsend: TIPsend; implementation {$R *.dfm} procedure TIPsend.btnSendResponseClick(Sender: TObject); var dummy : string; begin ClientSocket1.RemotePort := port.Text; //local TCP/IP address of the server ClientSocket1.RemoteHost := ServerIp.Text; ClientSocket1.Active := true; if ClientSocket1.Active then begin //showmessage(edit1.text); ClientSocket1.Sendln(edResponse.Text); end; //ClientSocket1.Disconnect; RangeOK := -1; timerTimeout.Enabled := true; while (RangeOk = -1) AND (timerTimeout.Enabled = true) do begin dummy := clientsocket1.Receiveln(); application.processMessages; end; timerTimeout.Enabled := false; clientsocket1.Disconnect; end; procedure TIPsend.btnStartListeningClick(Sender: TObject); begin Tcpserver1.LocalPort := edlisteningPort.Text; Tcpserver1.Active := true; end; procedure TIPsend.Button1Click(Sender: TObject); var dummy : string; begin ClientSocket1.RemotePort := port.Text; //local TCP/IP address of the server ClientSocket1.RemoteHost := ServerIp.Text; ClientSocket1.Active := true; if ClientSocket1.Active then begin //showmessage(edit1.text); ClientSocket1.Sendln(messagestring); end; //ClientSocket1.Disconnect; RangeOK := -1; while RangeOk = -1 do begin dummy := clientsocket1.Receiveln(); end; clientsocket1.Disconnect; end; procedure TIPsend.cbRangeOkClick(Sender: TObject); begin if cbRangeOk.Checked then begin lblError.Enabled := false; edError.Enabled := false; end else begin lblError.Enabled := true; edError.Enabled := true; end; updateResponse; end; procedure TIPsend.ClientSocket1Receive(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer); var i : integer; messagelen : integer; keypairs : Tstringlist; tempstring : string; begin for i := 0 to datalen do begin if ord(buf[i]) > 31 then tempstring :=tempstring + buf[i] else tempstring := tempstring + inttostr(ord(buf[i])); end; messagelen := ord(buf[1]) - datalen; //showmessage(inttostr(messagelen)); keypairs.clear; Number1 := 0; Number2 := 0; Number3 := 0; Number4 := 0; Price1 := 0; Price2 := 0; Price3 := 0; Price4 := 0; Topup1 := 0; Topup2 := 0; Topup3 := 0; Topup4 := 0; Topup5 := 0; edit2.text := inttostr(messagelen); application.processmessages; tempstring := StringReplace(tempstring, '%2E', decimalseparator, [rfReplaceAll, rfIgnoreCase]); tempstring := StringReplace(tempstring, '%A0', decimalseparator, [rfReplaceAll, rfIgnoreCase]); //showmessage(tempstring); keypairs := Tstringlist.Create; keypairs.Delimiter := '&'; keypairs.DelimitedText := copy(tempstring,5,datalen-4); strlist.Lines := keypairs; //showmessage(copy(tempstring,5,datalen-4)); if keypairs.ValueFromIndex[0] <> '' then RangeOk :=strtoint(keypairs.ValueFromIndex[0]); if keypairs.Values['RangeOK'] <>'' then RangeOk :=strtoint(keypairs.Values['RangeOK']); if keypairs.Values['Error'] <>'' then IPerror :=keypairs.Values['Error']; if keypairs.Values['CardBalance'] <>'' then begin keypairs.Values['Cardbalance'] := StringReplace(keypairs.Values['Cardbalance'], '%2D', '-', [rfReplaceAll,rfIgnoreCase]); Cardbalance := strtofloat(StringReplace(keypairs.Values['Cardbalance'], '%2C', '', [rfReplaceAll,rfIgnoreCase])); end; if keypairs.Values['Number1'] <>'' then Number1 :=strtoint(keypairs.Values['Number1']); if keypairs.Values['Number2'] <>'' then Number2 :=strtoint(keypairs.Values['Number2']); if keypairs.Values['Number3'] <>'' then Number3 :=strtoint(keypairs.Values['Number3']); if keypairs.Values['Number4'] <>'' then Number4 :=strtoint(keypairs.Values['Number4']); if keypairs.Values['Topup1'] <>'' then Topup1 :=strtofloat(StringReplace(keypairs.Values['Topup1'], '%2C', '', [rfReplaceAll,rfIgnoreCase])); if keypairs.Values['Topup2'] <>'' then Topup2 :=strtofloat(StringReplace(keypairs.Values['Topup2'], '%2C', '', [rfReplaceAll,rfIgnoreCase])); if keypairs.Values['Topup3'] <>'' then Topup3 :=strtofloat(StringReplace(keypairs.Values['Topup3'], '%2C', '', [rfReplaceAll,rfIgnoreCase])); if keypairs.Values['Topup4'] <>'' then Topup4 :=strtofloat(StringReplace(keypairs.Values['Topup4'], '%2C', '', [rfReplaceAll,rfIgnoreCase])); if keypairs.Values['Topup5'] <>'' then Topup5 :=strtofloat(StringReplace(keypairs.Values['Topup5'], '%2C', '', [rfReplaceAll,rfIgnoreCase])); if keypairs.Values['Price1'] <>'' then Price1 := strtofloat(StringReplace(keypairs.Values['Price1'], '%2C', '', [rfReplaceAll,rfIgnoreCase])); if keypairs.Values['Price2'] <>'' then Price2 := strtofloat(StringReplace(keypairs.Values['Price2'], '%2C', '', [rfReplaceAll,rfIgnoreCase])); if keypairs.Values['Price3'] <>'' then Price3 := Strtofloat(stringreplace(keypairs.Values['Price3'], '%2C', '', [rfReplaceAll,rfIgnoreCase])); if keypairs.Values['Price4'] <>'' then Price4 := strtofloat(stringreplace(keypairs.Values['Price4'], '%2C', '', [rfReplaceAll,rfIgnoreCase])); if keypairs.Values['CustomerName'] <>'' then begin CustomerName :=keypairs.Values['CustomerName']; CustomerName :=StringReplace(CustomerName, '%2F', ' ', [rfReplaceAll, rfIgnoreCase]); end; showmessage('Data received!'); end; procedure TIPsend.ClientSocket1Send(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer); begin //showmessage('connected'); end; procedure TIPsend.CommandChange(Sender: TObject); begin refreshmessage; end; procedure TIPsend.DateChange(Sender: TObject); begin refreshmessage; end; procedure TIPsend.edBalls1Change(Sender: TObject); begin updateResponse; end; procedure TIPsend.edBalls2Change(Sender: TObject); begin updateResponse; end; procedure TIPsend.edBalls3Change(Sender: TObject); begin updateResponse; end; procedure TIPsend.edCardbalanceChange(Sender: TObject); begin updateResponse; end; procedure TIPsend.edCustomerNameChange(Sender: TObject); begin updateResponse; end; procedure TIPsend.Edit1Change(Sender: TObject); begin noofbytes.Caption := inttostr(length(edit1.Text)) + ' bytes'; end; procedure TIPsend.edPrice1Change(Sender: TObject); begin updateResponse; end; procedure TIPsend.edPrice2Change(Sender: TObject); begin updateResponse; end; procedure TIPsend.edPrice3Change(Sender: TObject); begin updateResponse; end; procedure TIPsend.updateResponse(); var sendString : ansistring; responseLength : integer; begin if cbRangeOk.Checked then begin sendString := '0X04RangeOk=1&'; if edCardBalance.Text <> '' then begin sendString := sendString+'CardBalance='+edCardBalance.text+'&'; end; if edCustomerName.Text <> '' then begin sendString := sendString+'CustomerName='+edCustomerName.text+'&'; end; if edPrice1.Text <> '' then begin sendString := sendString+'Price1='+edPrice1.Text+'&Number1='+ edBalls1.Text+'&'; if edPrice2.Text <> '' then begin sendString := sendString+'Price2='+edPrice2.Text+'&Number2='+ edBalls2.Text+'&'; if edPrice3.Text <> '' then sendString := sendString+'Price3='+edPrice3.Text+'&Number3='+ edBalls3.Text+'&'; end; end; end else begin sendString := '0X04RangeOk=0&Error='+edError.Text+'&'; end; sendString := stringreplace(sendString,'.','%2E',[rfReplaceAll]); sendString := stringreplace(sendString,'-','%2D',[rfReplaceAll]); responseLength := length(sendString); edLen.Text := inttostr(responseLength); sendString[2] := ansichar(chr(responseLength)); edResponse.Text := sendString; end; procedure TIPsend.FormCreate(Sender: TObject); var config : textfile; begin Date.Text := FormatDateTime('dd/mm/yy', now()); AssignFile(config, ExtractFilePath( Application.ExeName ) + '/config.ini'); reset(config); ReadLn(config, text); remoteserver := text; ServerIp.Text := remoteserver; ReadLn(config, text); remoteport := text; port.Text := remoteport; ReadLn(config, text); decimalseparator := text[1]; closefile(config); edPrice1.Text := '1.5'; edPrice2.Text := ''; edPrice3.Text := ''; edBalls1.Text := '3'; edBalls2.Text := ''; edBalls3.Text := ''; edCustomerName.Text := ''; edCardBalance.Text := ''; end; procedure TIPsend.RangeTypeChange(Sender: TObject); begin refreshmessage; end; procedure TIPsend.ReferenceChange(Sender: TObject); begin refreshmessage; end; procedure TIPsend.TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient); var a : array[0..255] of AnsiChar; I : Cardinal; tmpStr,cutStr : ansistring; tempSendString : ansistring; begin ClientSocket.ReceiveBuf(a,256,0); strlist.Lines.Add(DateTimeToStr(now) + ' Data added:');// + // ptrA := Addr(a); // setstring(tmpStr,ptrA,256); setlength(tmpStr,256); for I := 0 to 254 do begin if a[i] in [#0..#9] then a[i] := ansichar(ord(a[i])+48); tmpStr[i+1] := a[i]; end; tmpStr := stringreplace(tmpStr,#0,'0',[rfReplaceAll]); cutStr := copy(tmpStr,1,ord(tmpStr[2])); strlist.Lines.Add(cutStr); strlist.Lines.Add('--------------------'); tempSendString := '0:04RangeOk=1&Price1=1%2E5&Number1=10&Price2=3&Number2=25&'; clientsocket.WaitForData(9000); updateResponse; clientsocket.SendLn(ansistring(edResponse.Text)); showmessage(''); //showmessage(inttostr( clientsocket.SendBuf(tempSendString,length(tempSendString),0))); showmessage(inttostr( clientsocket.SendLn(tempSendString))); application.processmessages; end; procedure TIPsend.TimeChange(Sender: TObject); begin refreshmessage; end; procedure TIPsend.Timer1Timer(Sender: TObject); begin Time.Text := FormatDateTime('hh:mm:ss', now()); end; procedure TIPsend.timerTimeoutTimer(Sender: TObject); begin timerTimeout.Enabled := false; showmessage('Spääl Timeout!'); end; procedure TIPsend.refreshmessage; var formattedtime : string; formatteddate : string; begin formatteddate := ''; formattedtime := ''; formattedtime := leftstr(time.Text,2)+ '%3A' + copy(time.Text,4,2) + '%3A' + rightstr(time.text,2); formatteddate := leftstr(date.Text,2)+ '%2F' + copy(date.Text,4,2) + '%2F' + rightstr(date.text,2); rightstr(date.text,2); messagestring := ''; messagestring := 'Command' + #61 + 'ValidateRangeId' + #38+ 'RangeType' + #61 + 'P' + #38+ 'Reference' + #61 + reference.Text+ #38+ 'Date' + #61 + formatteddate + #38+ 'Time' + #61 + formattedtime + #38; intmessagelength := length(messagestring) + 4; edit1.Text := messagestring; messagestring := #0 + chr(intmessagelength) + #0 + #4 + messagestring; noofbytes.Caption := inttostr(intmessagelength); end; function TIPsend.sendinput(id : string; RangeType : string) : integer; var unformatteddate, unformattedtime,formatteddate, formattedtime, dummy: string; begin unformatteddate := FormatDateTime('dd/mm/yy', now()); unformattedtime := FormatDateTime('hh:mm:ss', now()); formattedtime := leftstr(unformattedtime,2)+ '%3A' + copy(unformattedtime,4,2) + '%3A' + rightstr(unformattedtime,2); formatteddate := leftstr(unformatteddate,2)+ '%2F' + copy(unformatteddate,4,2) + '%2F' + rightstr(unformatteddate,2); transdate := formatteddate; transtime := formattedtime; messagestring := ''; messagestring := 'Command' + #61 + 'ValidateRangeId' + #38+ 'RangeType' + #61 + RangeType + #38+ 'Reference' + #61 + id + #38+ 'Date' + #61 + formatteddate + #38+ 'Time' + #61 + formattedtime + #38; intmessagelength := length(messagestring) + 4; messagestring := #0 + chr(intmessagelength) + #0 + #4 + messagestring; instring := ''; ClientSocket1.RemotePort := remoteport; ClientSocket1.RemoteHost := remoteserver; ClientSocket1.Active := true; if ClientSocket1.Active then begin ClientSocket1.Sendln(messagestring); end; RangeOK := -1; if not clientsocket1.WaitForData(10000) then rangeok := 9; while RangeOk = -1 do begin Dummy := clientsocket1.Receiveln(); end; clientsocket1.Disconnect; result := RangeOk; end; function TIPsend.sendvendstatus(id : string; RangeType : string) : integer; var dummy : string; begin // this handles the sending of the barcode to a remote POS system // information is received regarding credit messagestring := 'Command' + #61 + 'SetRangeUsage' + #38+ 'RangeType' + #61 + RangeType + #38+ 'Reference' + #61 + id + #38+ 'Date' + #61 + transdate + #38+ 'Time' + #61 + transtime + #38; //showmessage(messagestring); intmessagelength := length(messagestring) + 4; messagestring := #0 + chr(intmessagelength) + #0 + #4 + messagestring; ClientSocket1.RemotePort := remoteport; //local TCP/IP address of the server ClientSocket1.RemoteHost := remoteserver; ClientSocket1.Active := true; RangeOK := -1; if ClientSocket1.Active then begin ClientSocket1.Sendln(messagestring); end; while RangeOK = -1 do begin Dummy := clientsocket1.Receiveln(); end; clientsocket1.Disconnect; result := RangeOk; end; function TIPsend.sendcardvendstatus(id : string; RangeType : string; IssueGroup : Integer) : integer; var dummy : string; begin messagestring := 'Command' + #61 + 'SetRangeUsage' + #38+ 'RangeType' + #61 + RangeType + #38+ 'Reference' + #61 + id + #38+ 'IssueGroup'+ #61 + inttostr(IssueGroup) + #38 + 'Date' + #61 + transdate + #38+ 'Time' + #61 + transtime + #38; intmessagelength := length(messagestring) + 4; messagestring := #0 + chr(intmessagelength) + #0 + #4 + messagestring; ClientSocket1.RemotePort := remoteport; //local TCP/IP address of the server ClientSocket1.RemoteHost := remoteserver; ClientSocket1.Active := true; RangeOK := -1; if ClientSocket1.Active then begin ClientSocket1.Sendln(messagestring); end; while RangeOK = -1 do begin Dummy := clientsocket1.Receiveln(); end; clientsocket1.Disconnect; result := RangeOk; end; end.