雙龍13.56M射頻模塊在酒店公用電腦管理中的應(yīng)用
發(fā)送的數(shù)據(jù)
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 ”
卡號(hào)
CHECKSUM =15
讀二代身份證ID的指令:
0x1E:讀取二代身份證芯片ID 號(hào)命令
該命令用于讀取二代身份證卡的ID 號(hào)。
發(fā)送的數(shù)據(jù)
A6 06 F9 1E 05 05 00 00 5F
HEAD=A6
LENGTH=06
LEN_CHK =F9
COMMAND=1E
WAIT TIME=05(波特率設(shè)置值 0x0F 表示使用106K 進(jìn)行收發(fā)數(shù)據(jù))。
PARAMETER=05 00 00(TYPE B 卡ATQB 命令)。
CHECKSUM =5F
模塊返回的數(shù)據(jù)為:
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 號(hào)
01 ** ** 01 06 03 14 00 00 00 00 00 06 ** 10 70 ** 4B ** 8B ** ** AA **
86 18 ** 93 ** ** ** ”
(* 號(hào)部分為隱去的身份信息。返回的數(shù)據(jù)信息里面從第13 個(gè)字節(jié)開始的8 個(gè)字節(jié)的數(shù)據(jù)是身份證卡片的ID 號(hào))。
CHECKSUM =74
讀卡功能的步驟說明:
1.發(fā)送讀MIFARE ONE S50卡ID命令
參考代碼 ApdComPort1.PutBlock(ReadMOneCard, Length(ReadMOneCard));
2.如成功,則返回卡號(hào)數(shù)據(jù),結(jié)束;不成功則轉(zhuǎn)到步驟3
3.發(fā)送讀二代身份證的ID指令
參考代碼 ApdComPort1.PutBlock(ReadPersonCard, Length(ReadPersonCard));
4.如成功,則返回身份證卡號(hào)數(shù)據(jù),結(jié)束;不成功返回?zé)o卡,結(jié)束
其中發(fā)送數(shù)據(jù)的聲明如下
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);
編程中串口通訊實(shí)現(xiàn)使用了專用的串口控件TurboPower Async Professional包,發(fā)送串口數(shù)據(jù)使用了其中"串行端口"組件TApdComPort,接收串口數(shù)據(jù)使用了其中數(shù)據(jù)包組件TApdDataPacket,在TApdDataPacket組件的OnPacket事件中處理接收到的數(shù)據(jù),下面參考代碼說明如何提取卡號(hào)。
procedure TFormReadIDCard.ApdDPSuccS50Packet(Sender: TObject;
Data: Pointer; Size: Integer);
...
For i := 0 To 4-1 Do
begin
baCardID[i] := Buffer[i + 7];//從7開始的4個(gè)字節(jié)為卡號(hào)
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個(gè)字節(jié)為卡號(hào)
end;
鎖定電腦功能實(shí)現(xiàn):
a. 偽裝屏保狀態(tài), SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, TRUE, NULL, 0);
b. 禁止任務(wù)切換, SystemParametersInfo(SPI_SETFASTTASKSWITCH, FALSE, NULL, 0);
c. 禁止屏保運(yùn)行, SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE,0, SPIF_SENDWININICHANGE);
d. 禁止任務(wù)管理器, "Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr"設(shè)置這個(gè)鍵值為1
e. 鉤住所有鼠標(biāo)和鍵盤事件,
hLKeyboardProcHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC) _LKeyboardProcHook, hInstance, 0L);
hLMouseProcHook =SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC) _LMouseProcHook, hInstance, 0L);
在_LKeyboardProcHook和_LMouseProcHook這2個(gè)回調(diào)函數(shù)中根據(jù)需要過濾掉鼠標(biāo)和鍵盤事件
f. 開機(jī)自動(dòng)運(yùn)行自己,"Software\Microsoft\Windows\CurrentVersion\Run"下增加一個(gè)鍵值"CmpMan=c:CmpMan.exe
評(píng)論