我自己想做个会员辨认的软件给自己用,所以买了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;
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;
解决方案 »
- 高分求telnet源码,不用indy的idtelnet的。
- 簡單的SQL語法問題..
- 请问我如何在程序安装时在桌面上的 我的文件夹 中创建一个目录?
- 拿分!!!!!!!!!!!LY 请进入,,,,!!!!!!!!
- 菜鸟问题:关于线程。请各位高手帮帮忙。
- 我用dbexpress连接SQL SERVER数据库,测试显示已经成功,但在dataset的commandtext中找不到数据库表,请问高手如何操作。
- 连接Internet数据库服务器!
- 有方法解救该文件夹吗?
- Delphi并不是完美的化身!!
- LookUP查询后返回的值是什么呢?
- 怎么遍文件夹所有文件的MD5
- Android 用什么样的 图表控件
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;有点长,贴了前面的部分,
参数
ioRequest 这应该是操作的类型,读、写之类的
SendBuff 发送缓冲区
RecvBuff 接收缓冲区,接收返回的数据