雙龍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
評論