双龙13.56M射频模块在酒店公用电脑管理中的应用
发送的数据
A6 03 FC 17 05 6B
HEAD=A6
LENGTH=03
LEN_CHK =FC
COMMAND=17
WAIT TIME=05
CHECKSUM =6B
返回信息为:
MIFARE ONE S50卡
A6 0C F3 17 00 0A 04 00 A6 A2 FA 69 97 08 15
HEAD=A6
LENGTH=0C
LEN_CHK =F3
COMMAND=17
STATUS=00
DATA=” 0A 04 00 A6 A2 FA 69 97 08 ”
卡号
CHECKSUM =15
读二代身份证ID的指令:
0x1E:读取二代身份证芯片ID 号命令
该命令用于读取二代身份证卡的ID 号。
发送的数据
A6 06 F9 1E 05 05 00 00 5F
HEAD=A6
LENGTH=06
LEN_CHK =F9
COMMAND=1E
WAIT TIME=05(波特率设置值 0x0F 表示使用106K 进行收发数据)。
PARAMETER=05 00 00(TYPE B 卡ATQB 命令)。
CHECKSUM =5F
模块返回的数据为:
A6 37 C8 1E 00 50 00 00 00 00 ** 03 ** 05 00 ** ** 20 ** 20 ** ** 24 ** 78
00 01 ** ** 01 06 03 14 00 00 00 00 00 06 ** 10 70 ** 4B ** 8B ** ** AA ** 86
18 ** 93 ** ** **
HEAD=A6
LENGTH=37
LEN_CHK =C8
COMMAND=1E
STATUS=00
DATA=” 50 00 00 00 00 ** 03 ** 05 00 ** ** 20 ** 20 ** ** 24 ** 78 00
身份证卡ID 号
01 ** ** 01 06 03 14 00 00 00 00 00 06 ** 10 70 ** 4B ** 8B ** ** AA **
86 18 ** 93 ** ** ** ”
(* 号部分为隐去的身份信息。返回的数据信息里面从第13 个字节开始的8 个字节的数据是身份证卡片的ID 号)。
CHECKSUM =74
读卡功能的步骤说明:
1.发送读MIFARE ONE S50卡ID命令
参考代码 ApdComPort1.PutBlock(ReadMOneCard, Length(ReadMOneCard));
2.如成功,则返回卡号数据,结束;不成功则转到步骤3
3.发送读二代身份证的ID指令
参考代码 ApdComPort1.PutBlock(ReadPersonCard, Length(ReadPersonCard));
4.如成功,则返回身份证卡号数据,结束;不成功返回无卡,结束
其中发送数据的声明如下
const
ReadMOneCard : array[0..5] of byte = ($A6,$03,$FC,$17,$05,$6B);
ReadPersonCard : array[0..8] of byte = ($A6,$06,$F9,$1E,$05,$05,$00,$00,$5F);
编程中串口通讯实现使用了专用的串口控件TurboPower Async Professional包,发送串口数据使用了其中"串行端口"组件TApdComPort,接收串口数据使用了其中数据包组件TApdDataPacket,在TApdDataPacket组件的OnPacket事件中处理接收到的数据,下面参考代码说明如何提取卡号。
procedure TFormReadIDCard.ApdDPSuccS50Packet(Sender: TObject;
Data: Pointer; Size: Integer);
...
For i := 0 To 4-1 Do
begin
baCardID[i] := Buffer[i + 7];//从7开始的4个字节为卡号
end;
procedure TFormReadIDCard.ApdDPSuccIDCPacket(Sender: TObject; Data: Pointer;
Size: Integer);
...
For i := 0 To 8-1 Do
begin
baCardID[i] := Buffer[i + 16]; //从16开始的8个字节为卡号
end;
锁定电脑功能实现:
a. 伪装屏保状态, SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, TRUE, NULL, 0);
b. 禁止任务切换, SystemParametersInfo(SPI_SETFASTTASKSWITCH, FALSE, NULL, 0);
c. 禁止屏保运行, SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE,0, SPIF_SENDWININICHANGE);
d. 禁止任务管理器, "Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr"设置这个键值为1
e. 钩住所有鼠标和键盘事件,
hLKeyboardProcHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC) _LKeyboardProcHook, hInstance, 0L);
hLMouseProcHook =SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC) _LMouseProcHook, hInstance, 0L);
在_LKeyboardProcHook和_LMouseProcHook这2个回调函数中根据需要过滤掉鼠标和键盘事件
f. 开机自动运行自己,"Software\Microsoft\Windows\CurrentVersion\Run"下增加一个键值"CmpMan=c:CmpMan.exe
评论