• Delphi TCP服务端监听端口获取客户端RFID网络读卡器上传的刷卡数据


    本示例使用设备介绍:液显WIFI无线网络HTTP协议RFID云读卡器可编程实时可控开关TTS语-淘宝网 (taobao.com) 

    1. unit Unit1;
    2. interface
    3. uses
    4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    5. Dialogs, ComCtrls, ScktComp, StdCtrls, ScktComp7, ExtCtrls,Clipbrd;
    6. type
    7. TForm1 = class(TForm)
    8. ServerSocket1: TServerSocket;
    9. Button1: TButton;
    10. Button2: TButton;
    11. Edit1: TEdit;
    12. Edit2: TEdit;
    13. Label1: TLabel;
    14. ListBox1: TListBox;
    15. ListBox2: TListBox;
    16. Button3: TButton;
    17. CheckBox1: TCheckBox;
    18. Panel1: TPanel;
    19. RadioButton1: TRadioButton;
    20. RadioButton2: TRadioButton;
    21. RadioButton3: TRadioButton;
    22. RadioButton4: TRadioButton;
    23. Label6: TLabel;
    24. Label2: TLabel;
    25. Edit3: TEdit;
    26. Button4: TButton;
    27. Button5: TButton;
    28. Button6: TButton;
    29. Button7: TButton;
    30. RichEdit10: TRichEdit;
    31. UpDown7: TUpDown;
    32. ComboBox1: TComboBox;
    33. ComboBox3: TComboBox;
    34. RichEdit1: TRichEdit;
    35. UpDown1: TUpDown;
    36. RichEdit2: TRichEdit;
    37. UpDown2: TUpDown;
    38. Label3: TLabel;
    39. Label5: TLabel;
    40. Label7: TLabel;
    41. RadioButton5: TRadioButton;
    42. RadioButton6: TRadioButton;
    43. Label8: TLabel;
    44. Label9: TLabel;
    45. Label10: TLabel;
    46. CheckBox2: TCheckBox;
    47. Label4: TLabel;
    48. Button8: TButton;
    49. Button9: TButton;
    50. procedure ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    51. procedure ServerSocket1ClientDisconnect(Sender: TObject;Socket: TCustomWinSocket);
    52. procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
    53. procedure Button1Click(Sender: TObject);
    54. procedure FormActivate(Sender: TObject);
    55. procedure Button2Click(Sender: TObject);
    56. procedure Button3Click(Sender: TObject);
    57. procedure Button6Click(Sender: TObject);
    58. procedure Button5Click(Sender: TObject);
    59. procedure Button4Click(Sender: TObject);
    60. procedure FormClose(Sender: TObject; var Action: TCloseAction);
    61. procedure Button7Click(Sender: TObject);
    62. procedure Button8Click(Sender: TObject);
    63. procedure Button9Click(Sender: TObject);
    64. procedure CheckBox1MouseUp(Sender: TObject; Button: TMouseButton;
    65. Shift: TShiftState; X, Y: Integer);
    66. private
    67. { Private declarations }
    68. procedure Responsedata();
    69. procedure GetSenddata(respcode:integer);
    70. procedure ButtonSend(sendcode:integer);
    71. public
    72. { Public declarations }
    73. ResponseBuff:Array of Byte;
    74. end;
    75. var
    76. Form1: TForm1;
    77. implementation
    78. {$R *.dfm}
    79. procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    80. begin
    81. Button3.Click();
    82. end;
    83. procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    84. begin
    85. Button3.Click();
    86. end;
    87. procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
    88. var
    89. RemotAddPort,DispStr,HexStr:String;
    90. i,GetDataLen:integer;
    91. GetBuff:Array of Byte;
    92. SendBuff:Array of Byte;
    93. respcode:integer;
    94. begin
    95. try
    96. RemotAddPort:=Socket.RemoteAddress+':'+inttostr(Socket.RemotePort);
    97. GetDataLen:= Socket.ReceiveLength;
    98. SetLength(GetBuff, GetDataLen);
    99. Socket.ReceiveBuf(GetBuff[0],GetDataLen); //Socket.ReceiveText;
    100. DispStr:='';
    101. for i:=0 to GetDataLen-1 do
    102. begin
    103. DispStr:=DispStr+inttohex(GetBuff[i],2)+' ';
    104. end;
    105. if ListBox2.Count >100 then ListBox2.Clear();
    106. ListBox2.Items.Add('Get Data From '+RemotAddPort+' : '+DispStr);
    107. case GetBuff[0] of
    108. $C1,$CF:
    109. begin
    110. if GetBuff[0]= $C1 then
    111. DispStr:='数据解析:IC读卡器上传卡号,'
    112. else
    113. DispStr:='数据解析:IC卡离开读卡器,';
    114. DispStr := DispStr+'设备IP['+IntToStr(GetBuff[1]) + '.' + IntToStr(GetBuff[2]) + '.' + IntToStr(GetBuff[3]) + '.' + IntToStr(GetBuff[4])+'],';
    115. DispStr := DispStr+'机号['+IntToStr(GetBuff[5] + GetBuff[6]*256)+'],';
    116. DispStr := DispStr+'数据包号['+IntToStr(GetBuff[7] + GetBuff[8]*256)+'],';
    117. DispStr := DispStr+'卡号长度['+IntToStr(GetBuff[9])+'],';
    118. HexStr:='';
    119. for i:=10 to 10+GetBuff[9]-1 do
    120. HexStr:=HexStr+inttohex(GetBuff[i],2);
    121. DispStr := DispStr+'16进制卡号['+HexStr+'],';
    122. HexStr:='';
    123. for i:=10+GetBuff[9] to GetDataLen-1 do
    124. HexStr:=HexStr+inttohex(GetBuff[i],2);
    125. DispStr := DispStr+'唯一硬件序号['+HexStr+']';
    126. ListBox2.Items.Add(DispStr);
    127. ListBox2.Items.Add('');
    128. listbox2.ItemIndex :=listbox2.Items.Count-1;
    129. if CheckBox1.Checked then
    130. begin
    131. Responsedata() ;
    132. Socket.SendBuf(ResponseBuff[0],Length(ResponseBuff));
    133. DispStr:='Send Data To '+RemotAddPort+' : ';
    134. for i:=0 to Length(ResponseBuff)-1 do
    135. DispStr:=DispStr+inttohex(ResponseBuff[i],2)+' ';
    136. ListBox2.Items.Add(DispStr);
    137. ListBox2.Items.Add('');
    138. listbox2.ItemIndex :=listbox2.Items.Count-1;
    139. end;
    140. end;
    141. $D1,$DF:
    142. begin
    143. if GetBuff[0]= $D1 then
    144. DispStr:='数据解析:ID读卡器上传卡号,'
    145. else
    146. DispStr:='数据解析:ID卡离开读卡器,';
    147. DispStr := DispStr+'设备IP['+IntToStr(GetBuff[1]) + '.' + IntToStr(GetBuff[2]) + '.' + IntToStr(GetBuff[3]) + '.' + IntToStr(GetBuff[4])+'],';
    148. DispStr := DispStr+'机号['+IntToStr(GetBuff[5] + GetBuff[6]*256)+'],';
    149. DispStr := DispStr+'数据包号['+IntToStr(GetBuff[7] + GetBuff[8]*256)+'],';
    150. HexStr:='';
    151. for i:=9 to 13 do
    152. HexStr:=HexStr+inttohex(GetBuff[i],2);
    153. DispStr := DispStr+'16进制卡号['+HexStr+'],';
    154. HexStr:='';
    155. for i:=14 to GetDataLen-1 do
    156. HexStr:=HexStr+inttohex(GetBuff[i],2);
    157. DispStr := DispStr+'唯一硬件序号['+HexStr+']';
    158. ListBox2.Items.Add(DispStr);
    159. ListBox2.Items.Add('');
    160. listbox2.ItemIndex :=listbox2.Items.Count-1;
    161. if CheckBox1.Checked then
    162. begin
    163. Responsedata() ;
    164. Socket.SendBuf(ResponseBuff[0],Length(ResponseBuff));
    165. DispStr:='Send Data To '+RemotAddPort+' : ';
    166. for i:=0 to Length(ResponseBuff)-1 do
    167. DispStr:=DispStr+inttohex(ResponseBuff[i],2)+' ';
    168. ListBox2.Items.Add(DispStr);
    169. ListBox2.Items.Add('');
    170. listbox2.ItemIndex :=listbox2.Items.Count-1;
    171. end;
    172. end;
    173. $F3:
    174. begin
    175. DispStr:='数据解析:读卡器心跳包,';
    176. DispStr := DispStr+'设备IP['+IntToStr(GetBuff[1]) + '.' + IntToStr(GetBuff[2]) + '.' + IntToStr(GetBuff[3]) + '.' + IntToStr(GetBuff[4])+'],';
    177. DispStr := DispStr+'机号['+IntToStr(GetBuff[5] + GetBuff[6]*256)+'],';
    178. DispStr := DispStr+'数据包号['+IntToStr(GetBuff[7] + GetBuff[8]*256)+'],';
    179. DispStr := DispStr+'心跳包标识['+inttohex(GetBuff[9],2)+'],';
    180. DispStr := DispStr+'长度['+IntToStr(GetBuff[10])+'],';
    181. DispStr := DispStr+'继电器状态['+inttohex(GetBuff[11],2)+'],';
    182. DispStr := DispStr+'输入口状态['+inttohex(GetBuff[12],2)+'],';
    183. DispStr := DispStr+'随机校验码['+inttohex(GetBuff[13],2)+inttohex(GetBuff[14],2)+inttohex(GetBuff[15],2)+inttohex(GetBuff[16],2)+'],';
    184. HexStr:='';
    185. HexStr:='';
    186. for i:=17 to GetDataLen-1 do
    187. HexStr:=HexStr+inttohex(GetBuff[i],2);
    188. DispStr := DispStr+'唯一硬件序号['+HexStr+']';
    189. ListBox2.Items.Add(DispStr);
    190. ListBox2.Items.Add('');
    191. listbox2.ItemIndex :=listbox2.Items.Count-1;
    192. end;
    193. end;
    194. except
    195. end;
    196. end;
    197. procedure TForm1.Responsedata(); //根据选择的回应方式生成回应数据缓冲
    198. begin
    199. if RadioButton1.Checked then
    200. GetSenddata(0)
    201. else
    202. if RadioButton2.Checked then
    203. GetSenddata(1)
    204. else
    205. if RadioButton3.Checked then
    206. GetSenddata(2)
    207. else
    208. GetSenddata(3);
    209. end;
    210. procedure TForm1.GetSenddata(respcode:integer); //根据发送方式生成发送数据缓冲
    211. var
    212. delaytime,i,voicelen,displen:integer;
    213. strls,voicestr:string;
    214. begin
    215. case respcode of
    216. 0:
    217. begin
    218. SetLength(ResponseBuff, 39);
    219. ResponseBuff[0]:=$5A; //命令字:驱动显示文字+蜂鸣器响声
    220. ResponseBuff[1]:=$00; //机号低
    221. ResponseBuff[2]:=$00; //机号高,0000表示任意机号
    222. if(CheckBox2.Checked) then
    223. begin
    224. ResponseBuff[3]:=ComboBox1.ItemIndex; //蜂鸣器响声代码
    225. if RadioButton6.Checked then ResponseBuff[3]:=ResponseBuff[3] xor 128; //背光灯状态不改变
    226. end
    227. else
    228. begin
    229. ResponseBuff[3]:=$ff; //不响声
    230. if RadioButton6.Checked then ResponseBuff[3]:=ResponseBuff[3] xor 127; //背光灯状态不改变
    231. end;
    232. delaytime:=StrToInt(RichEdit10.Lines[0]);
    233. ResponseBuff[4] := delaytime mod 256; //显示时长
    234. strls := Edit1.Text + ' ';
    235. for i := 1 to 34 do
    236. ResponseBuff[4+i] := Byte(strls[i]);
    237. end;
    238. 1:
    239. begin
    240. voicestr:='[v'+ trim(RichEdit2.Lines[0])+']'; //本次播报TTS语音的音量大小,取值范围v0 到 v16
    241. voicestr:= voicestr+trim(edit3.Text);
    242. voicelen:=length(voicestr); //语音长度
    243. displen:=34; //满屏显示长度
    244. SetLength(ResponseBuff, 11+displen+voicelen+4);
    245. ResponseBuff[0]:=$5C; //命令字:驱动显示文字+蜂鸣器响声+开启继电器+播报TTS语音
    246. ResponseBuff[1]:=$00; //机号低
    247. ResponseBuff[2]:=$00; //机号高,0000表示任意机号
    248. if(CheckBox2.Checked) then
    249. begin
    250. ResponseBuff[3]:=ComboBox1.ItemIndex; //蜂鸣器响声代码
    251. if RadioButton6.Checked then ResponseBuff[3]:=ResponseBuff[3] xor 128; //背光灯状态不改变
    252. end
    253. else
    254. begin
    255. ResponseBuff[3]:=$ff; //不响声
    256. if RadioButton6.Checked then ResponseBuff[3]:=ResponseBuff[3] xor 127; //背光灯状态不改变
    257. end;
    258. case ComboBox3.ItemIndex of //开启的继电器号
    259. 1: ResponseBuff[4]:=$f1;
    260. 2: ResponseBuff[4]:=$f2;
    261. 3: ResponseBuff[4]:=$f3;
    262. 4: ResponseBuff[4]:=$f4;
    263. 5: ResponseBuff[4]:=$f5;
    264. 6: ResponseBuff[4]:=$f6;
    265. 7: ResponseBuff[4]:=$f7;
    266. 8: ResponseBuff[4]:=$f8;
    267. else ResponseBuff[4]:=$f0;
    268. end;
    269. delaytime:=StrToInt(RichEdit1.Lines[0]);
    270. ResponseBuff[5] := delaytime mod 256;
    271. ResponseBuff[6] := (delaytime div 256) mod 256;
    272. delaytime:=StrToInt(RichEdit10.Lines[0]);
    273. ResponseBuff[7] := delaytime mod 256; //显示时长
    274. ResponseBuff[8] :=0;
    275. ResponseBuff[9] :=displen;
    276. ResponseBuff[10] :=voicelen;
    277. strls := Edit1.Text + ' ';
    278. for i := 1 to displen do
    279. ResponseBuff[10+i] := Byte(strls[i]);
    280. for i := 1 to voicelen do
    281. ResponseBuff[10+displen+i] := Byte(voicestr[i]);
    282. ResponseBuff[10+displen+voicelen+1]:=$55; //防干扰固定后缀
    283. ResponseBuff[10+displen+voicelen+2]:=$aa;
    284. ResponseBuff[10+displen+voicelen+3]:=$66;
    285. ResponseBuff[10+displen+voicelen+4]:=$99;
    286. end;
    287. 2:
    288. begin
    289. SetLength(ResponseBuff, 4);
    290. ResponseBuff[0]:=$96; //命令字:驱动蜂鸣器响
    291. ResponseBuff[1]:=$00; //机号低
    292. ResponseBuff[2]:=$00; //机号高,0000表示任意机号
    293. ResponseBuff[3]:=ComboBox1.ItemIndex; //蜂鸣器响声代码
    294. end;
    295. 3:
    296. begin
    297. SetLength(ResponseBuff, 6);
    298. ResponseBuff[0]:=$78; //命令字:驱动开启继电器
    299. ResponseBuff[1]:=$00; //机号低
    300. ResponseBuff[2]:=$00; //机号高,0000表示任意机号
    301. case ComboBox3.ItemIndex of //开启的继电器号
    302. 1: ResponseBuff[3]:=$f1;
    303. 2: ResponseBuff[3]:=$f2;
    304. 3: ResponseBuff[3]:=$f3;
    305. 4: ResponseBuff[3]:=$f4;
    306. 5: ResponseBuff[3]:=$f5;
    307. 6: ResponseBuff[3]:=$f6;
    308. 7: ResponseBuff[3]:=$f7;
    309. 8: ResponseBuff[3]:=$f8;
    310. else ResponseBuff[3]:=$f0;
    311. end;
    312. delaytime:=StrToInt(RichEdit1.Lines[0]);
    313. ResponseBuff[4] := delaytime mod 256;
    314. ResponseBuff[5] := (delaytime div 256) mod 256;
    315. end;
    316. 4:
    317. begin
    318. SetLength(ResponseBuff, 6);
    319. ResponseBuff[0]:=$78; //命令字:驱动关闭已开启继电器
    320. ResponseBuff[1]:=$00; //机号低
    321. ResponseBuff[2]:=$00; //机号高,0000表示任意机号
    322. case ComboBox3.ItemIndex of //继电器号
    323. 1: ResponseBuff[3]:=$e1;
    324. 2: ResponseBuff[3]:=$e2;
    325. 3: ResponseBuff[3]:=$e3;
    326. 4: ResponseBuff[3]:=$e4;
    327. 5: ResponseBuff[3]:=$e5;
    328. 6: ResponseBuff[3]:=$e6;
    329. 7: ResponseBuff[3]:=$e7;
    330. 8: ResponseBuff[3]:=$e8;
    331. else ResponseBuff[3]:=$e0;
    332. end;
    333. delaytime:=StrToInt(RichEdit1.Lines[0]);
    334. ResponseBuff[4] := delaytime mod 256;
    335. ResponseBuff[5] := (delaytime div 256) mod 256;
    336. end;
    337. end;
    338. end;
    339. procedure TForm1.ButtonSend(sendcode:integer);
    340. var
    341. i:integer;
    342. RemotAddPort,DispStr:string;
    343. begin
    344. if ServerSocket1.Active then
    345. begin
    346. i:=ListBox1.ItemIndex ;
    347. if i>=0 then
    348. begin
    349. try
    350. GetSenddata(sendcode);
    351. ServerSocket1.Socket.Connections[i].SendBuf(ResponseBuff[0],Length(ResponseBuff));
    352. RemotAddPort:= ServerSocket1.Socket.Connections[i].RemoteAddress+':'+inttostr(ServerSocket1.Socket.Connections[i].RemotePort);
    353. DispStr:='Send Data To '+RemotAddPort+' : ';
    354. for i:=0 to Length(ResponseBuff)-1 do
    355. DispStr:=DispStr+inttohex(ResponseBuff[i],2)+' ';
    356. ListBox2.Items.Add(DispStr);
    357. ListBox2.Items.Add('');
    358. listbox2.ItemIndex :=listbox2.Items.Count-1;
    359. except
    360. end;
    361. end
    362. else
    363. Application.MessageBox('请先选择要向其发送指令的在线客户端!', '警告', MB_OK+MB_ICONSTOP);
    364. end
    365. else
    366. Application.MessageBox('请先启动TCP服务监听!', '警告', MB_OK+MB_ICONSTOP);
    367. end;
    368. procedure TForm1.Button1Click(Sender: TObject);
    369. begin
    370. ButtonSend(0);
    371. end;
    372. procedure TForm1.FormActivate(Sender: TObject);
    373. begin
    374. if ServerSocket1.Active then
    375. begin
    376. Button2.Caption := '停止';
    377. end
    378. else
    379. begin
    380. Button2.Click();
    381. end;
    382. end;
    383. procedure TForm1.Button2Click(Sender: TObject);
    384. begin
    385. if not ServerSocket1.Active then
    386. begin
    387. try
    388. ServerSocket1.Port := StrToInt(Edit2.Text);
    389. ServerSocket1.Active := True;
    390. Button2.Caption := '停止';
    391. Edit2.Enabled := False;
    392. except
    393. Application.MessageBox('启动TCP服务监听失败!可能端口已被其他应用占用。', '警告', MB_OK+MB_ICONSTOP);
    394. end;
    395. end
    396. else
    397. begin
    398. ServerSocket1.Active := False;
    399. Button2.Caption := '启动TCP服务监听';
    400. Edit2.Enabled := True;
    401. ListBox1.Items.Clear();
    402. ListBox2.Items.Clear();
    403. end;
    404. end;
    405. procedure TForm1.Button3Click(Sender: TObject);
    406. var
    407. i,links:integer;
    408. begin
    409. ListBox1.Items.Clear();
    410. links:=ServerSocket1.Socket.ActiveConnections;
    411. for i:=0 to links-1 do
    412. begin
    413. ListBox1.Items.Add(inttostr(i)+'|'+ServerSocket1.Socket.Connections[i].RemoteAddress+':'+inttostr(ServerSocket1.Socket.Connections[i].RemotePort));
    414. end;
    415. end;
    416. procedure TForm1.Button6Click(Sender: TObject);
    417. begin
    418. ButtonSend(3);
    419. end;
    420. procedure TForm1.Button5Click(Sender: TObject);
    421. begin
    422. ButtonSend(2);
    423. end;
    424. procedure TForm1.Button4Click(Sender: TObject);
    425. begin
    426. ButtonSend(1);
    427. end;
    428. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    429. begin
    430. if ServerSocket1.Active then ServerSocket1.Active := False;
    431. end;
    432. procedure TForm1.Button7Click(Sender: TObject);
    433. begin
    434. ButtonSend(4);
    435. end;
    436. procedure TForm1.Button8Click(Sender: TObject);
    437. var
    438. liststr:string;
    439. i:integer;
    440. begin
    441. if listbox2.Count <1 then exit;
    442. liststr:='';
    443. for i:=0 to ListBox2.Count-1 do
    444. begin
    445. ListBox2.ItemIndex:=i;
    446. liststr:=liststr+ListBox2.Items.Strings[ListBox2.ItemIndex]+#13#10;
    447. end;
    448. Clipboard.SetTextBuf(PChar(liststr));
    449. Application.MessageBox('TCP通讯报文日志已拷贝!', '提示', MB_OK+MB_ICONASTERISK );
    450. end;
    451. procedure TForm1.Button9Click(Sender: TObject);
    452. begin
    453. ListBox2.Clear();
    454. end;
    455. procedure TForm1.CheckBox1MouseUp(Sender: TObject; Button: TMouseButton;
    456. Shift: TShiftState; X, Y: Integer);
    457. begin
    458. if checkbox1.Checked then Panel1.Visible :=true else Panel1.Visible :=false;
    459. end;
    460. end.

  • 相关阅读:
    数据库.创建表
    页面初始化要做的操作
    高速DSP系统设计参考指南(五)印制电路板或PCB布局
    字字珠玑,GitHub 爆赞的网络协议手册,被华为指定内部必学?
    【Redis】如何保证Redis缓存与数据库的一致性?
    业务需求不用等!低代码开发平台随需响应、快速搭建
    【附源码】计算机毕业设计JAVA互联网保险网站
    Java 基于 SpringBoot 的学生考勤系统
    JAVA环境下使用DATAX(不使用python调用:也是个人记录一下)
    1+X 职业技能考核平台
  • 原文地址:https://blog.csdn.net/zhangjin7422/article/details/134331956