本示例使用设备介绍:液显WIFI无线网络HTTP协议RFID云读卡器可编程实时可控开关TTS语-淘宝网 (taobao.com)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ScktComp, StdCtrls, ScktComp7, ExtCtrls,Clipbrd;
type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
ListBox1: TListBox;
ListBox2: TListBox;
Button3: TButton;
CheckBox1: TCheckBox;
Panel1: TPanel;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
RadioButton4: TRadioButton;
Label6: TLabel;
Label2: TLabel;
Edit3: TEdit;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
RichEdit10: TRichEdit;
UpDown7: TUpDown;
ComboBox1: TComboBox;
ComboBox3: TComboBox;
RichEdit1: TRichEdit;
UpDown1: TUpDown;
RichEdit2: TRichEdit;
UpDown2: TUpDown;
Label3: TLabel;
Label5: TLabel;
Label7: TLabel;
RadioButton5: TRadioButton;
RadioButton6: TRadioButton;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
CheckBox2: TCheckBox;
Label4: TLabel;
Button8: TButton;
Button9: TButton;
procedure ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerSocket1ClientDisconnect(Sender: TObject;Socket: TCustomWinSocket);
procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure CheckBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
procedure Responsedata();
procedure GetSenddata(respcode:integer);
procedure ButtonSend(sendcode:integer);
public
{ Public declarations }
ResponseBuff:Array of Byte;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
Button3.Click();
end;
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
Button3.Click();
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
RemotAddPort,DispStr,HexStr:String;
i,GetDataLen:integer;
GetBuff:Array of Byte;
SendBuff:Array of Byte;
respcode:integer;
begin
try
RemotAddPort:=Socket.RemoteAddress+':'+inttostr(Socket.RemotePort);
GetDataLen:= Socket.ReceiveLength;
SetLength(GetBuff, GetDataLen);
Socket.ReceiveBuf(GetBuff[0],GetDataLen); //Socket.ReceiveText;
DispStr:='';
for i:=0 to GetDataLen-1 do
begin
DispStr:=DispStr+inttohex(GetBuff[i],2)+' ';
end;
if ListBox2.Count >100 then ListBox2.Clear();
ListBox2.Items.Add('Get Data From '+RemotAddPort+' : '+DispStr);
case GetBuff[0] of
$C1,$CF:
begin
if GetBuff[0]= $C1 then
DispStr:='数据解析:IC读卡器上传卡号,'
else
DispStr:='数据解析:IC卡离开读卡器,';
DispStr := DispStr+'设备IP['+IntToStr(GetBuff[1]) + '.' + IntToStr(GetBuff[2]) + '.' + IntToStr(GetBuff[3]) + '.' + IntToStr(GetBuff[4])+'],';
DispStr := DispStr+'机号['+IntToStr(GetBuff[5] + GetBuff[6]*256)+'],';
DispStr := DispStr+'数据包号['+IntToStr(GetBuff[7] + GetBuff[8]*256)+'],';
DispStr := DispStr+'卡号长度['+IntToStr(GetBuff[9])+'],';
HexStr:='';
for i:=10 to 10+GetBuff[9]-1 do
HexStr:=HexStr+inttohex(GetBuff[i],2);
DispStr := DispStr+'16进制卡号['+HexStr+'],';
HexStr:='';
for i:=10+GetBuff[9] to GetDataLen-1 do
HexStr:=HexStr+inttohex(GetBuff[i],2);
DispStr := DispStr+'唯一硬件序号['+HexStr+']';
ListBox2.Items.Add(DispStr);
ListBox2.Items.Add('');
listbox2.ItemIndex :=listbox2.Items.Count-1;
if CheckBox1.Checked then
begin
Responsedata() ;
Socket.SendBuf(ResponseBuff[0],Length(ResponseBuff));
DispStr:='Send Data To '+RemotAddPort+' : ';
for i:=0 to Length(ResponseBuff)-1 do
DispStr:=DispStr+inttohex(ResponseBuff[i],2)+' ';
ListBox2.Items.Add(DispStr);
ListBox2.Items.Add('');
listbox2.ItemIndex :=listbox2.Items.Count-1;
end;
end;
$D1,$DF:
begin
if GetBuff[0]= $D1 then
DispStr:='数据解析:ID读卡器上传卡号,'
else
DispStr:='数据解析:ID卡离开读卡器,';
DispStr := DispStr+'设备IP['+IntToStr(GetBuff[1]) + '.' + IntToStr(GetBuff[2]) + '.' + IntToStr(GetBuff[3]) + '.' + IntToStr(GetBuff[4])+'],';
DispStr := DispStr+'机号['+IntToStr(GetBuff[5] + GetBuff[6]*256)+'],';
DispStr := DispStr+'数据包号['+IntToStr(GetBuff[7] + GetBuff[8]*256)+'],';
HexStr:='';
for i:=9 to 13 do
HexStr:=HexStr+inttohex(GetBuff[i],2);
DispStr := DispStr+'16进制卡号['+HexStr+'],';
HexStr:='';
for i:=14 to GetDataLen-1 do
HexStr:=HexStr+inttohex(GetBuff[i],2);
DispStr := DispStr+'唯一硬件序号['+HexStr+']';
ListBox2.Items.Add(DispStr);
ListBox2.Items.Add('');
listbox2.ItemIndex :=listbox2.Items.Count-1;
if CheckBox1.Checked then
begin
Responsedata() ;
Socket.SendBuf(ResponseBuff[0],Length(ResponseBuff));
DispStr:='Send Data To '+RemotAddPort+' : ';
for i:=0 to Length(ResponseBuff)-1 do
DispStr:=DispStr+inttohex(ResponseBuff[i],2)+' ';
ListBox2.Items.Add(DispStr);
ListBox2.Items.Add('');
listbox2.ItemIndex :=listbox2.Items.Count-1;
end;
end;
$F3:
begin
DispStr:='数据解析:读卡器心跳包,';
DispStr := DispStr+'设备IP['+IntToStr(GetBuff[1]) + '.' + IntToStr(GetBuff[2]) + '.' + IntToStr(GetBuff[3]) + '.' + IntToStr(GetBuff[4])+'],';
DispStr := DispStr+'机号['+IntToStr(GetBuff[5] + GetBuff[6]*256)+'],';
DispStr := DispStr+'数据包号['+IntToStr(GetBuff[7] + GetBuff[8]*256)+'],';
DispStr := DispStr+'心跳包标识['+inttohex(GetBuff[9],2)+'],';
DispStr := DispStr+'长度['+IntToStr(GetBuff[10])+'],';
DispStr := DispStr+'继电器状态['+inttohex(GetBuff[11],2)+'],';
DispStr := DispStr+'输入口状态['+inttohex(GetBuff[12],2)+'],';
DispStr := DispStr+'随机校验码['+inttohex(GetBuff[13],2)+inttohex(GetBuff[14],2)+inttohex(GetBuff[15],2)+inttohex(GetBuff[16],2)+'],';
HexStr:='';
HexStr:='';
for i:=17 to GetDataLen-1 do
HexStr:=HexStr+inttohex(GetBuff[i],2);
DispStr := DispStr+'唯一硬件序号['+HexStr+']';
ListBox2.Items.Add(DispStr);
ListBox2.Items.Add('');
listbox2.ItemIndex :=listbox2.Items.Count-1;
end;
end;
except
end;
end;
procedure TForm1.Responsedata(); //根据选择的回应方式生成回应数据缓冲
begin
if RadioButton1.Checked then
GetSenddata(0)
else
if RadioButton2.Checked then
GetSenddata(1)
else
if RadioButton3.Checked then
GetSenddata(2)
else
GetSenddata(3);
end;
procedure TForm1.GetSenddata(respcode:integer); //根据发送方式生成发送数据缓冲
var
delaytime,i,voicelen,displen:integer;
strls,voicestr:string;
begin
case respcode of
0:
begin
SetLength(ResponseBuff, 39);
ResponseBuff[0]:=$5A; //命令字:驱动显示文字+蜂鸣器响声
ResponseBuff[1]:=$00; //机号低
ResponseBuff[2]:=$00; //机号高,0000表示任意机号
if(CheckBox2.Checked) then
begin
ResponseBuff[3]:=ComboBox1.ItemIndex; //蜂鸣器响声代码
if RadioButton6.Checked then ResponseBuff[3]:=ResponseBuff[3] xor 128; //背光灯状态不改变
end
else
begin
ResponseBuff[3]:=$ff; //不响声
if RadioButton6.Checked then ResponseBuff[3]:=ResponseBuff[3] xor 127; //背光灯状态不改变
end;
delaytime:=StrToInt(RichEdit10.Lines[0]);
ResponseBuff[4] := delaytime mod 256; //显示时长
strls := Edit1.Text + ' ';
for i := 1 to 34 do
ResponseBuff[4+i] := Byte(strls[i]);
end;
1:
begin
voicestr:='[v'+ trim(RichEdit2.Lines[0])+']'; //本次播报TTS语音的音量大小,取值范围v0 到 v16
voicestr:= voicestr+trim(edit3.Text);
voicelen:=length(voicestr); //语音长度
displen:=34; //满屏显示长度
SetLength(ResponseBuff, 11+displen+voicelen+4);
ResponseBuff[0]:=$5C; //命令字:驱动显示文字+蜂鸣器响声+开启继电器+播报TTS语音
ResponseBuff[1]:=$00; //机号低
ResponseBuff[2]:=$00; //机号高,0000表示任意机号
if(CheckBox2.Checked) then
begin
ResponseBuff[3]:=ComboBox1.ItemIndex; //蜂鸣器响声代码
if RadioButton6.Checked then ResponseBuff[3]:=ResponseBuff[3] xor 128; //背光灯状态不改变
end
else
begin
ResponseBuff[3]:=$ff; //不响声
if RadioButton6.Checked then ResponseBuff[3]:=ResponseBuff[3] xor 127; //背光灯状态不改变
end;
case ComboBox3.ItemIndex of //开启的继电器号
1: ResponseBuff[4]:=$f1;
2: ResponseBuff[4]:=$f2;
3: ResponseBuff[4]:=$f3;
4: ResponseBuff[4]:=$f4;
5: ResponseBuff[4]:=$f5;
6: ResponseBuff[4]:=$f6;
7: ResponseBuff[4]:=$f7;
8: ResponseBuff[4]:=$f8;
else ResponseBuff[4]:=$f0;
end;
delaytime:=StrToInt(RichEdit1.Lines[0]);
ResponseBuff[5] := delaytime mod 256;
ResponseBuff[6] := (delaytime div 256) mod 256;
delaytime:=StrToInt(RichEdit10.Lines[0]);
ResponseBuff[7] := delaytime mod 256; //显示时长
ResponseBuff[8] :=0;
ResponseBuff[9] :=displen;
ResponseBuff[10] :=voicelen;
strls := Edit1.Text + ' ';
for i := 1 to displen do
ResponseBuff[10+i] := Byte(strls[i]);
for i := 1 to voicelen do
ResponseBuff[10+displen+i] := Byte(voicestr[i]);
ResponseBuff[10+displen+voicelen+1]:=$55; //防干扰固定后缀
ResponseBuff[10+displen+voicelen+2]:=$aa;
ResponseBuff[10+displen+voicelen+3]:=$66;
ResponseBuff[10+displen+voicelen+4]:=$99;
end;
2:
begin
SetLength(ResponseBuff, 4);
ResponseBuff[0]:=$96; //命令字:驱动蜂鸣器响
ResponseBuff[1]:=$00; //机号低
ResponseBuff[2]:=$00; //机号高,0000表示任意机号
ResponseBuff[3]:=ComboBox1.ItemIndex; //蜂鸣器响声代码
end;
3:
begin
SetLength(ResponseBuff, 6);
ResponseBuff[0]:=$78; //命令字:驱动开启继电器
ResponseBuff[1]:=$00; //机号低
ResponseBuff[2]:=$00; //机号高,0000表示任意机号
case ComboBox3.ItemIndex of //开启的继电器号
1: ResponseBuff[3]:=$f1;
2: ResponseBuff[3]:=$f2;
3: ResponseBuff[3]:=$f3;
4: ResponseBuff[3]:=$f4;
5: ResponseBuff[3]:=$f5;
6: ResponseBuff[3]:=$f6;
7: ResponseBuff[3]:=$f7;
8: ResponseBuff[3]:=$f8;
else ResponseBuff[3]:=$f0;
end;
delaytime:=StrToInt(RichEdit1.Lines[0]);
ResponseBuff[4] := delaytime mod 256;
ResponseBuff[5] := (delaytime div 256) mod 256;
end;
4:
begin
SetLength(ResponseBuff, 6);
ResponseBuff[0]:=$78; //命令字:驱动关闭已开启继电器
ResponseBuff[1]:=$00; //机号低
ResponseBuff[2]:=$00; //机号高,0000表示任意机号
case ComboBox3.ItemIndex of //继电器号
1: ResponseBuff[3]:=$e1;
2: ResponseBuff[3]:=$e2;
3: ResponseBuff[3]:=$e3;
4: ResponseBuff[3]:=$e4;
5: ResponseBuff[3]:=$e5;
6: ResponseBuff[3]:=$e6;
7: ResponseBuff[3]:=$e7;
8: ResponseBuff[3]:=$e8;
else ResponseBuff[3]:=$e0;
end;
delaytime:=StrToInt(RichEdit1.Lines[0]);
ResponseBuff[4] := delaytime mod 256;
ResponseBuff[5] := (delaytime div 256) mod 256;
end;
end;
end;
procedure TForm1.ButtonSend(sendcode:integer);
var
i:integer;
RemotAddPort,DispStr:string;
begin
if ServerSocket1.Active then
begin
i:=ListBox1.ItemIndex ;
if i>=0 then
begin
try
GetSenddata(sendcode);
ServerSocket1.Socket.Connections[i].SendBuf(ResponseBuff[0],Length(ResponseBuff));
RemotAddPort:= ServerSocket1.Socket.Connections[i].RemoteAddress+':'+inttostr(ServerSocket1.Socket.Connections[i].RemotePort);
DispStr:='Send Data To '+RemotAddPort+' : ';
for i:=0 to Length(ResponseBuff)-1 do
DispStr:=DispStr+inttohex(ResponseBuff[i],2)+' ';
ListBox2.Items.Add(DispStr);
ListBox2.Items.Add('');
listbox2.ItemIndex :=listbox2.Items.Count-1;
except
end;
end
else
Application.MessageBox('请先选择要向其发送指令的在线客户端!', '警告', MB_OK+MB_ICONSTOP);
end
else
Application.MessageBox('请先启动TCP服务监听!', '警告', MB_OK+MB_ICONSTOP);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ButtonSend(0);
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
if ServerSocket1.Active then
begin
Button2.Caption := '停止';
end
else
begin
Button2.Click();
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if not ServerSocket1.Active then
begin
try
ServerSocket1.Port := StrToInt(Edit2.Text);
ServerSocket1.Active := True;
Button2.Caption := '停止';
Edit2.Enabled := False;
except
Application.MessageBox('启动TCP服务监听失败!可能端口已被其他应用占用。', '警告', MB_OK+MB_ICONSTOP);
end;
end
else
begin
ServerSocket1.Active := False;
Button2.Caption := '启动TCP服务监听';
Edit2.Enabled := True;
ListBox1.Items.Clear();
ListBox2.Items.Clear();
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
i,links:integer;
begin
ListBox1.Items.Clear();
links:=ServerSocket1.Socket.ActiveConnections;
for i:=0 to links-1 do
begin
ListBox1.Items.Add(inttostr(i)+'|'+ServerSocket1.Socket.Connections[i].RemoteAddress+':'+inttostr(ServerSocket1.Socket.Connections[i].RemotePort));
end;
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
ButtonSend(3);
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
ButtonSend(2);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
ButtonSend(1);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if ServerSocket1.Active then ServerSocket1.Active := False;
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
ButtonSend(4);
end;
procedure TForm1.Button8Click(Sender: TObject);
var
liststr:string;
i:integer;
begin
if listbox2.Count <1 then exit;
liststr:='';
for i:=0 to ListBox2.Count-1 do
begin
ListBox2.ItemIndex:=i;
liststr:=liststr+ListBox2.Items.Strings[ListBox2.ItemIndex]+#13#10;
end;
Clipboard.SetTextBuf(PChar(liststr));
Application.MessageBox('TCP通讯报文日志已拷贝!', '提示', MB_OK+MB_ICONASTERISK );
end;
procedure TForm1.Button9Click(Sender: TObject);
begin
ListBox2.Clear();
end;
procedure TForm1.CheckBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if checkbox1.Checked then Panel1.Visible :=true else Panel1.Visible :=false;
end;
end.