我自己想做個會員辨認的軟體給自己用,所以買了ACR122 NFC的讀寫器. 里面的簡單例子有個函式,我覺得是讀寫的,但是例子運行后,自己實在找不出寫一個值進去,然后讀這個值,麻煩好心的老師給我看下這函式,教我寫一個數值進去,然后讀這個值.這函式百度里也可以找到,我就是看不懂. SCardTransmit 下面我復制它的代碼.
function SendAPDU(): integer;
var index: integer; tempstr: String;
begin
ioRequest.dwProtocol := dwActProtocol;
ioRequest.cbPciLength := sizeof(SCARD_IO_REQUEST);
tempstr := '';
for index := 0 to SendLen - 1 do
tempstr := tempstr + Format('%.02X ', [SendBuff[index]]);
DisplayOut(tempstr,3);
retCode := SCardTransmit(hCard,
@ioRequest,
@SendBuff,
SendLen,
Nil,
@RecvBuff,
@RecvLen);
if retcode <> SCARD_S_SUCCESS then begin
DisplayOut(GetScardErrMsg(retcode),2);
SendAPDU := retcode;
Exit;
end;
tempstr := '';
for index := 0 to RecvLen - 1 do
tempstr := tempstr + Format('%.02X ', [RecvBuff[index]]);
DisplayOut(tempstr, 4);
SendAPDU := retcode;
end;
uj5u.com熱心網友回復:
下面是整個例子的代碼.unit MiFareProg;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, AcsModule, StdCtrls, ComCtrls;
const MAX_BUFFER_LEN = 256;
type
TfrmMifare = class(TForm)
Label1: TLabel;
cbReader: TComboBox;
rbOutput: TRichEdit;
btnInit: TButton;
btnConnect: TButton;
LoadGroup: TGroupBox;
Label2: TLabel;
Label3: TLabel;
tbKeyNum: TEdit;
tbKeyVal1: TEdit;
tbKeyVal2: TEdit;
tbKeyVal3: TEdit;
tbKeyVal4: TEdit;
tbKeyVal5: TEdit;
tbKeyVal6: TEdit;
btnLoad: TButton;
AuthenGroup: TGroupBox;
Label4: TLabel;
Label5: TLabel;
KeyGroup: TGroupBox;
rKeyA: TRadioButton;
rKeyB: TRadioButton;
tbBlockNum: TEdit;
btnAuthen: TButton;
tbAuthenKeyNum: TEdit;
BinaryGroup: TGroupBox;
Label6: TLabel;
tbBinaryBlockNum: TEdit;
tbLen: TEdit;
Label7: TLabel;
Label8: TLabel;
tbData: TEdit;
tbRead: TButton;
tbUpdate: TButton;
ValueGroup: TGroupBox;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
tbValueBlockNum: TEdit;
tbSource: TEdit;
tbTarget: TEdit;
btnStore: TButton;
btnInc: TButton;
btnDec: TButton;
btnReadValue: TButton;
btnRestore: TButton;
tbValue: TEdit;
btnClear: TButton;
btnReset: TButton;
btnQuit: TButton;
procedure btnInitClick(Sender: TObject);
procedure btnConnectClick(Sender: TObject);
procedure tbKeyNumKeyPress(Sender: TObject; var Key: Char);
procedure tbKeyVal1KeyPress(Sender: TObject; var Key: Char);
procedure tbKeyVal2KeyPress(Sender: TObject; var Key: Char);
procedure tbKeyVal3KeyPress(Sender: TObject; var Key: Char);
procedure tbKeyVal4KeyPress(Sender: TObject; var Key: Char);
procedure tbKeyVal5KeyPress(Sender: TObject; var Key: Char);
procedure tbKeyVal6KeyPress(Sender: TObject; var Key: Char);
procedure btnLoadClick(Sender: TObject);
procedure btnAuthenClick(Sender: TObject);
procedure tbReadClick(Sender: TObject);
procedure tbUpdateClick(Sender: TObject);
procedure btnStoreClick(Sender: TObject);
procedure btnReadValueClick(Sender: TObject);
procedure btnIncClick(Sender: TObject);
procedure btnDecClick(Sender: TObject);
procedure btnRestoreClick(Sender: TObject);
procedure btnQuitClick(Sender: TObject);
procedure btnClearClick(Sender: TObject);
procedure btnResetClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMifare: TfrmMifare;
hContext : SCARDCONTEXT;
hCard : SCARDCONTEXT;
ioRequest : SCARD_IO_REQUEST;
retCode : Integer;
dwActProtocol, BufferLen : DWORD;
SendBuff, RecvBuff : array [0..262] of Byte;
SendLen, RecvLen, nBytesRet : DWORD;
Buffer : array [0..MAX_BUFFER_LEN] of char;
ATRVal : array [0..128] of byte;
ATRLen : ^DWORD;
implementation
{$R *.dfm}
procedure DisplayOut(output: String; mode: integer);
begin
case mode of
1: frmMifare.rbOutput.SelAttributes.Color := clBlue;
2: frmMifare.rbOutput.SelAttributes.Color := clRed;
3: begin
frmMifare.rbOutput.SelAttributes.Color := clBlack;
output := '<< ' + output;
end;
4: begin
frmMifare.rbOutput.SelAttributes.Color := clBlack;
output := '>> ' + output;
end;
end;
frmMifare.rbOutput.Lines.Add(output);
frmMifare.rbOutput.SelAttributes.Color := clBlack;
frmMifare.rbOutput.SetFocus;
end;
procedure ClearBuffers();
var index: integer;
begin
for index := 0 to 262 do
begin
SendBuff[index] := $00;
RecvBuff[index] := $00;
end;
end;
function SendAPDU(): integer;
var index: integer; tempstr: String;
begin
ioRequest.dwProtocol := dwActProtocol;
ioRequest.cbPciLength := sizeof(SCARD_IO_REQUEST);
tempstr := '';
for index := 0 to SendLen - 1 do
tempstr := tempstr + Format('%.02X ', [SendBuff[index]]);
DisplayOut(tempstr,3);
retCode := SCardTransmit(hCard,
@ioRequest,
@SendBuff,
SendLen,
Nil,
@RecvBuff,
@RecvLen);
if retcode <> SCARD_S_SUCCESS then begin
DisplayOut(GetScardErrMsg(retcode),2);
SendAPDU := retcode;
Exit;
end;
tempstr := '';
for index := 0 to RecvLen - 1 do
tempstr := tempstr + Format('%.02X ', [RecvBuff[index]]);
DisplayOut(tempstr, 4);
SendAPDU := retcode;
end;
procedure Initialize();
begin
frmMifare.btnInit.Enabled := true;
frmMifare.btnConnect.Enabled := false;
frmMifare.LoadGroup.Enabled := false;
frmMifare.AuthenGroup.Enabled := false;
frmMifare.BinaryGroup.Enabled := false;
frmMifare.ValueGroup.Enabled := false;
frmMifare.rKeyA.Checked := true;
frmMifare.cbReader.Clear;
frmMifare.tbKeyNum.Text := '';
frmMifare.tbKeyVal1.Text := '';
frmMifare.tbKeyVal2.Text := '';
frmMifare.tbKeyVal3.Text := '';
frmMifare.tbKeyVal4.Text := '';
frmMifare.tbKeyVal5.Text := '';
frmMifare.tbKeyVal6.Text := '';
frmMifare.tbBlockNum.Text := '';
frmMifare.tbAuthenKeyNum.Text := '';
frmMifare.tbBinaryBlockNum.Text := '';
frmMifare.tbAuthenKeyNum.Text := '';
frmMifare.tbData.Text := '';
frmMifare.tbValue.Text := '';
frmMifare.tbValueBlockNum.Text := '';
frmMifare.tbSource.Text := '';
frmMifare.tbTarget.Text := '';
frmMifare.rbOutput.Clear;
DisplayOut('Program ready', 1);
end;
procedure TfrmMifare.btnInitClick(Sender: TObject);
var index: integer;
begin
//Establish context
retCode := SCardEstablishContext(SCARD_SCOPE_USER,
nil,
nil,
@hContext);
if retCode <> SCARD_S_SUCCESS then begin
displayout(GetScardErrMsg(retcode),2);
Exit;
end ;
//List PC/SC readers installed in the system
BufferLen := MAX_BUFFER_LEN;
retCode := SCardListReadersA(hContext,
nil,
@Buffer,
@BufferLen);
if retCode <> SCARD_S_SUCCESS then begin
DisplayOut(getscarderrmsg(retCode),2);
Exit;
end;
btnInit.Enabled := false;
btnConnect.Enabled := true;
LoadListToControl(cbReader,@buffer,bufferLen);
// Look for ACR128 PICC and make it the default reader in the combobox
for index := 0 to cbReader.Items.Count-1 do begin
cbReader.ItemIndex := index;
if AnsiPos('ACR122U PICC', cbReader.Text) > 0 then
Exit;
end;
cbReader.ItemIndex := 0;
end;
procedure TfrmMifare.btnConnectClick(Sender: TObject);
begin
//Connect to reader using a shared connection
retCode := SCardConnectA(hContext,
PChar(cbReader.Text),
SCARD_SHARE_SHARED,
SCARD_PROTOCOL_T0 or SCARD_PROTOCOL_T1,
@hCard,
@dwActProtocol);
if retcode <> SCARD_S_SUCCESS then begin
displayout(GetScardErrMsg(retcode),2)
end
else begin
displayout('Successful connection to ' + cbReader.Text, 1)
end;
frmMifare.btnConnect.Enabled := false;
frmMifare.LoadGroup.Enabled := true;
frmMifare.AuthenGroup.Enabled := true;
frmMifare.BinaryGroup.Enabled := true;
frmMifare.ValueGroup.Enabled := true;
end;
procedure TfrmMifare.tbKeyNumKeyPress(Sender: TObject; var Key: Char);
begin
if Key <> chr($08) then begin
if Not (Key in ['0'..'9'])then
Key := Chr($00);
end;
end;
procedure TfrmMifare.tbKeyVal1KeyPress(Sender: TObject; var Key: Char);
begin
if Key <> chr($08) then begin
if Key in ['a'..'z'] then
Dec(Key, 32);
if Not (Key in ['0'..'9', 'A'..'F'])then
Key := Chr($00);
end;
end;
procedure TfrmMifare.tbKeyVal2KeyPress(Sender: TObject; var Key: Char);
begin
if Key <> chr($08) then begin
if Key in ['a'..'z'] then
Dec(Key, 32);
if Not (Key in ['0'..'9', 'A'..'F'])then
Key := Chr($00);
end;
end;
procedure TfrmMifare.tbKeyVal3KeyPress(Sender: TObject; var Key: Char);
begin
if Key <> chr($08) then begin
if Key in ['a'..'z'] then
Dec(Key, 32);
if Not (Key in ['0'..'9', 'A'..'F'])then
Key := Chr($00);
end;
end;
procedure TfrmMifare.tbKeyVal4KeyPress(Sender: TObject; var Key: Char);
begin
if Key <> chr($08) then begin
if Key in ['a'..'z'] then
Dec(Key, 32);
if Not (Key in ['0'..'9', 'A'..'F'])then
Key := Chr($00);
end;
end;
procedure TfrmMifare.tbKeyVal5KeyPress(Sender: TObject; var Key: Char);
begin
if Key <> chr($08) then begin
if Key in ['a'..'z'] then
Dec(Key, 32);
if Not (Key in ['0'..'9', 'A'..'F'])then
Key := Chr($00);
end;
end;
有點長,貼了前面的部分,
uj5u.com熱心網友回復:
求幫忙.謝謝 各位老師uj5u.com熱心網友回復:
api里都有sample code了 建議你先去讀apiuj5u.com熱心網友回復:
主要功能應該就是這個SCardTransmit,引數
ioRequest 這應該是操作的型別,讀、寫之類的
SendBuff 發送緩沖區
RecvBuff 接識訓沖區,接識訓傳的資料
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/82147.html
標籤:語言基礎/算法/系統設計
下一篇:分布式系統中的CAP理論
